java将word转pdf

devtools/2024/10/18 12:34:52/

总结

建议使用aspose-words转pdf,poi的容易出问题还丑…

poi的(多行的下边框就不对了)
在这里插入图片描述

aspose-words的(基本和word一样)
在这里插入图片描述

poi工具转换

        <!-- 处理PDF --><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.poi.xwpf.converter.pdf-gae</artifactId><version>2.0.3</version></dependency>

这个工具使用了poi,最新的2.0.3对应poi的5.2.0,2.0.1对应poi的3.15

使用

java">//拿到word
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("word/muban3.docx");word">if (inputStream == word">null) {word">throw word">new MsgException("读取模板失败");}
XWPFDocument document = word">new XWPFDocument(inputStream);
//.....word处理
PdfOptions pdfOptions = PdfOptions.create();//.fontEncoding( BaseFont.CP1250 );
//转pdf操作 (直接写入响应)
PdfConverter.getInstance().convert(document, response.getOutputStream(), pdfOptions);
response.setContentType("application/pdf");

或者写入输出流

java">    /*** 将word转为pdf并返回一个输出流** @param document 输出文件名(pdf格式)*/word">public word">static ByteArrayOutputStream wordToPdfOutputStream(XWPFDocument document) word">throws IOException {//wordpdfByteArrayOutputStream outputStream = word">new ByteArrayOutputStream();PdfOptions pdfOptions = PdfOptions.create();//.fontEncoding( BaseFont.CP1250 );//转pdf操作PdfConverter.getInstance().convert(document, outputStream, pdfOptions);word">return outputStream;}
问题

poi改了word之后,生成没问题,word中创建的表格,转pdf的时候经常出问题(直接报错或者合并无效)
在这里插入图片描述

研究了2天,pdf转一直各种问题,一起之下换技术

words_61">aspose-words

https://blog.csdn.net/Wang_Pink/article/details/141898210

        <dependency><groupId>com.luhuiguo</groupId><artifactId>aspose-words</artifactId><version>23.1</version></dependency>

poi处理word一堆的依赖,这个一个就好,而且本身就支持转pdf!!!

使用

  1. 在resources创建word-license.xml
    在这里插入图片描述
<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License>
  1. 工具类
java">word">import com.aspose.words.Document;
word">import com.aspose.words.License;
word">import com.aspose.words.SaveFormat;
word">import lombok.extern.slf4j.Slf4j;word">import java.io.File;
word">import java.io.FileOutputStream;
word">import java.io.InputStream;
word">import java.io.OutputStream;
word">import java.util.Objects;@Slf4j
word">public word">class Doc2PdfUtil {/*** 获取 license 去除水印* 若不验证则转化出的pdf文档会有水印产生*/word">private word">static word">void getLicense() {String licenseFilePath = "word-license.xml";word">try {InputStream is = Doc2PdfUtil.word">class.getClassLoader().getResourceAsStream(licenseFilePath);License license = word">new License();license.setLicense(Objects.requireNonNull(is));} word">catch (Exception e) {log.error("license verify failed");e.printStackTrace();}}/*** wordpdf** @param wordFile word 文件路径* @param pdfFile  生成的 pdf 文件路径*/word">public word">static word">void word2Pdf(String wordFile, String pdfFile) {File file = word">new File(pdfFile);word">if (!file.getParentFile().exists()) {file.getParentFile().mkdir();}getLicense();word">try (FileOutputStream os = word">new FileOutputStream(word">new File(pdfFile))) {Document doc = word">new Document(wordFile);doc.save(os, SaveFormat.PDF);} word">catch (Exception e) {log.error("wordpdf失败", e);}}/*** wordpdf** @param wordFile word 文件流* @param pdfFile  生成的 pdf 文件流*/word">public word">static word">void word2Pdf(InputStream wordFile, OutputStream pdfFile) {getLicense();word">try {Document doc = word">new Document(wordFile);doc.save(pdfFile, SaveFormat.PDF);} word">catch (Exception e) {log.error("wordpdf失败", e);}}
}

使用

java">Doc2PdfUtil.word2Pdf("aa.docx","bb.pdf");

我是依旧使用poi处理word,用这个转pdf

java">//拿到word
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("word/muban3.docx");word">if (inputStream == word">null) {word">throw word">new MsgException("读取模板失败");}
XWPFDocument document = word">new XWPFDocument(inputStream);
//.....word处理ByteArrayInputStream in = word">null;word">try {//由于使用的poi的document,需要现将poi的document转为普通的输入流in = WordUtil.getInputStream(document);Doc2PdfUtil.word2Pdf(in,response.getOutputStream());response.setContentType("application/pdf");} word">catch (Exception e) {log.error("报告下载失败", e);} word">finally {word">try {document.close();} word">catch (Exception e1) {log.error("document 流关闭失败", e1);}word">if (in != word">null) {word">try {in.close();} word">catch (Exception e1) {log.error("in 流关闭失败", e1);}}}
java">    word">public word">static ByteArrayInputStream getInputStream(XWPFDocument document) {ByteArrayOutputStream outputStream = word">new ByteArrayOutputStream();word">try {document.write(outputStream);word">return outputStreamToPdfInputStream(outputStream);} word">catch (IOException e) {word">throw word">new RuntimeException(e);} word">finally {word">if (outputStream != word">null) {word">try {outputStream.close();} word">catch (IOException e) {word">throw word">new RuntimeException(e);}}}}/*** 将word转为pdf并返回一个输入流** @param outputStream 输出文件名(pdf格式)*/word">public word">static ByteArrayInputStream outputStreamToPdfInputStream(ByteArrayOutputStream outputStream) word">throws IOException {//输出的pdf输出流转输入流word">try {//临时word">byte[] bookByteAry = outputStream.toByteArray();word">return word">new ByteArrayInputStream(bookByteAry);} word">catch (Exception e) {e.printStackTrace();word">return word">null;}}

完美转换
在这里插入图片描述


http://www.ppmy.cn/devtools/119575.html

相关文章

使用 Vue3 和 Axios 实现 CRUD 操作

文章目录 1、准备工作2、创建 Vue 3 项目3、项目结构4、实现 CRUD 操作5、运行项目6、小结在当今的前端开发中,Vue.js 作为一款流行的 JavaScript 框架,正在被越来越多的开发者所青睐。尤其是 Vue 3 引入了 Composition API 和更优雅的响应式处理,使得模板编写和状态管理变得…

IDEA在git提交时添加忽略文件

在IntelliJ IDEA中&#xff0c;要忽略target目录下所有文件的Git提交&#xff0c;你可以通过设置.gitignore文件来实现。以下是步骤和示例代码&#xff1a; 1、打开项目根目录下的.gitignore文件。也可以先下载这个.ignore插件。 2、如果不存在&#xff0c;利用上面的插件新建…

Linux启动mysql报错

甲方公司意外停电&#xff0c;所有服务器重启后&#xff0c;发现部署在Linux上的mysql数据库启动失败.再加上老员工离职&#xff0c;新接手项目&#xff0c;对Linux系统了解不多&#xff0c;解决起来用时较多&#xff0c;特此记录。 1.启动及报错 1.1 启动语句1 启动语句1&a…

简单vue指令实现 el-table 可拖拽表格功能

安装 SortableJS sorttableJs 相关优点如下&#xff1a; 相关配置项 参考 &#x1f449; SortableJS中文官网 pnpm i sortablejs封装成指令 不多逼逼&#xff0c;直接上才艺 &#x1f92a;&#x1f92a;&#x1f92a; 先安装一个 nanoid 插件 用于生成随机id&#xff0c;注…

滚雪球学Oracle[6.1讲]:高级特性与实战案例

全文目录&#xff1a; 前言0. 上期回顾1. Oracle RAC技术概述1.1 RAC架构下的高可用性设计1.2 RAC集群中的并行查询与负载均衡1.3 RAC集群中的缓存一致性管理 2. Data Guard与灾难恢复2.1 Data Guard中的同步模式与异步模式2.2 Data Guard的切换与故障转移策略2.3 Data Guard B…

【工程测试技术】第3章 测试装置的基本特性,静态特性和动态特性,一阶二阶系统的特性,负载效应,抗干扰性

目录 3.1 概述 1测量装置的静态特性 2.标准和标准传递 3.测量装置的动态特性 4.测量装置的负载特性 5.测量装置的抗干扰性 1.线性度 2.灵敏度 3.回程误差 4.分辨力 5.零点漂移和灵敏度漂移 3.3.1 动态特性的数学描述 1.传递函数 2.频率响应函数 3.脉冲响应函数 …

汽车自研算法部署芯片份额浅思

国内汽车行业如火如荼发展,汽车从业的研发人员也激增,从三电到座舱到智能驾驶和动力底盘一体化发展。 芯片承载着算法落地,国内主流的主机厂(OEM)的EE架构规划都基本使用主流的车规级芯片,如 英飞凌(Infineon):德国半导体制造商,行业当前在预控的SOC的MCU选择TC39X…

LeetCode 面试经典150题 172.阶乘后的零

题目&#xff1a;给定一个整数 n &#xff0c;返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * ... * 3 * 2 * 1 思路&#xff1a; 代码&#xff1a; class Solution {public int trailingZeroes(int n) {return n 0 ? 0 : n / 5 trailingZeroes(n / 5);}…