本文使用itextpdf操作pdf模板
pdf模板使用Adobe Acrobat DC进行表单编辑
首先引入jar包
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
字体处理:
主要解决中文乱码问题:使用仿宋字体
STSong-Light
通过 AcroFields 获取所有字段信息:注意图片传入url问题
public static void tempCreatePdf(String templatePath, String pdfPath, Map<String, String> param) {
try {
System.out.println("=============导出PDF=====================");
long start = System.currentTimeMillis();
PdfReader reader = new PdfReader(templatePath);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PdfStamper ps = new PdfStamper(reader, bos);
AcroFields s = ps.getAcroFields();
//解决中文
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
s.addSubstitutionFont(bfChinese);
//判断写入文件文件夹是否存在,不存在创建
/* File file = new File(pdfPath);
if (!file.exists()) {
file.mkdirs();
}*/
//将值封装至map中
for (String key : param.keySet()){
if (key.endsWith("_image")){
if (param.get(key)!=null &&!"".equals(param.get(key))){
int pageNo = s.getFieldPositions(key).get(0).page;
PdfContentByte under = ps.getOverContent(pageNo);
Image image = addImg(s,key,param.get(key));
if (image != null){
under.addImage(image);
}
}
}else{
s.setField(key, param.get(key));
}
}
ps.setFormFlattening(true);
//判断是否有图片信息 有则添加
ps.close();
FileOutputStream fos = new FileOutputStream(pdfPath);
fos.write(bos.toByteArray());
System.err.println(" \n pdf生成成功 IS OK path=\n" + pdfPath);
System.err.println("耗时time=" + (System.currentTimeMillis() - start)
/ 1000+" 秒");
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}