第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中