Java读取pdf模板,并动态生成pdf文件,如动态生成准考证、学位证书等
public class PdfTest {
public static void main(String[] args) {
// 模板地址
String tempPath = "D:\\test\\";
// 生成pdf后的保存地址
String outTempPath = "D:\\test\\";
File old = new File(outTempPath);
if (old.exists()){
old.delete();
}
PdfReader reader;
FileOutputStream out;
ByteArrayOutputStream bos;
PdfStamper pdfStamper;
try {
// 查询准考证数据
ScpStudentAdmissionTicket ticket = this.baseMapper.selectById(id);
// 读取pdf模板
reader = new PdfReader(tempPath);
// 将填充完成后的pdf输出到指定位置
out = new FileOutputStream(outTempPath);
bos = new ByteArrayOutputStream();
pdfStamper = new PdfStamper(reader, bos);
// 获取到表单集合
AcroFields acroFields = pdfStamper.getAcroFields();
// 加载字体
BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
// 设置写入字体
acroFields.addSubstitutionFont(font);
// 设置文本信息
acroFields.setField("activityName", ticket.getActivityName());
acroFields.setField("studentName", ticket.getStudentName());
acroFields.setField("admissionNumber", ticket.getAdmissionNumber());
acroFields.setField("idCard", ticket.getIdCard());
acroFields.setField("examination", ticket.getExamination());
LocalDateTime examBeginTime = ticket.getExamBeginTime();
LocalDateTime examEndTime = ticket.getExamEndTime();
String time = examBeginTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 "))
+ examBeginTime.format(DateTimeFormatter.ofPattern("HH:mm"))
+ " - "
+ examEndTime.format(DateTimeFormatter.ofPattern("HH:mm"));
acroFields.setField("examinationTime", time);
// 设置图片
String url = ticket.getUrl();
// 根据地址读取需要放入pdf中的图片
Image image = Image.getInstance(url);
// 设置图片在哪一页
PdfContentByte overContent = pdfStamper.getOverContent(acroFields.getFieldPositions("image").get(0).page);
// 获取模板中图片域的大小
Rectangle signRect = acroFields.getFieldPositions("image").get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
// 图片等比缩放
image.scaleAbsolute(signRect.getWidth(), signRect.getHeight());
// 图片位置
image.setAbsolutePosition(x, y);
// 在该页加入图片
overContent.addImage(image);
// 如果为false那么生成的PDF文件还能编辑,一定要设为true
pdfStamper.setFormFlattening(true);
pdfStamper.close();
Document doc = new Document();
PdfCopy copy= new PdfCopy(doc, out);
doc.open();
PdfImportedPage importedPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
copy.addPage(importedPage);
doc.close();
} catch (IOException | DocumentException e) {
e.printStackTrace();
}
}
}