Java生态中,PDF文件生成一直是企业应用开发中的常见需求,例如电子合同、报表导出、发票打印、数据归档、业务凭证生成等场景。由于PDF格式具有跨平台、稳定性强、不易被修改等特点,越来越多的Java项目选择使用专业PDF处理库完成文档创建。
iText作为Java领域应用广泛的PDF处理框架,提供了丰富的API,可以帮助开发者快速实现PDF文件创建、文字写入、图片插入、表格生成、样式控制以及数字签名等功能。通过合理使用iText,可以构建满足复杂业务需求的PDF生成方案。
iText简介与版本选择
iText是一款开源PDF开发库,最早主要服务于Java平台,后来逐渐扩展到其他语言环境。它提供底层PDF操作能力,使开发人员能够通过代码动态生成PDF文档。
目前常用版本主要包括:
-
iText 5:经典版本,API简单成熟,很多旧项目仍在使用。
-
iText 7:新版架构,模块化设计更合理,性能和扩展能力更强。
对于新项目开发,通常更推荐使用iText 7。它对PDF标准支持更加完善,并且提供了更灵活的布局管理能力。
本文以iText 7为例介绍Java生成PDF文件的完整流程。
Maven引入iText依赖
使用iText 7生成PDF,需要先添加相关依赖。
XMLcom.itextpdf kernel 7.2.5 com.itextpdf layout 7.2.5
其中:
-
kernel模块负责PDF底层对象操作。
-
layout模块提供高级布局功能,例如段落、表格、图片等。
如果项目需要处理中文字体,还需要额外引入字体相关模块。
XMLcom.itextpdf font-asian 7.2.5
创建第一个PDF文件
使用iText生成PDF的基本流程非常简单:
-
创建PDF文档对象。
-
添加内容。
-
关闭文档释放资源。
示例代码:
Javaimport com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.Paragraph; public class PdfCreateDemo { public static void main(String[] args) throws Exception { String filePath = "demo.pdf"; PdfWriter writer = new PdfWriter(filePath); PdfDocument pdfDocument = new PdfDocument(writer); Document document = new Document(pdfDocument); document.add(new Paragraph("Hello iText PDF")); document.close(); System.out.println("PDF生成成功"); } }
运行程序后,会在指定目录生成demo.pdf文件。
这里的核心对象包括:
PdfWriter
负责将PDF内容写入文件。
PdfDocument
代表PDF文档本身,可以控制页面、元数据等底层信息。
Document
属于高级布局层,用于添加文本、图片、表格等内容。
Java生成PDF中文乱码解决方案
PDF开发中最容易遇到的问题就是中文乱码。
默认情况下,iText不会自动加载中文字体,因此直接写入中文可能出现空白或者乱码。
解决方式是加载系统字体或项目中的字体文件。
示例:
Javaimport com.itextpdf.io.font.PdfEncodings; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.font.PdfFont; PdfFont font = PdfFontFactory.createFont( "C:/Windows/Fonts/simsun.ttc,0", PdfEncodings.IDENTITY_H );
然后设置字体:
JavaParagraph paragraph = new Paragraph("Java生成中文PDF测试"); paragraph.setFont(font); document.add(paragraph);
常见中文字体:
-
Windows:宋体、微软雅黑。
-
Linux:Noto Sans CJK。
-
项目部署环境:建议将字体文件随项目一起打包。
这样可以避免服务器环境变化导致PDF显示异常。
设置PDF文字样式
实际业务中,PDF通常需要设置标题、正文、颜色、大小等格式。
例如:
JavaParagraph title = new Paragraph("用户信息报告"); title.setFontSize(20); document.add(title);
设置字体:
Javaparagraph.setFont(font); paragraph.setFontSize(12);
设置文本对齐:
Javaparagraph.setTextAlignment(TextAlignment.CENTER);
常见样式控制包括:
-
字体大小。
-
字体类型。
-
粗体效果。
-
文本颜色。
-
对齐方式。
-
行间距。
合理使用样式,可以生成更加专业的PDF文档。
使用iText生成PDF表格
报表类PDF通常离不开表格。
iText提供Table组件,可以快速创建结构化数据。
示例:
JavaTable table = new Table(3); table.addCell("编号"); table.addCell("姓名"); table.addCell("年龄"); table.addCell("1"); table.addCell("张三"); table.addCell("25"); table.addCell("2"); table.addCell("李四"); table.addCell("30"); document.add(table);
生成效果类似:
| 编号 | 姓名 | 年龄 |
|---|---|---|
| 1 | 张三 | 25 |
| 2 | 李四 | 30 |
实际开发中,可以结合数据库查询结果动态生成表格,例如:
-
用户列表。
-
销售订单。
-
财务报表。
-
统计分析数据。
PDF中插入图片
除了文字和表格,很多业务文档还需要添加Logo、二维码、图片附件等内容。
示例:
Javaimport com.itextpdf.layout.element.Image; import com.itextpdf.io.image.ImageDataFactory; Image image = new Image( ImageDataFactory.create("logo.png") ); document.add(image);
图片可以进一步设置:
Javaimage.setWidth(100); image.setHeight(100);
常见应用场景:
-
企业Logo。
-
产品图片。
-
电子签章。
-
条形码和二维码。
添加页眉页脚
正式PDF文件通常需要页码、公司名称、生成时间等信息。
iText可以通过事件监听器实现页眉页脚。
例如添加页码:
JavapdfDocument.addEventHandler( PdfDocumentEvent.END_PAGE, new PageNumberEventHandler() );
通过事件机制,可以统一控制所有页面内容。
适用于:
-
合同文件。
-
项目报告。
-
企业文档归档。
设置PDF页面大小
默认情况下,PDF使用A4尺寸。
如果需要自定义页面,可以创建页面大小:
JavaPdfDocument pdfDocument = new PdfDocument(writer); Document document = new Document(pdfDocument, PageSize.A4);
常见页面类型:
-
A4报告。
-
A5票据。
-
横向报表。
-
自定义尺寸打印文件。
Java Web项目中动态生成PDF
在Spring Boot项目中,经常需要接口返回PDF文件。
例如:
Java@GetMapping("/export") public void export(HttpServletResponse response) throws Exception { response.setContentType("application/pdf"); response.setHeader( "Content-Disposition", "attachment;filename=test.pdf" ); PdfWriter writer = new PdfWriter(response.getOutputStream()); PdfDocument pdf = new PdfDocument(writer); Document document = new Document(pdf); document.add( new Paragraph("Spring Boot PDF导出") ); document.close(); }
用户访问接口后,可以直接下载生成的PDF文件。
这种方式常用于:
-
在线订单打印。
-
报表导出。
-
电子证明生成。
-
文件下载服务。
PDF文件生成性能优化
当PDF内容较大时,需要关注性能问题。
1. 避免一次加载大量数据
如果数据库数据量很大,不建议一次查询全部记录。
可以采用:
-
分页查询。
-
流式读取。
-
分批生成。
2. 控制图片大小
高清图片会明显增加PDF体积。
建议:
-
上传前压缩图片。
-
控制图片分辨率。
-
使用合适格式。
3. 及时关闭资源
PDF生成过程中涉及文件流操作,必须关闭Document。
推荐使用:
Javatry(Document document = new Document(pdfDocument)){ }
避免资源泄漏。
iText生成PDF常见问题
PDF打开后中文乱码
原因:
-
未加载中文字体。
-
字体编码不支持中文。
解决:
使用Identity-H编码并加载中文字体。
PDF文件损坏
原因:
-
Document未关闭。
-
输出流提前关闭。
-
写入过程中异常。
解决:
确保PDF生成流程完整执行。
表格内容显示异常
原因:
-
列宽不足。
-
字体过大。
-
单元格内容过长。
解决:
调整表格宽度:
Javatable.setWidth(UnitValue.createPercentValue(100));
或者设置自动换行。
服务器部署后字体缺失
原因:
开发环境存在字体,但生产服务器没有。
解决:
将字体文件放入项目资源目录,通过classpath加载。
iText与其他PDF库对比
Java生态中还有一些PDF处理方案,例如:
-
Apache PDFBox。
-
OpenPDF。
-
Flying Saucer。
简单对比如下:
| 工具 | 特点 |
|---|---|
| iText | 功能全面,适合复杂PDF生成 |
| PDFBox | 开源免费,适合PDF读取和基础操作 |
| OpenPDF | 兼容部分iText旧版本API |
| Flying Saucer | 适合HTML转PDF |
如果项目重点是生成复杂业务PDF,例如合同、报表、票据,iText通常是更成熟的选择。
总结
Java使用iText生成PDF是一种稳定、高效的解决方案。通过iText提供的PDF文档对象、布局组件、字体管理、表格处理以及事件机制,开发人员可以快速构建功能完善的PDF生成系统。
实际项目开发过程中,需要重点关注中文字体支持、文件流管理、性能优化以及服务器环境兼容问题。结合Spring Boot等后端框架,iText能够很好地满足企业级PDF导出需求。
无论是简单文本文件,还是复杂业务报表、电子合同、财务文档,掌握iText核心API都能够帮助Java开发者更加高效地完成PDF自动化生成任务。