核心思路
在 Java 中实现 Word 转 PDF,通常有两种核心思路:

(图片来源网络,侵删)
- 使用服务器端组件(推荐):在服务器上安装一个“无头”的办公软件(如 LibreOffice),然后通过 Java 代码调用其命令行接口来完成转换,这是最稳定、兼容性最好的方法。
- 使用纯 Java 库:使用第三方 Java 库(如 Apache POI + iText, 或商业库如 Aspose.Words, Spire.Doc)直接解析 Word 文件并生成 PDF,这种方法不需要安装额外软件,但可能存在兼容性或格式还原度的问题。
使用 LibreOffice 命令行(最推荐)
这是业界最常用、最可靠的方法,LibreOffice 是一个开源的办公套件,它提供了一个强大的命令行工具 soffice,可以完美地处理文档转换。
优点
- 高兼容性:使用 LibreOffice 内核,能完美还原 Word 中的复杂格式(如表格、图片、页眉页脚、样式等)。
- 稳定可靠:作为独立进程运行,内存占用相对可控,不易导致 JVM 崩溃。
- 免费开源:LibreOffice 和其命令行接口都是免费的。
缺点
- 需要预装软件:必须在 Linux 服务器上安装 LibreOffice。
- 启动延迟:每次转换都需要启动一个新的 soffice 进程,第一次或冷启动时可能会有几秒的延迟。
详细步骤
安装 LibreOffice
在基于 Debian/Ubuntu 的系统上:
sudo apt update sudo apt install libreoffice
在基于 RedHat/CentOS 的系统上:
sudo yum install libreoffice # 或者对于较新版本 sudo dnf install libreoffice
安装完成后,你可以通过以下命令验证是否安装成功:

(图片来源网络,侵删)
soffice --version
Java 代码实现
我们将使用 ProcessBuilder 来调用 soffice 的命令行。
转换 .docx 文件
import java.io.File;
public class LibreOfficeConverter {
/**
* 使用 LibreOffice 将 Word 文档转换为 PDF
* @param inputFilePath 输入的 Word 文件路径 (.doc 或 .docx)
* @param outputDirPath 输出的 PDF 文件目录
*/
public static void convertDocxToPdf(String inputFilePath, String outputDirPath) {
File inputFile = new File(inputFilePath);
if (!inputFile.exists()) {
System.err.println("输入文件不存在: " + inputFilePath);
return;
}
// 确保输出目录存在
File outputDir = new File(outputDirPath);
if (!outputDir.exists()) {
outputDir.mkdirs();
}
// soffice 命令
// --headless: 无界面模式
// //convert-to pdf: 指定转换为 pdf 格式
// --outdir: 指定输出目录
String[] command = {
"soffice",
"--headless",
"--convert-to", "pdf",
"--outdir", outputDirPath,
inputFilePath
};
try {
System.out.println("开始转换: " + inputFilePath);
Process process = new ProcessBuilder(command).start();
// 等待命令执行完成
int exitCode = process.waitFor();
if (exitCode == 0) {
System.out.println("转换成功!");
// LibreOffice 默认会生成与原文件名相同,但扩展名为 .pdf 的文件
String outputFileName = inputFile.getName().replace(".docx", ".pdf").replace(".doc", ".pdf");
File outputFile = new File(outputDir, outputFileName);
System.out.println("PDF 文件已生成: " + outputFile.getAbsolutePath());
} else {
System.err.println("转换失败,退出码: " + exitCode);
// 读取错误输出流
java.util.Scanner s = new java.util.Scanner(process.getErrorStream()).useDelimiter("\\A");
System.err.println("错误信息: " + s.hasNext() ? s.next() : "");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// 示例用法
String wordFilePath = "/path/to/your/document.docx"; // 替换为你的 Word 文件路径
String outputDirectory = "/path/to/your/output/directory"; // 替换为你的输出目录
convertDocxToPdf(wordFilePath, outputDirectory);
}
}
转换 .doc 文件
上面的代码对 .doc 和 .docx 文件都有效,因为 LibreOffice 能自动识别。

(图片来源网络,侵删)
使用纯 Java 库(Apache POI + iText)
这种方法不依赖外部软件,所有操作都在 JVM 内部完成,它通常用于处理格式相对简单的文档。
优点
- 无外部依赖:只需引入 JAR 包,无需在服务器上安装任何软件。
- 集成度高:可以直接在 Java 应用中无缝调用。
缺点
- 兼容性差:对于复杂的 Word 文档(如复杂的表格、浮动图片、艺术字、复杂的页眉页脚等),格式还原度非常低,经常出现错乱、丢失。
- 实现复杂:直接操作 Word 和 PDF 的底层结构,代码量较大且难以维护。
- 性能问题:对于大文件,可能会消耗大量内存。
注意:直接使用 POI 读取 Word 并用 iText 写入 PDF 是一个非常复杂且不推荐的做法,更常见的做法是使用 POI 读取 Word 内容(文本、段落、表格),然后手动用 iText 重新构建 PDF,这种方法几乎无法保留原始样式。
代码示例(仅作概念演示,不推荐用于生产)
这里展示一个极度简化的例子,只提取文本并生成一个无格式的 PDF。
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import com.itextpdf.text.Document;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class SimplePoiToPdfConverter {
public static void convert(String inputDocxPath, String outputPdfPath) {
try (XWPFDocument document = new XWPFDocument(new FileInputStream(inputDocxPath));
FileOutputStream out = new FileOutputStream(outputPdfPath)) {
Document pdfDoc = new Document();
PdfWriter.getInstance(pdfDoc, out);
pdfDoc.open();
// 遍历 Word 文档中的所有段落
for (XWPFParagraph p : document.getParagraphs()) {
// 将段落文本添加到 PDF 中,所有样式丢失
pdfDoc.add(new Paragraph(p.getText()));
}
pdfDoc.close();
System.out.println("简单转换完成,但所有样式已丢失: " + outputPdfPath);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String wordFilePath = "/path/to/your/document.docx";
String pdfFilePath = "/path/to/your/output/document.pdf";
convert(wordFilePath, pdfFilePath);
}
}
Maven 依赖:
<dependencies>
<!-- Apache POI for .docx -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<!-- iText for PDF generation -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
</dependencies>
使用商业 Java 库(如 Aspose.Words)
商业库提供了强大的 API,旨在解决 POI 的兼容性问题,让开发者能以纯 Java 的方式实现高质量的转换。
优点
- 高保真度:能非常好地还原 Word 文档的格式、布局和样式。
- 功能强大:API 丰富,支持 Word 文档的读取、修改、创建和转换等几乎所有操作。
- 易于使用:API 设计直观,几行代码就能完成转换。
缺点
- 收费:需要购买许可证,对于商业项目是一笔开销(通常提供免费试用版)。
代码示例(Aspose.Words)
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import java.io.File;
public class AsposeWordsConverter {
public static void convert(String inputPath, String outputPath) {
try {
// 加载 Word 文档
Document doc = new Document(inputPath); 