您的当前位置:首页正文

PDF组件iText

2020-02-11 来源:汇智旅游网


第40章 PDF组件iText

第40章 PDF组件iText

本章将学习Java的PDF开源框架iText。通过实际的编程例子来学习如何生成pdf文档,包括设置pdf属性、在文档中显示格式化文本、显示图表、显示图像等。完成本章的学习后,可以运用这些基本知识将数据转化成pdf文件。

40.1 下载iText组件

iText组件是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个Java类库。通过iText不仅可以生成pdf或rtf的文档,而且可以将XML、Html文件转化为pdf文件。iText的官方网址是http://www.lowagie.com/iText/,如图40.1所示。

图40.1 iText官方主页

在项目主页http://sourceforge.net/projects/itext/中单击“Download ”链接,下载最新版本的iText类库。下载完成之后会得到一个iText-2.1.2u.jar包,运行程序时把这个包加入类路径中即可。

如果生成的PDF文件中需要出现中文、日文、韩文字符,则还需要下载iTextAsian.jar包,运行时也将其导入到类路径中。

·895·

第8篇 工具篇

40.2 输出pdf的基本步骤

pdf文档输出有一个基本的框架。首先看下面这个程序,它用iText生成一个简单的pdf文档,代码如下:

代码40.1 FirstPDF.java

package com.helloweenvsfei.itext; import java.io.FileOutputStream; import com.lowagie.text.Document; import com.lowagie.text.PageSize; import com.lowagie.text.Paragraph;

import com.lowagie.text.pdf.PdfWriter; public class FirstPDF { public static void main(String[] args) { // 创建文档对象,A4纸大小 Document document = new Document(PageSize.A4); try { // 输出为E:\\itext.pdf文件 PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(\"E:\\\\itext.pdf \")); // 打开文档

document.open(); // 在pdf文件中写入文字 document.add(new Paragraph(\"Hello World, Hello iText\")); // 关闭文档

document.close(); } catch (Exception e) {

e.printStackTrace(); } } }

该程序运行后,将在E盘的根目录下生成一个itext.pdf文件,该pdf文件打开后,效果如图40.2所示。

图40.2 iText生成的pdf文件

·896 ·

第40章 PDF组件iText

通过以上的程序,总结出使用iText生成一个pdf的步骤如下: (1)创建Document对象。

Document document = new Document();

其中,Document有3个构造方法,如下:

󰂉 public Document(); 󰂉 public Document(Rectangle pageSize); 󰂉 public Document(Rectangle pageSize,int marginLeft,int marginRight,int marginTop,int

marginBottom)。

pageSize是纸张类型的大小,通常可以使用PageSize中的常量来表示,例如PageSize.A4表示A4纸张。marginLeft、marginRight、marginTop和marginBottom分别是正文距离页边的左、右、上、下的补白大小。

(2)创建书写器(Writer)与document对象关联,通过书写器可以将文档写入磁盘中。

(3)打开文档。

PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream (\"E:\\\\itext.pdf \"));

(4)写入文档内容。

document.open();

写入的文档内容可以是多种类型,这里是带格式的文本Paragraph,还可以是Phrase、Paragraph、Table、Graphic对象等。

(5)关闭文档。

document.close();

document.add(new Paragraph(\"Hello iText\"));

通过以上5个步骤,就可以生成pdf文档了。

40.3 设置pdf文件属性

在打开Document对象写入内容之前,可以设置文档的属性,包括文档的标题、主题、作者、关键字、装订方式、创建者、生产者、创建日期等,方法如以下:

󰂉 public boolean addTitle(String title):设置标题; 󰂉 public boolean addSubject(String subject):设置主题; 󰂉 public boolean addKeywords(String keywords):设置关键字; 󰂉 public boolean addAuthor(String author):设置作者; 󰂉 public boolean addCreator(String creator):设置创建者; 󰂉 public boolean addProducer():设置生产者; 󰂉 public boolean addCreationDate():设置创建日期; 󰂉 public boolean addHeader(String name, String content):设置文件夹信息。 其中方法addHeader()对于pdf文档无效,addHeader()仅对html文档有效,用于添加文

·897·

第8篇 工具篇

档的头信息。例如以下是设置了文档属性的代码:

// 创建文档对象,A4纸大小 Document document = new Document(PageSize.A4); try { // 输出为E:\\itext.pdf文件 PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(\"E:\\\\itext.pdf \")); //设置文档作者

document.addAuthor(\"Helloween\"); //设置文档标题 document.addTitle(\"This is itext pdf file\"); //设置主题

document.addSubject(\"First pdf\"); //设置关键字

document.addKeywords(\"iText\");

// 打开文档

document.open(); // 在pdf文件中写入文字 document.add(new Paragraph(\"Hello World, Hello iText\")); // 关闭文档

document.close(); } catch (Exception e) {

e.printStackTrace(); }

设置属性后,在生成的pdf文件上右击,在弹出的快捷菜单中选择“属性”选项,将弹出文档属性对话框,如图40.3所示,在这里可以查看程序中设置的文档属性。

图40.3 查看pdf文档属性

·898 ·

第40章 PDF组件iText

40.4 插 入 文 本

iText中用文本块(Chunk)、短语(Phrase)和段落(Paragraph)处理文本: 󰂉 文本块是处理文本的最小单位,由一串带格式(包括字体、颜色、大小)的字符

串组成。 󰂉 短语由一个或多个文本块组成,短语也可以设定字体,但对于其中已设定过字体

的文本块无效。 󰂉 段落由一个或多个文本块或短语组成,相当于Word文档中的段落概念,同样可以

设定段落的字体大小、颜色等属性。另外也可以设定段落的首行缩进、对齐方式(左对齐、右对齐、居中对齐)。

这里最常用的是Paragraph对象,所以着重讲述该对象的使用方法。首先看下面一段程序,将一段文本设置了字体、大小和颜色等属性,代码如下:

运行程序后,生成的pdf显示的效果如图40.4所示,可以看到第二行文字设置了字体并增加了加粗倾斜的格式。

document.open(); //在pdf文件中写入文字

document.add(new Paragraph(\"Hello iText\")); //设置字体的文字

document.add(new Paragraph(\"Hello World, Hello iText\(FontFactory.COURIER, 12, Font.BOLDITALIC)));//关闭文档 document.close();

图40.4 带格式的文本

除了字体外,还可以设置段落的缩进等属性,这些方法如下: 󰂉 public void setAlignment(int alignment):设置对齐方式,1为居中对齐,2为右对齐,

3为左对齐,默认为左对齐。 󰂉 public void setFirstLineIndent(float firstLineIndent):设置首行缩进。 󰂉 public void setSpacingBefore(float spacing):设置段前距。

·899·

第8篇 工具篇

󰂉 public void setSpacingAfter(float spacing):设置段后距。

40.5 文本的中文处理

默认的iText字体设置不支持中文字体,如果在pdf中使用了中文字符,需要下载亚洲语言字体包iTextAsian.jar。通过下面的代码就可以在文档中显示中文了。

// 创建中文字体

BaseFont bfChinese = BaseFont.createFont(\"STSong-Light\BaseFont.NOT_EMBEDDED);

Font FontChinese = new Font(bfChinese, 12, Font.NORMAL); // 设置为中文

Paragraph pragraph=new Paragraph(\"你好,这是中文\document.add(pragraph);

程序运行后,效果如图40.5所示。

图40.5 显示中文的pdf文件

40.6 插 入 表 格

iText中处理表格的类为com.lowagie.text.Table和com.lowagie.text.PDF.PDFPTable两个。对于比较简单的表格处理可以用Table类;但是如果要处理复杂的表格,就需要使用PDFPTable进行处理。这里就详细讲解如何使用Table。

首先看以下一段小程序,显示的为一个2行3列的表格,代码如下:

// 创建2行3列的表

Table table = new Table(3, 2); // 设置表格边框颜色

table.setBorderColor(new Color(220, 100, 100)); // 设置表格边距

table.setPadding(5); // 设置表格间距

table.setSpacing(3); // 设置表格线条宽度

table.setBorderWidth(3); ·900 ·

第40章 PDF组件iText

// 创建单元格对象

Cell cell = new Cell(\" Header 1 \"); // 将单元格添加到表格中 table.addCell(cell);

cell = new Cell(\" Header 2 \"); // 设置单元格占2列 cell.setColspan(2); table.addCell(cell); // 将普通文本添加到表格中

table.addCell(\" Cell 1 \"); table.addCell(\" Cell 2 \"); table.addCell(\" Cell 3 \"); // 将表格添加到文档中 document.add(table);

代码运行后,生成的pdf表格的效果如图40.6所示。

图40.6 pdf表格

在使用com.lowagie.text.Table类时需要注意以下几个问题: (1)Table的构造函数有3个: 󰂉 Table (int columns); 󰂉 Table(int columns, int rows); 󰂉 Table(Properties attributes)。

参数columns、rows、attributes分别为表格的列数、行数、表格属性。创建表格时必须指定表格的列数,而对于行数可以不用指定,默认行数为1。

(2)往表格中添加单元格(cell)时,按自左向右、从上而下的次序添加。使用addCell()方法添加单元格。

(3)对于复杂的表格,可以设置单元格的合并列cell.setColspan(2)和合并行cell.Rowspan(2)。类似html中

的使用。

40.7 插 入 图 像

iText中处理表格的类为com.lowagie.text.Image,目前iText支持的图像格式有GIF、Jpeg、PNG、wmf等格式。对于不同的图像格式,iText用同样的构造函数自动识别图像格

·901·

第8篇 工具篇

式。以下代码为在pdf中生成图片的代码:

// 打开文档

document.open();

// 创建图片对象,参数为图片的文件名

Image bmp = Image.getInstance(\"E:\\\\ Java_logo.jpg\"); // 缩小到原来的25%

bmp.scalePercent(25f); document.add(bmp); // 关闭文档

document.close();

代码运行后,效果如图40.7所示。

图40.7 pdf图像

创建Image对象后,还可以设置一些常用的属性,这些属性有:

(1)设置图像的位置:public void setAlignment(int alignment),其中alignment可使用Image类中的常量。

󰂉 Image.RIGHT、Image.MIDDLE、Image.LEFT分别指右对齐、居中、左对齐。 󰂉 Image.TEXTWRAP、Image.UNDERLYING分别指文字绕图形显示、图形作为文字

的背景显示。

󰂉 这两种参数可以结合以达到预期的效果,如setAlignment(Image.RIGHT|Image.

TEXTWRAP)显示的效果为图像右对齐,文字围绕图像显示。 (2)设置图像的大小,方法分别有:

󰂉 public void scaleAbsolute(int newWidth, int newHeight):设置图片的宽和高。 󰂉 public void scalePercent(int percent):设置缩放比例,如scalePercent(50)表示显示的

大小为原尺寸的50%。

󰂉 public void scalePercent(int percentX, int percentY) :设置长和宽的缩放比例。 (3)设置图像旋转:public void setRotation(double r),其中r为弧度,如果旋转角度为30度,则参数r= Math.PI / 6。

·902 ·

第40章 PDF组件iText

40.8 在Servlet中输出pdf

在Java Web应用中,通常可以访问某个Servlet来查看pdf 文件,通过Servlet读取pdf文件的步骤如下:

(1)在web.xml中配置Servlet,代码如下:

代码40.2 web.xml

PDFServlet

com.helloweenvsfei.itext.PDFServlet

PDFServlet /pdf

(2)对应的Servlet代码如下:

代码40.3 PDFServlet.java

package com.helloweenvsfei.itext;

import java.io.ByteArrayOutputStream; import java.io.IOException;

import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.lowagie.text.Document; import com.lowagie.text.PageSize; import com.lowagie.text.Paragraph;

import com.lowagie.text.pdf.PdfWriter;

public class PDFServlet extends HttpServlet { private static final long serialVersionUID = -1770041214313726403L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); }

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 创建文档对象,A4纸大小 Document document = new Document(PageSize.A4); ByteArrayOutputStream stream = new ByteArrayOutputStream(); try { PdfWriter writer = PdfWriter.getInstance(document, stream); // 打开文档

document.open(); // 在pdf文件中写入文字 document.add(new Paragraph(\"Hello World, Hello iText\")); // 关闭文档

·903·

第8篇 工具篇

document.close(); } catch (Exception e) {

e.printStackTrace(); } // 设置响应文档类型为pdf

response.setContentType(\"application/pdf\"); // 设置响应数据大小

response.setContentLength(stream.size()); // 获得响应数据流 ServletOutputStream out = response.getOutputStream(); // 将pdf数据流写入响应数据流中 stream.writeTo(out); out.flush(); out.close(); } }

通过以上代码,总结出访问Servlet读取pdf需要注意以下几点: 󰂉 需要设置响应类型为application/pdf,代码如下:

response.setContentType(\"application/pdf\");

󰂉 需要将生成的pdf数据流写入响应客户端数据流中。

40.9 本 章 小 结

本章首先讲述了iText基础知识,包括iText的下载。接着又详细介绍了如何利用iText

生成pdf文件等,包括在pdf文件中插入文本、插入表格、插入图像以及中文字符的处 理等。

除了本章介绍的这些知识外,iText还可以输出XML文档、复杂rtf文档等,由于这些类型的文件通常使用的不多,所以本章不做详细介绍,读者若感兴趣,可参阅其参考 文档。

·904 ·

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 版权所有