有一个功能,目的是根据提供的pdf模板,导出一份列表的记录,模板中不全是表格,也有其他的表单内容。因为我一开始使用的是AcroFields这个类想去完成这样的需求,可是发现这样对列表其实不怎么友好,所以结合了PdfPTable实现。
1. 准备
首先就是需要准备好开发功能的工具
itextpdf的jar包引入
<!-- PDF文件 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.10</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
wps,先做一个word文档的模板,再将它导出为pdf文件,这里都是免费的
然后使用一个处理pdf文档的软件–Adobe Acrobat DC,这个软件是收费的,经济能力有限的可以和我一样找一下其他资源。
接下来打开Adobe Acrobat DC,打开刚才保存格式为pdf的文件,然后选择右侧的“准备表单”
接着是在右侧表单字段,填写对应的字段名,有些不需要的填写的可以自行删除
因为AcroFields使用的是键值对一一对应的方式,所以,在不确定表格行数的时候,无论写多还是写少,都存在很大的问题。而且如果将表格中的cell单位格,一个个的设定key,相当繁琐。所以我们需要使用PdfPTable,将生成的表格插入一块预留区域。
在准备表单页面的上方,点击添加文本域。将此文本域作为表格的预留区,尽量偏左,因为表格插入的时候,起始位置是从左边开始算起,若是偏中区域,可能会导致表格因宽度问题导致超出纸张大小。
2. 代码实现
将刚才的表单模板保存好,放入项目的 src/main/resources 目录下
使用PdfReader读取刚才的表单内容,主要获取表单内的字段名(key键)
ByteArrayOutputStream bos = new ByteArrayOutputStream();
reader = new PdfReader(this.getClass().getResourceAsStream("/template/专家费发放申请表.pdf"));
PdfStamper stamper = new PdfStamper(reader, bos);
AcroFields form = stamper.getAcroFields();
然后是设置字体,因为默认提供的几种字体,不能很好的达到中文字体的那种效果。所以需要准备好支持中文的字体文件,我这里使用的是宋体的tff字体文件。
字体下载
//设置字体
BaseFont baseFont = BaseFont.createFont("template/SimSun.ttf",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
form.addSubstitutionFont(baseFont);
Font font = new Font(baseFont, 11, Font.NORMAL);
接下来是将pdf的表单内容设置字体大小,这一点我还不清楚,表单的字体样式什么的,AcroFields控制的不是很好,需要手动去调整。
//设置字体大小
if (Obj