Java+iTextPDF,实时生成与预览PDF文件的最佳实践!
Java+iTextPDF,实时生成与预览PDF文件的最佳实践!
背景
其实公司之前的项目里是用到了帆软报表的,然而最近接了一个新项目,这个项目独立部署在甲方的独立环境中,组长的意思是不用再单独部署一套帆软报表,成本太大,用其他方式实现一下。虽然我不太理解成本大在哪儿,不过身为助理工程师,别管那么多,照着干就完事了。
之前有其他哥们写过类似功能,通过解析数据动态生成pdf文件。但他用的那个技术jasper有点老了,资料不太好找,问过神奇的chatgpt后,了解到iTextPdf这个库,应该是比较好的选择。
解决方案
我们先观察下真实的开票预览的模板。
发票信息由两部分组成:
- 固定信息,例如购买方信息、销售方信息。
- 商品信息,可能有多行,需动态填充
很明显的一个主子结构。
了解了一下iTextPdf的相关api。要实现这个功能,其实我们需要分别生成两部分的发票信息,也就是两个pdf,然后将两个pdf拼接成同一个。
- 对于第一部分的固定信息,我们可以用Acrobat之类的pdf设计工具设计出一个模板,然后在java程序中读取并填充对应的模板值。
- 对于第二部分的商品信息,就需要获取商品数据,动态生成表格,当然iTextPdf是支持这一功能的。
分别得到两部分的pdf之后,再将其合并为同一个pdf就可以了。
具体实现
1.引入iTextPdf库
在pom文件中添加iTextPdf
的对应依赖。其中 itext-asian
这个也是需要的,不然生成的pdf中无法显示中文
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.2</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
2.编辑对应模板
下载Adobe Acrobat
工具,这部分就不细说了 点击文件-创建-表单。如果你有现成的pdf文件,也可以在这步选择单一文件开始,没有的话就从头新建
通过放置文字和文字域来设计好表单模板。注意,文字域“属性”里的名称就是最后使用iTextPdf
填充时需要填充的对应字段。
3.编写java PDF生成程序
使用框架还是老一套的SpringBoo