Java读取pdf模板,并动态生成pdf文件,如动态生成准考证、学位证书等

时间:2025-04-01 15:27:00
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(); } } }