一、编辑PDF模板
1.创建word文档设置好模板,导出为PDF
2.打开导出的PDF,进行表单编辑
3.设置对应位置的表单名称,用于模板数据填充
注意:对应的图片表单域,需要设置为隐藏或者无填充颜色,不然图片会被覆盖显示不出来
二、获取字体
自己没有字体,可以使用电脑自带的,字体目录在:C:\Windows\Fonts,
注意版权问题,选可以使用的
三、Java实现
1.添加依赖,在pom.xml文件中添加pdf模板工具依赖itextpdf
<!-- pdf模板工具 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
2.示例代码,包括设置字体、填充文本、插入图片
注意:字体替换 注意文件后缀大写、有逗号和0
public static void main(String[] args){
//TODO 模板替换
String inputFileName = "/test/template/template_v1.pdf";
FileOutputStream os = null;
PdfStamper ps = null;
PdfReader reader = null;
try {
// 1 获取文件的输出流
os = new FileOutputStream(new File("/test/template/data.pdf"));
// 2 读取pdf模板
reader = new PdfReader(inputFileName);
// 3 根据表单生成一个新的pdf
ps = new PdfStamper(reader, os);
// 4 获取pdf表单
AcroFields form = ps.getAcroFields();
// 5 给表单添加中文字体
// TODO 字体替换 注意文件后缀大写、逗号和0
BaseFont bf = BaseFont.createFont("/test/template/simsun.TTC,0", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
form.addSubstitutionFont(bf);
//6填充模板表单数据
form.setField("name","张三");
form.setField("phone","18977546523");
form.setField("address","地球村北京");
ps.setFormFlattening(true);
// 7 填充图片到form
PdfStamper stamper = ps;
// 通过域名获取所在页和坐标,左下角为起点
int pageno = form.getFieldPositions("photo").get(0).page;
Rectangle signrect = form.getFieldPositions("photo").get(0).position;
float x = signrect.getLeft();
//float width = signrect.getWidth();
float y = signrect.getBottom();
// 读图片
Image image = Image.getInstance("F:\\test\\template\\photo.jpg");
//float img_width = image.getWidth();
// 获取操作的页面
PdfContentByte under = stamper.getOverContent(pageno);
// 添加图片
image.setAbsolutePosition(x, y);
// 图片的大小
image.scaleToFit(signrect.getWidth(), signrect.getHeight());
under.addImage(image);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
ps.close();
reader.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.输出结果如下