java整合itext pdf实现固定模版pdf导出

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的表单编辑功能输入参数

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

最终模版样式:

📎reportTemplate0523.pdf

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、测试导出

相关推荐
Seoyoneh4 分钟前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
海南java第二人8 分钟前
对外 API 如何保证幂等性?插入数据 / 上传表格场景全方案汇总
java·幂等性
tryxr28 分钟前
Chat2Excel 文件服务模块上传文件功能开发
java·项目·oss·easyexcel·文件服务
Tangyuewei30 分钟前
Java 写 Agent:模型只是组件
java·开发语言
小玮看世界1 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
Java陈序员1 小时前
轻量运维面板!一款现代化的服务器控制面板工具!
运维·服务器·python·react.js·github
2601_962097361 小时前
1. 使用 C 或 C++ 扩展 Python
python·api·c·引用计数·扩展模块
彧azz1 小时前
Java学习语法篇:变量
java·学习
Yanjun2i2 小时前
Agent学习记录五:Pydantic验证
人工智能·python·学习
月光船幽幽2 小时前
跨范式映射的稳定接口设计
人工智能·python·算法