Java实现Word文件转PDF的全面指南
Java实现Word文件转PDF的全面指南
在日常开发中,将Word文档转换为PDF是一项常见需求。Java生态提供了多种库支持这一功能,本文将深入探讨几种主流实现方案,包括Apache POI、Docx4j、iText以及结合使用的策略,并给出完整的代码示例和性能对比。
一、技术选型概览
| 库名称 | 支持格式 | 转换质量 | 复杂度 | 许可证 |
|---|---|---|---|---|
| Apache POI + iText | .docx | 中等 | 较高 | Apache 2.0 |
| Docx4j | .docx | 高 | 中等 | Apache 2.0 |
| Aspose.Words | .doc/.docx | 极高 | 低 | 商业 |
二、环境准备
以Maven项目为例,添加依赖:
<!-- Apache POI -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<!-- iText 7 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.2.3</version>
</dependency>
<!-- Docx4j -->
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
<version>11.3.7</version>
</dependency>
三、方案一:Apache POI + iText
该方案先用POI解析.docx文件,然后使用iText生成PDF。优点是完全开源,但需要手动处理样式,复杂文档可能失真。
import org.apache.poi.xwpf.usermodel.*;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.kernel.pdf.PdfWriter;
public class WordToPdfConverter {
public static void convert(String inputPath, String outputPath) throws Exception {
XWPFDocument doc = new XWPFDocument(new FileInputStream(inputPath));
PdfWriter writer = new PdfWriter(outputPath);
Document pdfDoc = new Document(writer);
for (XWPFParagraph paragraph : doc.getParagraphs()) {
String text = paragraph.getText();
if (!text.isEmpty()) {
pdfDoc.add(new Paragraph(text));
}
}
pdfDoc.close();
doc.close();
}
}
四、方案二:Docx4j
Docx4j专为.docx设计,内部使用JAXB,能较好地保留原始布局。它直接提供了PDF输出功能。
import org.docx4j.Docx4J;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
public class Docx4jConverter {
public static void convert(String inputPath, String outputPath) throws Exception {
WordprocessingMLPackage wordPkg = WordprocessingMLPackage.load(new File(inputPath));
wordPkg.setFontMapper(new IdentityPlusMapper()); // 处理字体映射
Docx4J.toPDF(wordPkg, new FileOutputStream(outputPath));
}
}
五、方案三:Aspose.Words(商业)
若预算允许,Aspose.Words是最佳选择,支持格式丰富且高质量,只需一行代码:
import com.aspose.words.Document;
Document doc = new Document("input.docx");
doc.save("output.pdf", com.aspose.words.SaveFormat.PDF);
六、性能对比与建议
- 小文件(<10页):Docx4j和POI+ iText性能相近,推荐Docx4j。
- 复杂格式(表格、图片):Docx4j和Aspose效果更好。
- 生产环境:建议用Docx4j或直接调用LibreOffice命令(无需编程但依赖外部应用)。
七、常见问题与解决
1. 字体缺失导致PDF乱码
解决方案:注册字体映射,例如在Docx4j中使用PhysicalFonts或系统字体路径。
2. 中文内容无法显示
确保PDF生成器包含中文字体(如SimSun)或通过FontProvider添加。
八、总结
Java实现Word转PDF有多个成熟方案,开发者应根据项目需求、预算和文档复杂度选择合适工具。本文提供的示例代码可直接用于快速集成,更多细节请参考官方文档。