Java 一键将 Word 文档转为 PDF

嘿,朋友们!在开发中,经常会碰到需要把 Word 文档转换成 PDF 格式的需求,像生成报告、合同啥的。Java 有不少好用的库能实现这个功能,下面就给大家介绍两种常见的方法,分别使用 Apache POI 和 Docx4J 结合 iText 库来实现 Word 转 PDF。

方法一:使用 Apache POI 和 iText

1. 引入依赖

如果你用 Maven 管理项目,在 pom.xml 里添加以下依赖:

复制代码
XML 复制代码
<dependencies>
    <!-- Apache POI 处理 Word 文档 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version>
    </dependency>
    <!-- iText 生成 PDF 文档 -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.13.3</version>
    </dependency>
</dependencies>

2. 代码示例

复制代码
java 复制代码
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.PdfWriter;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.*;

public class WordToPdfWithPOI {
    public static void main(String[] args) {
        try {
            // 读取 Word 文档
            FileInputStream fis = new FileInputStream("input.docx");
            XWPFDocument document = new XWPFDocument(fis);

            // 创建 PDF 文档
            Document pdfDoc = new Document();
            PdfWriter.getInstance(pdfDoc, new FileOutputStream("output.pdf"));
            pdfDoc.open();

            // 遍历 Word 文档的段落
            for (XWPFParagraph paragraph : document.getParagraphs()) {
                StringBuilder text = new StringBuilder();
                // 遍历段落中的文本运行对象
                for (XWPFRun run : paragraph.getRuns()) {
                    text.append(run.getText(0));
                }
                // 将段落文本添加到 PDF 文档中
                Paragraph pdfParagraph = new Paragraph(text.toString());
                pdfDoc.add(pdfParagraph);
            }

            // 关闭文档和流
            pdfDoc.close();
            document.close();
            fis.close();

            System.out.println("Word 转 PDF 成功!");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Word 转 PDF 失败:" + e.getMessage());
        }
    }
}

3. 代码解释

  • 读取 Word 文档 :用 FileInputStream 读取 input.docx 文件,再用 XWPFDocument 类把它加载到内存。

  • 创建 PDF 文档 :创建 Document 对象表示 PDF 文档,用 PdfWriter 关联输出流,然后打开文档准备写入内容。

  • 遍历 Word 文档段落 :遍历 Word 文档的每个段落,把段落里的文本提取出来,添加到 StringBuilder 里,再创建 Paragraph 对象添加到 PDF 文档中。

  • 关闭文档和流:操作完成后,关闭 PDF 文档、Word 文档和输入流。

方法二:使用 Docx4J

1. 引入依赖

pom.xml 里添加以下依赖:

复制代码
XML 复制代码
<dependencies>
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-JAXB-Internal</artifactId>
        <version>11.4.9</version>
    </dependency>
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
        <version>11.4.9</version>
    </dependency>
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j</artifactId>
        <version>11.4.9</version>
    </dependency>
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-export-fo</artifactId>
        <version>11.4.9</version>
    </dependency>
</dependencies>

2. 代码示例

复制代码
java 复制代码
import org.docx4j.Docx4J;
import org.docx4j.convert.out.FOSettings;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class WordToPdfWithDocx4J {
    public static void main(String[] args) {
        try {
            // 加载 Word 文档
            WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File("input.docx"));

            // 创建 FOSettings 对象
            FOSettings foSettings = Docx4J.createFOSettings();
            foSettings.setWmlPackage(wordMLPackage);

            // 创建输出流
            OutputStream os = new FileOutputStream(new File("output.pdf"));

            // 转换并保存为 PDF
            Docx4J.toPDF(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);

            // 关闭输出流
            os.close();

            System.out.println("Word 转 PDF 成功!");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Word 转 PDF 失败:" + e.getMessage());
        }
    }
}

3. 代码解释

  • 加载 Word 文档 :用 WordprocessingMLPackage.load 方法加载 input.docx 文件。

  • 创建 FOSettings 对象FOSettings 用于配置转换设置,把加载的 Word 文档设置进去。

  • 创建输出流 :创建 FileOutputStream 用于输出 PDF 文件。

  • 转换并保存为 PDF :调用 Docx4J.toPDF 方法进行转换,并将结果保存到输出流。

  • 关闭输出流:操作完成后,关闭输出流。

嘿,朋友们!这两种方法都能帮你用 Java 把 Word 文档转换成 PDF。你可以根据自己的需求和喜好选择合适的方法。赶紧动手试试,让你的程序轻松搞定文档转换!

相关推荐
咩咩啃树皮7 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚7 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白9 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司9 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地10 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415910 小时前
TCP超时重传机制是为了解决什么问题?
java
莫逸风13 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898613 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112314 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员14 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus