java整合itext pdf实现固定模版pdf导出,通过自定义pdf模版,填充指定字段内容,将多个pdf文件压缩为zip文件响应
1、导入依赖
<!-- itex PDF -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
2、编写PDF模版
使用WPS的PDF,插入表格来定义模板,通过wps的表单编辑功能输入参数


双击表格栏填写数据,后面写入的参数名称

最终模版样式:

3、编写导出业务接口
先将模版文件放在resources目录的tempplate下
java
@PostMapping("/reportExport")
public void exportElecProtocolBatch(@RequestBody StudentReportDto dto, HttpServletResponse response) {
try {
// 查询业务数据
IPage<SxReportVo> reportInfo = sxReportService.getReportStudentExportInfo(dto);
if (reportInfo.getTotal() == 0) {
return;
}
List<SxReportVo> records = reportInfo.getRecords();
// 设置响应格式ZIP
response.setContentType("application/zip");
String zipFileName = URLEncoder.encode("实习报告.zip", "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + zipFileName);
// 向ZIP输出流写数据
try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {
records.forEach(x -> {
try {
byte[] pdfBytes = generatePdf2(x);
String pdfFileName = "实习报告_" + x.getReportTitle() +x.getReportStartdate()+ ".pdf";
ZipEntry zipEntry = new ZipEntry(pdfFileName);
zipOut.putNextEntry(zipEntry);
zipOut.write(pdfBytes);
zipOut.closeEntry();
} catch (Exception e) {
throw new RuntimeException(e);
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 设置PDF模版及字段名
private byte[] generatePdf2(SxReportVo record) throws Exception {
try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
PdfReader reader = new PdfReader(this.getClass().getResourceAsStream("/template/reportTemplate0523.pdf"));
PdfStamper stamper = new PdfStamper(reader, bos);
AcroFields form = stamper.getAcroFields();
// 处理中文
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
ArrayList<BaseFont> fontList = new ArrayList<>();
fontList.add(bf);
form.setSubstitutionFonts(fontList);
Map<String, Object> data = new HashMap<>();
data.put("studentUserName", record.getStudentUserName());
data.put("studentUserCode", record.getStudentUserCode());
data.put("grade", record.getGrade());
data.put("className", record.getClassName());
data.put("majorName", record.getMajorName());
data.put("collegeName", record.getCollegeName());
data.put("teacherName", record.getTeacherName());
data.put("createTime", record.getCreateTime());
data.put("reportStartdate", record.getReportStartdate());
data.put("reportTitle", record.getReportTitle());
data.put("reportContent", record.getReportContent());
data.put("reportImage", record.getReportImage());
data.put("reportReview", record.getReportReview());
data.put("reportXscore", record.getReportXscore());
for (Map.Entry<String, Object> entry : data.entrySet()) {
if (entry.getKey().contains("student")) {
form.setField(entry.getKey(), ObjectUtil.isNotEmpty(entry.getValue()) ? entry.getValue().toString() : "", true);
} else {
form.setField(entry.getKey(), ObjectUtil.isNotEmpty(entry.getValue()) ? entry.getValue().toString() : "");
}
}
stamper.setFormFlattening(true);
stamper.close();
return bos.toByteArray();
}
}
4、测试导出

