问题
在日常工作中需要自定义填充pdf
一.前期准备
1.工具下载
我尝试使用了两个软件:
- 万兴PDF,比较好用、一摸就会,但是耐不住要花钱充会员
- AcrobatPro DC2022(绿色版),网上有很多版本,但是大部分会安装失败。 这里提供我使用的安装包。
- 链接:mp.weixin.qq.com/s/9FKqcg8NE… (教程来自:软件管家)
2.制作pdf
(1)准备pdf:创建word表格并转换为pdf
(2)创建pdf表单:将pdf文件在AcrobatPro DC里打开,然后选择工具----》准备表单
之后如下图,双击表格----》设置文本域属性----》在”一般“里设置名称(关键字)----》可以在”外观“
里设计字体大小和字体----》可以在”选项“里设置对齐方式。pdf设置完成
二.实现
1.依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<!--pdf合并使用-->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.4</version>
</dependency>
2.代码
@Test
public void testPdf() {
String inputFileName = "C:\Users\86155\Desktop\学习信息登记表.pdf";//pdf模板路径
String outputFileName = "C:\Users\86155\Desktop\1.pdf";//输出路径
OutputStream os = null;
PdfStamper ps = null;
PdfReader reader = null;
try {
os = new FileOutputStream(new File(outputFileName));
reader = new PdfReader(inputFileName);// 读入pdf表单
ps = new PdfStamper(reader, os);// 根据表单生成一个新的pdf
AcroFields form = ps.getAcroFields();// 获取pdf表单
// 给表单添加中文字体 这里采用系统字体。不设置的话,中文可能无法显示
//方法一:使用自定义文件中的字体
//BaseFont bf = BaseFont.createFont("C:/Windows/Fonts/simkai.ttf",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//simkai.ttf为系统自带,可以该路径下查找
// 方法二:使用iTextAsian.jar中的字体
//BaseFont bf =BaseFont.createFont("STSong-Light",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);//谨慎选用,会出现中文乱码
BaseFont bf =BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H",false);
form.addSubstitutionFont(bf);
Map<String, Object> data = new HashMap<String, Object>();// 填充的数据
data.put("name1","李四");
data.put("name2","王五");
data.put("name3","赵六");
data.put("phone1","17755660022");
data.put("phone2","18866009911");
data.put("phone3","19900003456");
for (String key : data.keySet()) { // 遍历data 给pdf表单表格赋值
form.setField(key, data.get(key).toString());
}
ps.setFormFlattening(true);
System.out.println("===============PDF导出成功=============");
} catch (Exception e) {
System.out.println("===============PDF导出失败=============");
e.printStackTrace();
} finally {
try {
ps.close();
reader.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.结果
填充结果如图:
4.扩展
- 问题:将生成的pdf上传云存储器的方法,比如上传到阿里云的oss
- 思路:在生成PDF的时候,选择生成一个临时文件,然后在根据文件路径拿到文件,并转为InputStream,就可以上传了。