Java实现Word文件转PDF的全面指南

Java实现Word文件转PDF的全面指南

在日常开发中,将Word文档转换为PDF是一项常见需求。Java生态提供了多种库支持这一功能,本文将深入探讨几种主流实现方案,包括Apache POIDocx4jiText以及结合使用的策略,并给出完整的代码示例和性能对比。

一、技术选型概览

库名称支持格式转换质量复杂度许可证
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有多个成熟方案,开发者应根据项目需求、预算和文档复杂度选择合适工具。本文提供的示例代码可直接用于快速集成,更多细节请参考官方文档。