使⽤itext填充静态PDF模板,⽣成PDF新⽂件背景:
PDF的⽣成有多种⽅式,常见是直接从⽆到有⽣成⼀份PDF,包含设置输出格式,增设页⾯,绘制内容并填写数据。
⽽这⾥介绍的是,使⽤静态PDF模板填充数据,⽣成⼀份新的静态PDF。
模板:
可使⽤ LiveCycle Designer 制作模板。
拖拉常⽤控件textfield,然后设置它的绑定名称key,这个key是后续Java填值的关键,如图设置:
绘制好想要的内容后,选择另存为static类型的PDF⽂件,此为模板。
Java填值部分:
1.使⽤PdfReader读取模板PDF,然后使⽤ PdfStamper把 resultPDF与reader两者绑定。
PdfReader reader = new PdfReader(templateFilePath);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(resultFilePath));
2.然后开始操作这个PdfStamper对象,核⼼代码是
AcroFields acroFields = AcroFields();
acroFields.setField("account全称", "航天科技有限公司");
这⾥的 “account全称” 必须与图1模板中定义的Binding name⼀致,即可给控件 “公司全称” 填值 “航天科技有限公司”。
3. 解决填值中⽂乱码问题
// 指定中⽂字体
BaseFont font = ateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
acroFields.setFieldProperty("account全称", "textfont", font, null);
设定 ”公司全称“ 输⼊框可填值中⽂,实际上我直接给所有控件都设置中⽂格式了,也暂未发现有啥⽑病。
4.关闭流有区分先后顺序,原先在⽹上见到⼈胡乱关闭,抄下来运⾏后报错了。
// 先关闭stamper
stamper.close();
reader.close();
参考完整代码:
1private void fillStaticPdf(String templateFilePath, String resultFilePath, Map<String, String> data){
2
3if(StringUtils.isEmpty(templateFilePath) || StringUtils.isEmpty(resultFilePath) || data == null){
4 log.info("[fillStaticPdf]params is empty");
5throw new InvalidInputException(LACK_OF_PARAM);
6 }
7
8 PdfReader reader = null;
9 PdfStamper stamper = null;
10try {
11 reader = new PdfReader(templateFilePath);
12 stamper = new PdfStamper(reader, new FileOutputStream(resultFilePath));
13 AcroFields acroFields = AcroFields();
14
15//中⽂字体
16 BaseFont font = ateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED); 17
18//静态赋值
19for (Map.Entry<String, String> d : Set()) {
20 acroFields.Key(), "textfont", font, null);
21 acroFields.Key(), d.getValue(), true);
22 }
23
24//设置pdf为只读
25 stamper.setFormFlattening(true);
26 } catch (DocumentException e) {
27 log.info("[fillStaticPdf]-⽂件异常!");
28throw new InvalidInputException(SYSTEM_ERROR);
29 } catch (IOException e) {
30 log.info("[fillStaticPdf]-⽣成PDF时IOException异常!");
31throw new InvalidInputException(SYSTEM_ERROR);
32 } finally {
33if(stamper!=null){
34try {
35 stamper.close();
36 } catch (Exception e) {
37 log.info("关闭stamper时遇到错误!");
38 }
39 }
乱码文字生成40if(reader!=null){
41 reader.close();
42 }
43 }
44 }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论