杰瑞科技汇

Java Word如何转PDF?

方案概览

方案 优点 缺点 适用场景
Apache POI + iText 免费、开源 代码复杂,需要手动处理样式和布局。
对复杂格式(如页眉页脚、图片位置)支持不佳,容易错位。
简单文档转换,对格式要求不高的场景。
docx4j 免费、开源
专为 Office Open XML (.docx) 设计,转换保真度高。
API 相对友好。
主要支持 .docx,对旧版 .doc 支持有限。
处理超大文档时可能内存占用较高。
.docx 文档转换,要求较高格式保真度的场景。
Aspose.Words 功能强大、保真度极高
支持所有 Word 版本(.doc/.docx)。
转换效果最好,几乎与 Word 打印一致。
商业软件,需要付费购买 License 对转换质量有极高要求,且项目预算充足的企业级应用。
Spire.Doc 功能强大、保真度高
功能与 Aspose 类似,支持新旧版 Word。
提供免费版但有功能和页面限制。
商业软件,付费版才能解锁全部功能。 Aspose 的一个有力竞争者,可作为替代方案。
LibreOffice/OpenOffice Headless 免费、开源
转换质量高,因为它依赖 LibreOffice 引擎。
需要服务器上安装并运行 LibreOffice/OpenOffice,增加了部署复杂度。
转换速度相对较慢。
已经在使用或可以部署 LibreOffice 的服务器环境。

Apache POI + iText (免费,但复杂)

这种方法是纯 Java 代码实现,不依赖任何外部服务,但它的核心思想是“解析 Word,再生成 PDF”,而不是“转换”,所以对于复杂的格式,效果往往不尽如人意。

Java Word如何转PDF?-图1
(图片来源网络,侵删)

原理

  1. 使用 Apache POI 读取 Word 文档的内容(文本、段落、表格等)。
  2. 使用 iText 将这些内容重新绘制到 PDF 文档中。

缺点:样式(字体、颜色、对齐方式)、图片、页眉页脚等很难完美复现,需要大量手动调整代码。

示例代码(仅作概念展示,不推荐用于生产复杂文档)

// 需要的依赖
// <dependency>
//     <groupId>org.apache.poi</groupId>
//     <artifactId>poi</artifactId>
//     <version>5.2.3</version>
// </dependency>
// <dependency>
//     <groupId>org.apache.poi</groupId>
//     <artifactId>poi-ooxml</artifactId>
//     <version>5.2.3</version>
// </dependency>
// <dependency>
//     <groupId>com.itextpdf</groupId>
//     <artifactId>itextpdf</artifactId>
//     <version>5.5.13.3</version>
// </dependency>
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
public class PoiToPdfExample {
    public static void main(String[] args) {
        String wordPath = "input.docx";
        String pdfPath = "output_poi.pdf";
        try (FileInputStream fis = new FileInputStream(wordPath);
             XWPFDocument document = new XWPFDocument(fis);
             FileOutputStream fos = new FileOutputStream(pdfPath)) {
            Document pdfDoc = new Document();
            PdfWriter.getInstance(pdfDoc, fos);
            pdfDoc.open();
            // 遍历 Word 文档中的每一个段落
            for (XWPFParagraph p : document.getParagraphs()) {
                // 创建 PDF 段落并添加内容
                pdfDoc.add(new Paragraph(p.getText()));
            }
            pdfDoc.close();
            System.out.println("Word 转 PDF 完成!");
        } catch (IOException | DocumentException e) {
            e.printStackTrace();
        }
    }
}

此方案只适用于最简单的纯文本文档转换,不推荐。

Java Word如何转PDF?-图2
(图片来源网络,侵删)

docx4j (推荐免费方案)

docx4j 是一个专门处理 Office Open XML 格式(即 .docx)的 Java 库,它通过调用 Word 内置的转换功能(需要 Office 或 LibreOffice 环境)来实现高质量的转换。

原理

  1. 使用 docx4j 加载 .docx 文档。
  2. 调用其内置的转换器,将文档内容转换为 PDF 格式。

