- Apache POI + iText / Flying Saucer (推荐):纯 Java 解决方案,不依赖外部进程,但配置稍复杂。
- LibreOffice/OpenOffice Headless 模式:调用系统安装的 LibreOffice 进行转换,效果最好,最稳定,但需要额外安装软件。
- Aspose.Words for Java:商业库,功能强大,转换质量高,但需要付费(有免费试用版)。
Apache POI + iText / Flying Saucer (纯 Java)
这种方法的核心思想是:

(图片来源网络,侵删)
- 使用 Apache POI 读取
.docx文件的内容(文本、表格、图片等),重新渲染到一个内存中的 XHTML 结构中。 - 使用 Flying Saucer (一个 XHTML 到 PDF 的渲染器) 将这个 XHTML 转换为 PDF。
优点:
- 跨平台:只要有 Java 运行环境即可,无需在 Linux 上安装额外的软件。
- 无外部依赖:转换过程在 JVM 内部完成,不调用外部命令。
- 免费开源:所有依赖库都是开源的。
缺点:
- 实现复杂:代码量相对较多,需要处理 POI 和 Flying Saucer 之间的数据映射。
- 样式支持有限:对于复杂的 Word 样式(如复杂页眉页脚、特殊字体、浮动图片等),转换效果可能不如原生工具完美。
实现步骤:
添加 Maven 依赖
在你的 pom.xml 文件中添加以下依赖:

(图片来源网络,侵删)
<dependencies>
<!-- Apache POI 用于读取 .docx 文件 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<!-- Flying Saucer 用于将 XHTML 渲染为 PDF -->
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.1.22</version>
</dependency>
</dependencies>
Java 代码示例
import org.apache.poi.xwpf.usermodel.*;
import org.w3c.dom.Document;
import org.xhtmlrenderer.pdf.ITextRenderer;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
import java.util.List;
public class DocxToPdfConverter {
public static void main(String[] args) {
String inputDocxPath = "input.docx";
String outputPdfPath = "output.pdf";
try {
convertDocxToPdf(inputDocxPath, outputPdfPath);
System.out.println("转换成功: " + outputPdfPath);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void convertDocxToPdf(String docxPath, String pdfPath) throws Exception {
// 1. 使用 POI 读取 .docx 文件并构建 XHTML 字符串
String xhtmlContent = convertDocxToXhtml(docxPath);
// 2. 使用 Flying Saucer 将 XHTML 转换为 PDF
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(xhtmlContent);
renderer.layout();
renderer.createPDF(new FileOutputStream(pdfPath));
}
private static String convertDocxToXhtml(String docxPath) throws Exception {
StringBuilder xhtmlBuilder = new StringBuilder();
xhtmlBuilder.append("<html><head><meta charset=\"UTF-8\"></head><body>");
try (XWPFDocument document = new XWPFDocument(new FileInputStream(docxPath))) {
// 处理段落
for (XWPFParagraph paragraph : document.getParagraphs()) {
xhtmlBuilder.append("<p>").append(paragraph.getText()).append("</p>");
}
// 处理表格
for (XWPFTable table : document.getTables()) {
xhtmlBuilder.append("<table border=\"1\">");
for (XWPFTableRow row : table.getRows()) {
xhtmlBuilder.append("<tr>");
for (XWPFTableCell cell : row.getTableCells()) {
xhtmlBuilder.append("<td>").append(cell.getText()).append("</td>");
}
xhtmlBuilder.append("</tr>");
}
xhtmlBuilder.append("</table>");
}
}
xhtmlBuilder.append("</body></html>");
return xhtmlBuilder.toString();
}
}
调用 LibreOffice Headless 模式 (推荐)
这是最简单、最可靠的方法,因为它利用了专业的办公软件进行转换,效果几乎完美。
优点:
- 转换质量高:能完美保留 Word 文档的格式、字体、图片、页眉页脚等。
- 支持旧版
.doc:无需额外库即可支持.doc和.docx。 - 实现简单:Java 代码只需执行一个 shell 命令即可。
缺点:

(图片来源网络,侵删)
- 依赖外部软件:必须在 Linux 系统上安装 LibreOffice 或 OpenOffice。
- 性能开销:需要启动一个外部进程,转换速度可能比纯 Java 慢。
实现步骤:
安装 LibreOffice
在终端中执行以下命令(以 Ubuntu/Debian 为例):
# 更新软件包列表 sudo apt update # 安装 LibreOffice sudo apt install libreoffice
Java 代码示例
使用 Runtime.exec() 或 ProcessBuilder 来执行命令。
import java.io.File;
public class LibreOfficeConverter {
public static void main(String[] args) {
String inputPath = "input.docx";
String outputPath = "output.pdf";
String libreOfficePath = "libreoffice"; // 通常在 PATH 中
try {
convertToPdf(libreOfficePath, inputPath, outputPath);
System.out.println("转换成功: " + outputPath);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void convertToPdf(String libreOfficePath, String inputPath, String outputPath) throws Exception {
File inputFile = new File(inputPath);
File outputFile = new File(outputPath);
// 确保输入文件存在
if (!inputFile.exists()) {
throw new FileNotFoundException("输入文件不存在: " + inputPath);
}
// 使用 ProcessBuilder 可以更好地管理命令和参数
ProcessBuilder pb = new ProcessBuilder(
libreOfficePath,
"--headless", // 无头模式,不启动GUI
"--convert-to", "pdf", // 指定转换格式为 pdf
"--outdir", outputFile.getParent(), // 指定输出目录
inputFile.getAbsolutePath() // 指定输入文件
);
// 合并错误流和输出流,方便调试
pb.redirectErrorStream(true);
Process process = pb.start();
// 等待命令执行完成
int exitCode = process.waitFor();
if (exitCode != 0) {
// 读取命令的错误输出
String errorOutput = new String(process.getInputStream().readAllBytes());
throw new RuntimeException("LibreOffice 转换失败,退出码: " + exitCode + "\n错误信息: " + errorOutput);
}
System.out.println("LibreOffice 命令执行成功。");
}
}
Aspose.Words for Java
这是一个商业 Java 库,专门用于处理 Word 文档,其转换功能非常强大和精确。
优点:
- 转换质量极高:被认为是市场上最好的 Word 到 PDF 转换库之一,能高度还原原始文档。
- 功能全面:除了转换,还支持创建、修改、合并、拆分 Word 文档等丰富功能。
- API 友好:API 设计简洁易用。
缺点:
- 收费:这是一个商业产品,需要购买许可证,它提供免费的试用版,但会在生成的 PDF 上添加水印。
实现步骤:
获取 JAR 包
你可以从 Aspose 官网 下载试用版 JAR 包,并添加到你的项目中(Maven/Gradle 或手动导入)。
Java 代码示例
import com.aspose.words.*;
public class AsposeWordsConverter {
public static void main(String[] args) throws Exception {
// 如果使用试用版,会添加水印
// 如果有许可证,在此加载
// License license = new License();
// license.setLicense("Aspose.Words.Java.lic");
String inputDocxPath = "input.docx"; 