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

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

1、导入依赖

核心依赖:

xml 复制代码
<!-- 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 复制代码
<?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、用于上传文件的页面

html 复制代码
<!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、控制层代码

java 复制代码
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
     */
    @GetMapping
    public 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();
            // 转换 PDF
            converter.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 转换类

java 复制代码
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();
        }
    }
}
相关推荐
小飞Coding4 小时前
Spring Boot 中关于 Bean 加载、实例化、初始化全生命周期的扩展点
spring boot
小飞Coding5 小时前
彻底搞懂 Spring 容器导入配置类:@EnableXXX 与 spring.factories 核心原理
spring boot
悟空码字1 天前
Spring Boot 整合 MongoDB 最佳实践:CRUD、分页、事务、索引全覆盖
java·spring boot·后端
皮皮林5513 天前
拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍~
java·spring boot
用户908324602735 天前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
用户8307196840826 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解6 天前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解6 天前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记6 天前
Spring Boot Web MVC配置详解
spring boot·后端
初次攀爬者7 天前
Kafka 基础介绍
spring boot·kafka·消息队列