如何使用Java生成PDF文件
1 Java PDF主流的生成方式
名称 | 点击次数 | 描述 |
---|---|---|
iText | 6353 | iText是一个能够快速产生PDF文件的java类库。iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的。它的类库尤其与java Servlet有很好的给合。使用iText与PDF能够使你正确的控制Servlet的输出。 |
PDF Box | 1958 | PDFBox是一个Apache开源的项目。可以操作PDF文档的Java PDF类库。它可以创建一个新PDF文档,操作现有PDF文档并提取文档中的内容。 |
JFreeReport | 2146 | JFreeReport的数据继承自Swing组件的TableModel接口。JFreeReport生成的报表可以分页预览、打印或者保存为多种格式的文件包括pdf、Excel、html等。 |
PJX | 1214 | PJX支持读取,组合,处理,和生成PDF文档(注意:PJX需要 J2SE 1.4.0 或更高版本)。 |
FOP | 912 | FOP是由James Tauber发起的一个开源项目,原先的版本是利用xsl-fo将xml文件转换成pdf文件。但最新的版本它可以将xml文件转换成pdf,mif,pcl,txt等多种格式以及直接输出到打印机,并且支持使用SVG描述图形 |
gnujpdf | 782 | gnujpdf是一个java类包(gnu.jpdf.*),它提供了一个简单的API来创建与打印PDF文件。遵循LGPL开源协议 |
Connla | 986 | Connla是一个Java包用于创建可导成TXT,CSV,HTML,XHTML,XML,PDF和XLS等格式的数据集。 |
iText 2 以上版本有一个许可协议APGL
- 如果你项目用到了iText系列产品,而且你把你的项目用于商业用途,那么你就需要向iText公司申请授权费了。
- 除了上述情况,那么都是开源的,只要是个人用途或者源码公开项目,那么你都可以免费试用iText产品
默认的iText字体设置不支持中文字体,需要下载字体包iTextAsian.jar,否则不能往PDF文档中输出中文字体。
2 简单的用法
2.1 如何创建一个文件
// 创建一个流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(BYTE_ARRAY_SIZE);
// 创建一个document
Document document = new Document();
// 设置页面大小
document.setPageSize(PageSize.A4);
// 打开书写器,书写器(Writer)与文档对象(document)关联,通过书写器将文档写入磁盘
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
// 设置页眉(设置页眉页脚必须在打开书写器之后,打开document之前)
document.setHeader(null);
// 设置页脚
document.setFooter(null);
// 设置页边距
document.setMargins(90, 90, 72, 72);
// 打开document
document.open();
// 新增一个段落一段文本
document.add(new Paragraph("PDF demo"));
// 关闭文档
document.close();
//把文件流写入磁盘
FileOutputStream fos = new FileOutputStream("D:\\TEST.pdf");
fos.write(outputStream.toByteArray());
fos.close();
2.2 写一段文本
IText中用文本块(Chunk)、短语(Phrase)和段落(paragraph)处理文本。文本块(Chunk)是处理文本的最小单位,有一串带格式(包括字体、颜色、大小)的字符串组成。如以下代码就是产生一个字体为宋体、大小为14、加粗的字符串:
// 创建一个字体
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font font = new Font(bfChinese, 14 ,Font.BOLD);
// 创建一个文本块
Chunk chunk1 = new Chunk("我叫", font);
Chunk chunk2 = new Chunk("XXX。", font);
短语(Phrase)由一个或多个文本块(Chunk)组成,短语(Phrase)也可以设定字体,但对于其中以设定过字体的文本块(Chunk)无效。通过短语(Phrase)成员函数add可以将一个文本块(Chunk)加到短语(Phrase)中,如:phrase.add(chunk);
// 创建一个字体
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font font = new Font(bfChinese, 14 ,Font.BOLD);
// 创建一个短语
Phrase phrase = new Phrase();
// 添加两个文本块
phrase.add(chunk1);
phrase.add(chunk2);
段落(paragraph)由一个或多个文本块(Chunk)或短语(Phrase)组成
相当于WORD文档中的段落概念,同样可以设定段落的字体大小、颜色等属性。
另外也可以设定段落的首行缩进、对齐方式(左对齐、右对齐、居中对齐)。
// 创建一个字体
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font font = new Font(bfChinese, 14 ,Font.BOLD);
// 创建一个文本块
Paragraph paragraph= new Paragraph("大家上午好,", font);
// 设置段落对齐方式
paragraph.setAlignment(Element.ALIGN_LEFT);
// 添加一个短语
paragraph.add(phrase);
// 把段落添加到整个文档
document.add(paragraph);
这样就可以使用三级格式构造出具有复杂文本格式的一个段落
写一个表格
// 指定列宽度比例数组
float[] LOAN_TABLE_WITHS = {20, 15, 15, 15, 12, 12, 12};
// 创建一个字体
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", Font.BOLD);
Font font = new Font(bfChinese, 14 ,Font.BOLD);
// 新建表格,并指定列宽度比例数组
PdfPTable table = new PdfPTable(LOAN_TABLE_WITHS);
// 表格的宽度为100%
table.setWidthPercentage(100);
// 表格位置,默认居左
table.setHorizontalAlignment();
table.getDefaultCell().setBorder(1);
for (Map.Entry<String, String> head : headerMap.entrySet()) {
PdfPCell cell = new PdfPCell();
// 垂直位置
cell.setVerticalAlignment(horiAlign);
// 水平位置
cell.setHorizontalAlignment(align);
cell.setPhrase(new Phrase(head.getValue(), font));
// 显示表头
table.addCell(cell));
}
// 添加数据
for (Map<String, String> dataMap : listDataMap) {
for (int i = 0; i < LOAN_TABLE_WITHS.size(); i++) {
//每一个单元格添加数据
}
}
// 添加表格到document
document.add(table);
3 其他的强大功能
iText具有丰富的文档和官方教程资源,具有以下功能:
-
Unicode文本提取
-
PDF文档拼接/分离
-
从PDF表单里面提取数据/数据填充表单
-
使用标准Java打印API打印PDF文档
-
另存为图片文件,如PNG、JPEG
-
使用内嵌字体和图片从头创建PDF
-
电子签名PDF文件
-
iText与Servlet结合很好
-
自动化的文档处理,例如从XML,HTML,web表单,CSS或者数据库转换成PDF
-
文档更加安全
-
丰富的插件,各个插件对于一个开源项目,可以访问iText GitHub