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
的类方法 getInstance
将 Document
实例同文件输出流联系起来,实际上起作用的是内部方法中创建的 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();
}
}
}
从类的分布来看,PdfDocument
和 PdfWriter
同属于 kernel
核心包,而 Document
则被分到了 layout
布局包中。并且,PdfDocument
不再是 Document
的子类。
同样,诸如 Paragraph
、List
、Table
等类,都是 BlockElement
的子类,并同属于 layout.element
包。这样设计的好处是向 PDF 中添加的元素的相同属性得以抽象出来,如他们的宽高、内外边距等,这同 HTML5 中的盒模型十分相似。
iText 7 相较于 iText 5 的优化和调整很多,但是,创建 PDF 文档的思路确实不变的,我们总是先创建一个文档输出流,并将其同 Document
关联起来,而后,再通过 Document
向文档中添加各种文本、图片、表格等信息。