java根据word模板生成word,在根据word文件转换成pdf文件

news/2025/11/18 16:53:23/文章来源:https://www.cnblogs.com/sangwei/p/19238453

1.引入pom文件

  <!-- Apache POI for Word document generation --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>5.2.3</version></dependency><!-- Apache POI PDF Converter --><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.converter.docx.xwpf</artifactId><version>2.0.6</version></dependency>

2.Word模板使用说明

在`src/main/resources/templates/`(自定义)目录下放置Word模板文件,例如`rectification_template.docx`。在模板中使用占位符格式:`${字段名}`,例如:
- `${safe}` 
- `${quality}` 当调用接口时,系统会根据模板和数据生成新的Word文档

image

 

 

3.代码

    @ApiOperation("预览整改通知PDF文档")@GetMapping("/previewPdfDocument/{id}")public void previewPdfDocument(@PathVariable Long id, HttpServletResponse response) {try {// 生成PDF文档文件File pdfFile = rectificationService.generatePdfDocumentFile(id);if (pdfFile == null) {response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "PDF文档生成失败");return;}// 设置响应头,使浏览器直接预览而不是下载response.setContentType("application/pdf");response.setContentLength((int) pdfFile.length());// 写入响应try (FileInputStream fileInputStream = new FileInputStream(pdfFile);ServletOutputStream outputStream = response.getOutputStream()) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = fileInputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}outputStream.flush();}// 删除临时文件pdfFile.delete();} catch (Exception e) {try {response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "PDF文档生成或预览过程中发生错误: " + e.getMessage());} catch (IOException ioException) {ioException.printStackTrace();}}}

4.代码2

   @Overridepublic File generatePdfDocumentFile(Long id) {try {// 首先生成Word文档ByteArrayOutputStream wordOutputStream = generatePdf(id);if (wordOutputStream == null) {return null;}// 创建临时文件File pdfFile = File.createTempFile("rectification_" + id + "_", ".pdf");// 将Word转换为PDF并写入文件try (ByteArrayInputStream wordInputStream = new ByteArrayInputStream(wordOutputStream.toByteArray());FileOutputStream pdfOutputStream = new FileOutputStream(pdfFile)) {PdfUtil.convertWordToPdfFormatted(wordInputStream, pdfOutputStream);return pdfFile;}} catch (Exception e) {e.printStackTrace();return null;}}

5.模板数据填入

  @Overridepublic ByteArrayOutputStream generatePdf(Long id) {Intion entity = baseMapper.selectById(id);//改成自己需要的数据if (null == entity) {return null;}//模板路径ClassPathResource resource = new ClassPathResource("templates/rectification_template.docx");// 准备模板数据Map<String, Object> dataMap = new HashMap<>();dataMap.put("safe", entity.getSafe());try {// 获取模板路径String templatePath = resource.getFile().getAbsolutePath();// 生成Word文档ByteArrayOutputStream outputStream = new ByteArrayOutputStream();WordTemplateUtil.generateWordFromTemplate(templatePath, dataMap, outputStream);return outputStream;} catch (Exception e) {e.printStackTrace();return null;}}

6.word工具类

import org.apache.poi.xwpf.usermodel.*;
import java.io.*;
import java.util.Map;
import java.util.List;/*** Word模板工具类* 根据Word模板生成带数据的Word文档*/
public class WordTemplateUtil {/*** 根据模板生成Word文档* @param templatePath 模板文件路径* @param params 数据参数* @param outputStream 输出流* @throws IOException IO异常*/public static void generateWordFromTemplate(String templatePath, Map<String, Object> params, OutputStream outputStream) throws IOException {try (FileInputStream fis = new FileInputStream(templatePath);XWPFDocument document = new XWPFDocument(fis)) {// 替换段落中的占位符
            replaceInParagraphs(document, params);// 替换表格中的占位符
            replaceInTables(document, params);// 写入输出流
            document.write(outputStream);}}/*** 替换段落中的占位符* @param document Word文档* @param params 参数映射*/private static void replaceInParagraphs(XWPFDocument document, Map<String, Object> params) {for (XWPFParagraph paragraph : document.getParagraphs()) {for (XWPFRun run : paragraph.getRuns()) {String text = run.getText(0);if (text != null) {for (Map.Entry<String, Object> entry : params.entrySet()) {String placeholder = "${" + entry.getKey() + "}";Object value = entry.getValue();if (text.contains(placeholder)) {text = text.replace(placeholder, value != null ? value.toString() : "");run.setText(text, 0);}}}}}}/*** 替换表格中的占位符* @param document Word文档* @param params 参数映射*/private static void replaceInTables(XWPFDocument document, Map<String, Object> params) {for (XWPFTable table : document.getTables()) {for (XWPFTableRow row : table.getRows()) {for (XWPFTableCell cell : row.getTableCells()) {for (XWPFParagraph paragraph : cell.getParagraphs()) {for (XWPFRun run : paragraph.getRuns()) {String text = run.getText(0);if (text != null) {for (Map.Entry<String, Object> entry : params.entrySet()) {String placeholder = "${" + entry.getKey() + "}";Object value = entry.getValue();if (text.contains(placeholder)) {text = text.replace(placeholder, value != null ? value.toString() : "");run.setText(text, 0);}}}}}}}}}/*** 生成表格数据* @param document Word文档* @param bookmark 表格书签* @param headers 表头* @param dataList 数据列表*/public static void generateTableData(XWPFDocument document, String bookmark, String[] headers, List<Object[]> dataList) {// 查找书签位置// 这里简化处理,实际应用中可以通过查找书签位置来确定表格插入点// 创建表格XWPFTable table = document.createTable();// 设置表头XWPFTableRow headerRow = table.getRow(0);for (int i = 0; i < headers.length; i++) {if (i == 0) {headerRow.getCell(0).setText(headers[i]);} else {headerRow.addNewTableCell().setText(headers[i]);}}// 填充数据for (Object[] rowData : dataList) {XWPFTableRow row = table.createRow();for (int i = 0; i < rowData.length; i++) {row.getCell(i).setText(rowData[i] != null ? rowData[i].toString() : "");}}}
}

7.pdf 工具类

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import fr.opensagres.poi.xwpf.converter.pdf.PdfConverter;
import fr.opensagres.poi.xwpf.converter.pdf.PdfOptions;import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;/*** PDF工具类* 提供Word转PDF等功能*/
public class PdfUtil {/*** 将Word文档转换为PDF (使用Apache POI实现)* 使用org.apache.poi.xwpf.usermodel.XWPFDocument和fr.opensagres.poi.xwpf.converter.pdf实现转换* @param wordInputStream Word文档输入流* @param pdfOutputStream PDF文档输出流* @throws Exception 转换异常*/public static void convertWordToPdfFormatted(InputStream wordInputStream, OutputStream pdfOutputStream) throws Exception {try {// 使用Apache POI加载Word文档XWPFDocument document = new XWPFDocument(wordInputStream);// 创建PDF转换选项PdfOptions options = PdfOptions.create();// 执行转换
            PdfConverter.getInstance().convert(document, pdfOutputStream, options);} catch (IOException e) {throw new Exception("转换Word为PDF失败", e);}}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/969137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(二)文件下载压缩打包:下载(wget)、压缩(gzip)、解压(gunzip)、打包(tar)

1. 压缩gzip、解压gunzip # gzip压缩成.gz文件 gzip # gunzip解压 2. 打包文件tar(配合压缩解压使用) tar -cvf archive.tar file1 file2 directory # -c: 创建新的归档文件 # -v: 显示详细输出,列出被添加到归档中…

前端打包的一些注意事项

框架:vue3 + vite vite build --mode prod 与 vite build --mode production所匹配的配置文件不同。 --mode production → 加载 .env.production 文件 --mode prod → 加载 .env.prod 文件 默认情况 → 加载 .env 和…

2025 最新打印机经销商推荐排行榜:长三角标杆企业 + 国内新锐品牌,全包服务与高效响应双重保障彩色打印机/打印机销售/打印机出租/打印机租赁公司推荐

引言 随着远程办公常态化与企业数字化转型加速,打印机作为 “办公刚需设备” 的核心价值愈发凸显,其稳定性、服务效率与成本控制直接决定企业办公流畅度。然而当前市场乱象丛生:部分服务商资质残缺、隐性收费暗藏、…

函数速查表

函数速查表 printf格式控制符表格式控制符 含义 适用数据类型 参数说明 示例 输出结果(示例)整型相关%d 有符号十进制整数 int、short 接收int/short类型变量,按十进制输出 printf("%d", 123); 123%i 有符…

MATLAB实现的基于压缩感知的图像处理

1. 参数设置 % 图像参数 imageSize = [256, 256]; % 图像大小 patchSize = [8, 8]; % 图像块大小 stepSize = 4; % 步长% 压缩感知参数 numAtoms = 256; % 字典中原子数量 numIterations = 10; % 稀疏分解迭代次数 lam…

AI变革,企业如何应用AI大模型重塑思考维度?

中国虽是多条AI赛道的领跑者,企业部署AI的速度却慢了一步“中国虽是多条AI赛道的领跑者,企业部署AI的速度却慢了一步。”这是一个不争的事实。 日常的AI应用场景千千万,不止于简单的检索信息、编写代码、生成表格,…

还是得要耐心--从淘宝数据线中考虑到的

还是得要耐心--从淘宝数据线中考虑到的真打脸,就是那个前脚刚说就是需要耐心一点,今天收到了淘宝上面买的曼柯洛希旗舰店里面买的两次的充电线。并没有插头,只有USB-Type C接口的线,但是没问题,本来我之前也有插头…

比较好的空气检测服务

摘要 随着室内空气污染问题日益受到关注,2025年空气检测行业迎来快速发展,家装和工装用户对健康环境的需求激增。本文基于行业数据和用户口碑,综合评估国内空气检测服务商,为您提供权威排名和选择指南。表单仅供参…

2025年建材连锁ERP软件前十名分析:四大主流系统评测

2025年建材连锁ERP软件前十名分析:四大主流系统评测寻找适合建材连锁的ERP软件?本文深入分析2025年市场上进入前十名行列的四款主流ERP系统,提供客观的优缺点对比,帮助建材企业做出合适的选择。2025年建材连锁企业…

2025年安徽合肥异味治理服务口碑推荐排行榜

摘要 随着人们对室内空气质量的日益重视,异味治理行业在2025年迎来了快速发展期。安徽省合肥市作为长三角城市群副中心,异味治理市场需求持续增长。本文基于行业数据分析和用户真实反馈,为您推荐合肥地区口碑优异的…

正规的甲醛检测平台推荐几家

摘要 随着室内空气质量问题日益受到关注,2025年甲醛检测行业迎来快速发展期。据统计,我国室内环境检测市场规模已突破200亿元,年均增长率达15%以上。本文基于权威数据分析和用户真实评价,为您推荐五家正规可靠的甲…

Kafka-配置SASL/SCRAM认证

1. 创建admin用户 如果选择SCRAM机制,首先需要创建用户凭证。假设要创建一个用户名为admin,密码为admin的用户。 # 进入Kafka的安装目录 cd /usr/local/kafka-3.7.0 bin/kafka-configs.sh --bootstrap-server …

2025年潜水泵厂家实力榜:轴流水泵、潜水轴流泵、轴流潜水泵、卧式混流水泵、品类五家企业凭技术与口碑出圈

随着城市给排水、农田灌溉、工业循环等领域需求的持续增长,水泵作为核心流体输送设备,其产品性能、可靠性与适配能力成为市场关注焦点。在潜水泵、轴流水泵、混流水泵等主流品类中,一批兼具技术创新能力与服务意识的…

QT中groupbox填满整个页面

在Qt Designer中可视化操作 如果您使用Qt Designer进行界面设计,操作会更加直观-9:将Group Box拖放到主窗体上。确保Group Box被选中,然后右键单击主窗体的空白区域。选择布局菜单,然后选择一个布局方式,例如水平…

视频编辑的新成果!港科大蚂蚁集团提出Ditto框架刷新SOTA!

论文标题:Scaling Instruction-Based VideoEditing with a High-Quality Synthetic Dataset作者团队:香港科大、蚂蚁集团、浙江大学、东北大学 发布时间:2025年10月17日 👉一键直达论文 [👉Lab4AI大模型实验室论…

2025年气体减压阀厂家实力榜:大流量气体减压阀,不锈钢氮气减压阀,不锈钢泄压阀,实验室气体减压阀、多品类阀门企业凭技术与口碑出圈

随着高端制造、生物医药等领域对流体控制精度要求的持续提升,气体减压阀作为核心控制部件,其安全性与稳定性成为市场关注焦点。在不锈钢减压阀、实验室减压阀等主流品类中,一批兼具研发能力与服务意识的企业脱颖而出…

2025年市场朋友圈计划平台榜单top10:权威解析与推荐

摘要 2025年,朋友圈计划平台行业随着数字健康和电商整合的浪潮迅猛发展,专注于大健康产业的服务商成为市场热点。本文基于行业数据和用户口碑,为您呈现2025年市场朋友圈计划平台排行榜前十强,并附上详细解析,帮助…

sub-1G收发芯片DP4330A低成本解决方案OOK /(G)FSK 等多种调制方式远距离 - 动能世纪

产品简介 DP4330A 是一款超低功耗、高集成度、高性能、适用于 Sub-1GHz 频段无线应用的射频收 发器。它具有 1.8V - 3.6V 较宽的输入电压范围,最大发射功率可达到 20dBm,最低灵敏度可达120dBm。它支持OOK 、(G)FSK…

2025年惠州青少年素质教育机构权威推荐榜单:青少年专门教育/感恩教育/沉迷游戏矫正源头机构精选

青少年行为矫正市场需求持续增长,其中科学的教育理念与专业的师资队伍已成为家长选择素质教育机构的核心考量因素。 随着社会对青少年心理健康重视程度的提高,专业素质教育机构通过心理辅导、行为矫正、感恩教育等多…

jQuery的.each()方法中return的坑

jQuery的.each()方法中return的坑