当前位置: 首页 > news >正文

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下

@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();// 设置响应格式ZIPresponse.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、测试导出

http://www.dtcms.com/a/506662.html

相关文章:

  • 26考研数学一、二、三真题试卷及答案PDF电子版(1987-2025年)
  • Django Web 开发系列(二):视图进阶、快捷函数与请求响应处理
  • 重庆哪些网站推广公司wordpress获取用户名
  • Bevy 渲染系统 Bindless 实现与交互逻辑
  • K8s控制器终极对比:StatefulSet与Deployment详解
  • [Agent可视化] docs | go/rust/py混构 | Temporal编排 | WASI沙箱
  • Linux服务器编程实践55-网络信息API:gethostbyname与gethostbyaddr实现主机名解析
  • Godot 2D游戏开发全流程实战
  • 自动驾驶工程师面试(定位、感知向)
  • Cocos学习——摄像机Camera
  • 千秋网站建设公司百度如何快速收录
  • 深圳大型论坛网站建设免费行情网站在线
  • 《软件测试分类指南(下):从测试阶段到地域适配,拆解落地核心维度》
  • Python 查询网站开发3g小说网站
  • 基于Python的Word文档模板自动化处理:从占位符提取到智能填充
  • vue3子组件向父组件传递参数
  • 阿里云云代理商:阿里云CDN刷新机制是什么?
  • FFmpeg 基本数据结构 AVFormatConext 分析
  • 使用 DrissionPage——实现同花顺股票数据自动化爬虫
  • 基于位置式PID算法调节PWM占空比实现电机转速控制
  • FFmpeg+QT输出音频
  • 友点企业网站管理系统微信商城在哪里找
  • 深度学习(5)-PyTorch 张量详细介绍
  • 西安市建设厅网站软文营销的经典案例
  • Agent 开发设计模式(Agentic Design Patterns )第8章: 智能体记忆管理(Memory Management)
  • Linux 下使用 Docker-Compose 安装 Kafka 和 Kafka-UI(KRaft 模式)
  • 【C++入门篇 - 10】:模板
  • [Linux]学习笔记系列 -- [kernel][lock]mutex
  • 开源 Linux 服务器与中间件(七)数据库--MySQL
  • 在 JavaScript 中处理 `0.1 + 0.2` 这类精度问题