Bootstrap

iText 简介

iText 简介

iText 是业界使用最为广泛的创建 PDF 的框架,从 iText 5 升级到 iText 7 后,功能模块的划分更加清晰,两者在使用上,有较为明显的区别。

使用 Maven 管理工具引入两者的代码如下:

<dependency>
	<groupId>com.itextpdf</groupId>
	<artifactId>itext7-core</artifactId>
	<version>7.1.11</version>
	<type>pom</type>
</dependency>

<dependency>
	<groupId>com.itextpdf</groupId>
	<artifactId>itextpdf</artifactId>
	<version>5.5.13.1</version>
</dependency>

实际上,对于版本 5 而言,许多模块相互混杂,引入的一些类并不会用到,而版本 7 则对多个功能进行了细致的划分,如签名,亚洲地区的字体支持,二维码,输入输出等,所以使用 iText 7 时,可以根据需要移出用不到的依赖包。访问官网,获取更多信息。


在版本 5 中的使用:

import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;

public class App1 {
	 public static void main( String[] args )
	    {
	        try {
				String filePath = "/temp/test1.pdf";
				File file = new File(filePath);
				
				Document document = new Document();
				
				OutputStream os = new FileOutputStream(file);
				
				PdfWriter writer = PdfWriter.getInstance(document, os);
				
				document.setPageSize(PageSize.A4);
				
				Paragraph p = new Paragraph();
				p.add("aa");
				
				document.open();
				document.add(p);
				document.close();
				
			} catch (Exception e) {
				e.printStackTrace();
				
			}
	    }
}

通过 PdfWriter 的类方法 getInstanceDocument 实例同文件输出流联系起来,实际上起作用的是内部方法中创建的 Document 的子类 PdfDocument

在执行 document.add(p); 方法时,实际上也是向 PdfDocument 实例中添加了实现 Element 接口的类对象。


在版本 7 中使用:

import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.List;
import com.itextpdf.layout.element.Paragraph;
 
public class App2
{
    public static void main( String[] args )
    {    
        try {
			String filePath = "/temp/test2.pdf";
			File file = new File(filePath);
			
			PdfWriter writer = new PdfWriter(file);
			
			PdfDocument document = new PdfDocument(writer);
			document.setDefaultPageSize(PageSize.A4);
			
			Document doc = new Document(document);
			
			doc.add(new Paragraph("Hello World!"));
			
			List list = new List();
			list.setListSymbol("+");
			list.setMarginTop(20);
			list.add("a");
			list.add("b");
			list.add("c");
			doc.add(list);
			
			doc.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
    }
}

从类的分布来看,PdfDocumentPdfWriter 同属于 kernel 核心包,而 Document 则被分到了 layout 布局包中。并且,PdfDocument 不再是 Document 的子类。

同样,诸如 ParagraphListTable 等类,都是 BlockElement 的子类,并同属于 layout.element 包。这样设计的好处是向 PDF 中添加的元素的相同属性得以抽象出来,如他们的宽高、内外边距等,这同 HTML5 中的盒模型十分相似。

iText 7 相较于 iText 5 的优化和调整很多,但是,创建 PDF 文档的思路确实不变的,我们总是先创建一个文档输出流,并将其同 Document 关联起来,而后,再通过 Document 向文档中添加各种文本、图片、表格等信息。

详细使用方法可以参考 CuteKe的专栏 或者直接官方网站中的书籍

;