使用PDF模板合成PDF文件(文字 + 图片)
制作PDF模板工具:Adobe Acrobat 9 Pro
导入依赖
<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>
package com.zzz.util;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.*;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;
public class PdfUtils {
/**
* 动态合成DPF 文本 + 图片
* @param data Map<String, String>类型 key:模板中的字段名 value:填入值
* @param imageData Map<String, String>类型 key:模板中的字段名 value:图片路径
* @return
*/
public static String pdfContractBuilder(Map<String, String> data, Map<String, String> imageData){
String contractUrl = null;
//合同模板链接
String contractTemplateUrl = "https://zzz-test.com/proxy/contract_template.pdf";
System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
ByteArrayOutputStream byteArrayOutputStream = null;
FileOutputStream fileOutputStream = null;
PdfStamper ps = null;
PdfReader reader = null;
try {
byteArrayOutputStream = new ByteArrayOutputStream();
reader = new PdfReader(contractTemplateUrl);
ps = new PdfStamper(reader, byteArrayOutputStream);
AcroFields form = ps.getAcroFields();
// 设置中文
BaseFont font = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
form.addSubstitutionFont(font);
//
for (String key : data.keySet()) {
form.setField(key,data.get(key));
}
// 添加图片
if(null != imageData && imageData.size() > 0){
for(String key : imageData.keySet()){
int pageNo = form.getFieldPositions(key).get(0).page;
com.itextpdf.text.Rectangle signRect = form.getFieldPositions(key).get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
// 读图片
Image image = Image.getInstance(imageData.get(key));
if(key.equals("userSign")){
image.setRotationDegrees(90);
}
// 获取操作的页面
PdfContentByte under = ps.getOverContent(pageNo);
// 根据域的大小缩放图片
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
// 添加图片
image.setAbsolutePosition(x, y);
under.addImage(image);
}
}
ps.setFormFlattening(true);
ps.close();
reader.close();
byteArrayOutputStream.write(byteArrayOutputStream.toByteArray());
contractUrl = "D:/" + System.currentTimeMillis()+".pdf";
fileOutputStream = new FileOutputStream(contractUrl);
fileOutputStream.write(byteArrayOutputStream.toByteArray());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(ps != null){
ps.close();
}
if(reader != null){
reader.close();
}
byteArrayOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return contractUrl;
}
public static void main(String[] args) {
Map<String, String> data = new HashMap<>();
data.put("realName", "大壮");
data.put("idCard", "142622188888888888");
data.put("mobile", "17888888888");
data.put("year", "2022");
data.put("month", "08");
data.put("day", "20");
Map<String, String> imageMap = new HashMap<>();
//签名
imageMap.put("userSign", "https://zzz-test.com/proxy/contract/sign/64859.png");
imageMap.put("stamp", "https://zzz-test.com/proxy/contract/sign/64859.png");//章
String contractUrl = PdfUtils.pdfContractBuilder(data, imageMap);
}
}