【技术】Spring Boot 将 Word 转换为 PDF 2.0 版本

之前写过一篇 Spring Boot 将 Word 转换为 PDF 的文章,但是有评论说导入依赖有问题,还存在依赖冲突的问题。索性再来一个完整版的代码,之前的完整版代码找不到了,又重新整理了一下,依赖导入和之前不太一样,代码写法类似。

1、导入依赖
核心依赖:

<!-- Apache POI -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.15</version>
</dependency><!-- PdfConverter -->
<dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>org.apache.poi.xwpf.converter.pdf</artifactId><version>1.0.6</version>
</dependency>

完整 pom.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.18</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.riu</groupId><artifactId>spring-boot-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-boot-demo</name><description>spring-boot-demo</description><properties><java.version>8</java.version></properties><dependencies><!-- Web 启动器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Thymeleaf 启动器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!-- Apache POI --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.15</version></dependency><!-- PdfConverter --><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>org.apache.poi.xwpf.converter.pdf</artifactId><version>1.0.6</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

2、用于上传文件的页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/w2p/convert" method="post" enctype="multipart/form-data"><input type="file" name="file"><input type="submit" value="转换"/>
</form>
[[${result}]]
</body>
</html>

3、控制层代码

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;@Controller
@RequestMapping("/w2p")
public class FileConversionController {/*** 跳转 w2p 页面,提交文件* @return*/@GetMappingpublic String w2p(){return "/w2p/w2p";}/*** 文件转换:word 装换为 PDF** @param file 源 word 文件* @return*/@PostMapping("/convert")public ResponseEntity<byte[]> convertWordToPdf(@RequestParam("file") MultipartFile file) {try {// 创建 word 临时文件对象File wordFile = File.createTempFile("word", ".docx");// 临时 word 文件写入磁盘file.transferTo(wordFile);// 建 pdf 临时文件对象File pdfFile = File.createTempFile("pdf", ".pdf");// 调用转换工具类WordToPdfConverter converter = new WordToPdfConverter();// 转换 PDFconverter.convertToPdf(wordFile, pdfFile);/* PDF 文件下载 */FileInputStream fis = new FileInputStream(pdfFile);byte[] bytes = new byte[fis.available()];fis.read(bytes);// 删除 word 临时文件wordFile.delete();fis.close();pdfFile.delete();// 设置下载的响应头信息HttpHeaders hh = new HttpHeaders();hh.setContentDispositionFormData("attachement", pdfFile.getName());return new ResponseEntity<byte[]>(bytes,  hh, HttpStatus.OK);/* PDF 文件下载 */} catch (IOException e) {e.printStackTrace();}return null;}
}

4、PDF 转换类

import org.apache.poi.xwpf.converter.pdf.PdfConverter;
import org.apache.poi.xwpf.usermodel.XWPFDocument;import java.io.*;public class WordToPdfConverter {public void convertToPdf(File wordFile, File pdfFile) throws IOException {InputStream inputStream = null;OutputStream outputStream = null;XWPFDocument document = null;try {// 文件输入流inputStream = new FileInputStream(wordFile);// 文件输出流outputStream = new FileOutputStream(pdfFile);document = new XWPFDocument(inputStream);PdfConverter.getInstance().convert(document, outputStream, null);} catch (IOException e){e.printStackTrace();} finally {// 释放资源document.close();outputStream.close();inputStream.close();}}
}

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

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

相关文章

【KingSCADA】通过地址引用和弹窗模板实现设备控制

当相同的设备过多时&#xff0c;要做很多相同的弹窗&#xff0c;这种情况下可以通过地址引用和弹窗模板实现设备控制。 1.变量创建 2.画面开发 以阀门控制为例&#xff0c;只需要做一个阀门控制界面模板 3.地址引用 # 4.实现效果

eCognition 样本标注与导出

目录 一、可导出shp的样本标注方式 1、选择样本 2、导出样本shp 3、附录:转成样本用于训练 二、只能导出tif,不可导出shp 1、打开样本工具栏 2、选择样本 3、导出标注

每日算法4/21

LCR 073. 爱吃香蕉的狒狒 题目 狒狒喜欢吃香蕉。这里有 N 堆香蕉&#xff0c;第 i 堆中有 piles[i] 根香蕉。警卫已经离开了&#xff0c;将在 H 小时后回来。 狒狒可以决定她吃香蕉的速度 K &#xff08;单位&#xff1a;根/小时&#xff09;。每个小时&#xff0c;她将会选…

web自动化系列-selenium的3种弹框操作(十二)

在进行功能测试时 &#xff0c;经常会遇到出现各种的弹出的提示 &#xff0c;比如删除数据给出提示 、做某个操作时也会弹框给出一些友好提示 &#xff0c;因为这些弹框都是做web操作时的一些常用组件 &#xff0c;所以&#xff0c;selenium就不得不支持这些组件 。 1.弹框介绍…

随机森林计算指标重要性—从决策树到随机森林Python实现

文章目录 前言一、节点二、决策树2.1 案例分析——优良的水稻2.2 案例分析——家庭财富水平 三、随机森林三、Python代码实现3.1 关键问题3.1.1 节点的表示3.1.2 决策树的表示** 根节点划分左右子树的依据 **3.1.3 随机森林的构造与重要性的表示 3.2 节点类3.2 决策树类3.2.1 初…

AI-windows下使用llama.cpp部署本地Chinese-LLaMA-Alpaca-2模型

文章目录 Llamp.cpp环境配置Chinese-LLaMA-Alpaca-2模型介绍模型下载转换生成量化模型Anaconda环境安装运行Llamp.cpp环境配置 git clone git@github.com:ggerganov/llama.cpp.git cd llama.cpp mkdir build cd build cmake .. cmake --build . --config Release生成的文件在.…

redis实现未支付时间超时就删除订单,并给前端反应一个已过期

1.创建订单缓存&#xff0c;设置过期时间为一分钟 now 是一个表示当前时间的对象&#xff0c;offset 方法用于对当前时间进行偏移。 redisTemplate.expireAt(paymentKey, now.offset(DateField.SECOND, 60)); 2.创建KeyExpiredListener类并且继承KeyExpirationEventMessageLis…

安装Fake UserAgent 库的方法最终解答!_Python库

安装Python库Fake UserAgent 我的环境&#xff1a;Window10&#xff0c;Python3.7&#xff0c;Anaconda3&#xff0c;Pycharm2023.1.3 Fake UserAgent Fake UserAgent 是一个Python库&#xff0c;用于生成随机或特定的用户代理&#xff08;UserAgent&#xff09;字符串。用户…

明日周刊-第7期

转眼间就又快到了五一假期&#xff0c;小长假有什么计划吗。封面配图是杭州高架上的月季花&#xff0c;非常好看。 文章目录 一周热点资源分享言论歌曲推荐 一周热点 鸿蒙系统持续扩大影响力&#xff1a;近期&#xff0c;华为官方宣布广东省已有超过600款应用加入鸿蒙系统&…

【自用】个人の画版规范

供电 总结起来就是&#xff1a;从正面看。从左到右的顺序是 VCC GND VEE&#xff0c;若是单电源则是VEE GND GND。 尽量用3p的。 XH2.54 接线端子

每天五分钟机器学习:神经网络模型参数的选择

本文重点 在深度学习和人工智能的浪潮中,神经网络作为其中的核心力量,发挥着举足轻重的作用。然而,神经网络的性能并非一蹴而就,而是需要经过精心的参数选择和调优。 神经网络由大量的神经元组成,每个神经元之间通过权重进行连接。这些权重,以及神经元的偏置、激活函数…

大模型prompt engineering api开发

项目目标 1.熟悉 LangChain,Rag等大模型开发开源知识&#xff0c; 2.了解llm开发的全部流程&#xff0c;独立开发个人的小助手。 环境配置 使用conda 独立分配一个环境 conda create -n llm-universe conda activate llm-universe cd 项目文件夹 pip install -r requir…

如何使k8s命令补全

文章目录 如果是centos系统 直接执行下面的命令即可 yum -y install bash-completionsource /usr/share/bash-completion/bash_completion source <(kubectl completion bash)kubectl get nodeskubectl completion bash > ~/.kube/completion.bash.incsource /root/.kub…

9.Eureka服务发现+Ribbon+RestTemplate服务调用

order-service服务通过服务名称来代替 ip:port的方式访问user-service服务的接口。 原来的请求代码&#xff1a; Service public class OrderServiceImpl implements OrderService {Autowiredprivate OrderMapper orderMapper;Autowiredprivate RestTemplate restTemplate;Ov…

Java-IDEA-类注释快捷键

1 需求 2 接口 3 示例 File-->Settings-->Editor-->File and Code Templaes中的Class /*** ClassName: ${NAME}* Description: TODO* Author: TODO* Version: TODO* Date: ${DATE} ${TIME}*/ 4 参考资料 IDEA设置类快捷注释_idea add to custom tags-CSDN博客 IDE…

react ts redux 的配置和使用、解决浏览器刷新后数据不存在

安装 npm i reduxjs/toolkit react-redux浏览器插件 - Redux DevTools(推荐但不强制使用 src 下创建 store&#xff0c;其中 index.ts/index.js 作为modules中所有store的集合 store/index.ts配置 import { configureStore } from reduxjs/toolkitconst store configureStor…

JMeter--定时器--同步定时器

一、集合点 集合点是测试脚本中的一个标记&#xff0c;当每个虚拟用户执行到标记处时&#xff0c;会停留在标记处等待其他的虚拟用户&#xff0c;当达到预期设置的并发数时&#xff0c;标记处的所有用户同时启动执行后续的请求&#xff1b; 集合点会产生瞬间高并发&#xff0c;…

PHP反序列化漏洞原理(附带pikachu靶场演示)

1.反序列化概念 序列化:是将变量转换为可保存或传输的字符串的过程;实现函数是serialize()反序列化:就是在适当的时候把这个字符串再转化成原来的变量使用&#xff0c;就是序列化的逆过程。实现函数是unserialize() 直白一点就是&#xff1a;序列化是把对象转换成字节流&#…

SpringAOP从入门到源码分析大全(四)SpringAOP的源码分析

文章目录 系列文档索引六、EnableAspectJAutoProxy源码分析1、AnnotationAwareAspectJAutoProxyCreator源码&#xff08;1&#xff09;wrapIfNecessary方法&#xff08;2&#xff09;createProxy 2、getAdvicesAndAdvisorsForBean查找所有Advisor&#xff08;1&#xff09;find…

深入理解CAS机制-基础使用与三大问题

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 原子性问题 3. 乐观锁与悲观锁 4. CAS操作 5. CAS算法带来的三大…