方案概览
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 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”,而不是“转换”,所以对于复杂的格式,效果往往不尽如人意。

原理:
- 使用 Apache POI 读取 Word 文档的内容(文本、段落、表格等)。
- 使用 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();
}
}
}
此方案只适用于最简单的纯文本文档转换,不推荐。

docx4j (推荐免费方案)
docx4j 是一个专门处理 Office Open XML 格式(即 .docx)的 Java 库,它通过调用 Word 内置的转换功能(需要 Office 或 LibreOffice 环境)来实现高质量的转换。
原理:
- 使用
docx4j加载.docx文档。 - 调用其内置的转换器,将文档内容转换为 PDF 格式。
步骤:
-
添加依赖:
<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> -
编写转换代码:
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 的各种复杂特性支持得非常出色。
步骤:
-
下载 JAR 包: 从 Aspose 官网 下载 Aspose.Words for Java 的 JAR 包,并添加到你的项目中。
-
编写转换代码:
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 模式)进行转换。
步骤:
-
在服务器上安装 LibreOffice:
- Linux (Ubuntu/Debian):
sudo apt-get install libreoffice - Windows: 从官网下载并安装。
- macOS:
brew install --cask libreoffice
- Linux (Ubuntu/Debian):
-
使用 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,除非你只需要处理最简单的文本,并且愿意花费大量时间在样式调试上。
希望这个详细的对比和教程能帮助你做出最适合自己项目的选择!