步骤

  1. 添加依赖:

    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-core</artifactId>
        <version>11.4.4</version> <!-- 请使用最新版本 -->
    </dependency>
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-export-fo</artifactId>
        <version>11.4.4</version>
    </dependency>
    <!-- 如果你需要在没有 Office 的服务器上转换,需要这个 -->
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-saxon</artifactId>
        <version>11.4.4</version>
    </dependency>
  2. 编写转换代码:

    import org.docx4j.Docx4J;
    import org.docx4j.convert.in.xhtml.XHTMLImporterImpl;
    import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
    import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    public class Docx4jToPdfExample {
        public static void main(String[] args) {
            String inputWordPath = "input.docx";
            String outputPdfPath = "output_docx4j.pdf";
            try {
                // 1. 加载 Word 文档
                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(inputWordPath));
                // 2. 调用转换器将 Word 转换为 PDF
                // 这是 docx4j 的核心转换方法
                org.docx4j.convert.out.pdf.PdfViaXSLFOSettings pdfSettings = new org.docx4j.convert.out.pdf.PdfViaXSLFOSettings();
                Docx4J.toPDF(wordMLPackage, new File(outputPdfPath), pdfSettings);
                System.out.println("Word 转 PDF 完成!");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

注意

  • 此方案对 .docx 文件支持最好,如果需要转换 .doc 文件,需要先用 Apache POI 将其另存为 .docx 格式,然后再进行转换。
  • 在某些服务器环境中,可能需要配置 Saxon HE 处理器以获得更好的性能。

Aspose.Words (商业付费方案,效果最好)

Aspose.Words 是业界公认的功能最强大、转换保真度最高的 Java 库,它无需安装 Office 或 LibreOffice,可以独立运行,并且对 Word 的各种复杂特性支持得非常出色。

步骤

  1. 下载 JAR 包: 从 Aspose 官网 下载 Aspose.Words for Java 的 JAR 包,并添加到你的项目中。

  2. 编写转换代码:

    import com.aspose.words.*;
    public class AsposeWordsToPdfExample {
        public static void main(String[] args) {
            // 在试用模式下,转换后的 PDF 会有一个水印
            // 需要设置 License 来移除水印
            // try {
            //     License license = new License();
            //     license.setLicense("Aspose.Words.Java.lic");
            // } catch (Exception e) {
            //     e.printStackTrace();
            // }
            String inputWordPath = "input.docx";
            String outputPdfPath = "output_aspose.pdf";
            try {
                // 1. 加载 Word 文档
                Document doc = new Document(inputWordPath);
                // 2. 保存为 PDF
                doc.save(outputPdfPath, SaveFormat.PDF);
                System.out.println("Word 转 PDF 完成!");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    优点:代码极其简单,转换质量高,无需外部依赖。 缺点:需要购买 License,价格相对较贵。


LibreOffice Headless (免费,但需环境)

这种方法利用了开源的办公软件 LibreOffice 的命令行功能,在后台(headless 模式)进行转换。

步骤

  1. 在服务器上安装 LibreOffice:

    • Linux (Ubuntu/Debian): sudo apt-get install libreoffice
    • Windows: 从官网下载并安装。
    • macOS: brew install --cask libreoffice
  2. 使用 Java 调用命令行:

    import java.io.File;
    public class LibreOfficeToPdfExample {
        public static void main(String[] args) {
            String inputWordPath = "input.docx";
            String outputPdfPath = "output_libreoffice.pdf";
            // LibreOffice 的安装路径,根据你的系统修改
            String libreOfficePath = "C:\\Program Files\\LibreOffice\\program\\soffice.exe"; // Windows
            // String libreOfficePath = "/usr/bin/libreoffice"; // Linux
            // 构建命令
            // --headless: 无界面模式
            // --convert-to pdf: 指定转换格式为 pdf
            // --outdir: 指定输出目录
            String command = String.format("\"%s\" --headless --convert-to pdf --outdir \"%s\" \"%s\"",
                    libreOfficePath,
                    new File(outputPdfPath).getParent(),
                    inputWordPath);
            try {
                System.out.println("执行命令: " + command);
                Process process = Runtime.getRuntime().exec(command);
                // 等待转换完成
                int exitCode = process.waitFor();
                if (exitCode == 0) {
                    System.out.println("Word 转 PDF 完成!");
                } else {
                    System.err.println("转换失败,退出码: " + exitCode);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    优点:免费,转换质量高,因为依赖的是成熟的办公软件引擎。 缺点:服务器必须安装并配置好 LibreOffice,增加了运维成本,转换速度可能不如纯 Java 库。


如何选择?

  • 如果你的项目是个人学习、小型项目,且对格式要求不是极致,且只处理 .docx 文件

    • 首选 docx4j,它免费、开源,转换质量在免费库中是最好的。
  • 如果你的项目是企业级应用,对转换质量有极高的要求(生成的 PDF 需要完全符合打印标准),且预算充足

    • 强烈推荐 Aspose.Words,它省心省力,效果最好,是业界的黄金标准。
  • 如果你的服务器环境已经部署了 LibreOffice,或者你无法在代码中引入第三方商业库

    • 选择 LibreOffice Headless 方案,这是一个稳定可靠的免费选择。
  • 尽量避免使用 Apache POI + iText 来做复杂的 Word 转 PDF,除非你只需要处理最简单的文本,并且愿意花费大量时间在样式调试上。

希望这个详细的对比和教程能帮助你做出最适合自己项目的选择!

分享:
扫描分享到社交APP
上一篇
下一篇