【技术】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();
        }
    }
}
相关推荐
摇滚侠2 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 核心语法 笔记39
spring boot·笔记·后端·thymeleaf
九丶弟3 小时前
SpringBoot的cache使用说明
java·spring boot·spring·cache
看兵马俑的程序员4 小时前
RAG实现-本地PDF内容加载和切片
开发语言·python·pdf
lang201509284 小时前
打造专属Spring Boot Starter
java·spring boot·后端
lang201509286 小时前
Spring Boot RSocket:高性能异步通信实战
java·spring boot·后端
洛白白7 小时前
Word文档中打勾和打叉的三种方法
经验分享·学习·word·生活·学习方法
神奇的小猴程序员7 小时前
Mutantcat Web Pdf Reader —— 开源、轻量、安全的网页 PDF 阅读器
前端·pdf
蹦跑的蜗牛8 小时前
Spring Boot使用Redis实现消息队列
spring boot·redis·后端
ekkcole8 小时前
java把word转pdf使用jar包maven依赖
java·pdf·word
Java小王子呀8 小时前
Java实现Excel转PDF
java·pdf·excel