如何使用Java生成PDF文件

如何使用Java生成PDF文件

1 Java PDF主流的生成方式

名称点击次数描述
iText6353iText是一个能够快速产生PDF文件的java类库。iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的。它的类库尤其与java Servlet有很好的给合。使用iText与PDF能够使你正确的控制Servlet的输出。
PDF Box1958PDFBox是一个Apache开源的项目。可以操作PDF文档的Java PDF类库。它可以创建一个新PDF文档,操作现有PDF文档并提取文档中的内容。
JFreeReport2146JFreeReport的数据继承自Swing组件的TableModel接口。JFreeReport生成的报表可以分页预览、打印或者保存为多种格式的文件包括pdf、Excel、html等。
PJX1214PJX支持读取,组合,处理,和生成PDF文档(注意:PJX需要 J2SE 1.4.0 或更高版本)。
FOP912FOP是由James Tauber发起的一个开源项目,原先的版本是利用xsl-fo将xml文件转换成pdf文件。但最新的版本它可以将xml文件转换成pdf,mif,pcl,txt等多种格式以及直接输出到打印机,并且支持使用SVG描述图形
gnujpdf782gnujpdf是一个java类包(gnu.jpdf.*),它提供了一个简单的API来创建与打印PDF文件。遵循LGPL开源协议
Connla986Connla是一个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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值