2. XML转PDF转换流程解析

XML转PDF的核心流程其实就两步,简单粗暴但高效:

  1. XML解析阶段
    ⚠️ 先把XML拆开吃透:解析器会分析XML结构,提取出数据和层级关系。Java里常用三种解析方式:

    • DOM(文档对象模型):整个XML加载到内存,适合小文件但耗资源
    • SAX(简单XML API):事件驱动流式解析,内存友好但代码复杂
    • StAX(流式API):游标式解析,平衡了性能和易用性
  2. PDF生成阶段
    ✅ 把解析出的数据重新组装:根据XML结构创建PDF元素(段落/表格/图片等),按照预设样式排版输出。关键是要保持数据结构不变形。

3. Apache FOP 实战指南

Apache FOP是XML转PDF的利器,基于XSL-FO标准,输出质量堪比专业排版软件。

3.1 FOP工作原理

FOP的转换流水线分四步走:

  • XML解析:读取源文件,提取数据骨架
  • XSL-FO转换:用样式表把XML元素映射成PDF组件(比如<title>变成带字体的标题段落)
  • FO渲染引擎:将格式化对象渲染成可视化内容
  • PDF输出:生成独立PDF文件,支持打印/分发

3.2 FOP代码实战

先在pom.xml添加依赖(版本选2.9稳定版):

<dependency>
    <groupId>org.apache.xmlgraphics</groupId>
    <artifactId>fop</artifactId>
    <version>2.9</version>
</dependency>

核心转换方法实现:

void convertXMLtoPDFUsingFop(String xmlFilePath, String xsltFilePath, String pdfFilePath) throws Exception {
    // 初始化FOP工厂
    FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

    try (OutputStream out = new BufferedOutputStream(Files.newOutputStream(new File(pdfFilePath).toPath()))) {
        // 创建PDF输出目标
        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
        
        // 加载XSLT转换器
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer(new StreamSource(new File(xsltFilePath)));
        
        // 执行转换
        Source src = new StreamSource(new File(xmlFilePath));
        Result res = new SAXResult(fop.getDefaultHandler());
        transformer.transform(src, res);
    }
}

关键执行步骤:

  1. FopFactory初始化引擎
  2. 指定PDF输出流
  3. 通过XSLT样式表转换XML
  4. 将结果交给FOP渲染器生成PDF

4. iText 库深度应用

iText是PDF生成领域的瑞士军刀,通过HTML中间层实现XML转PDF。

4.1 iText核心机制

iText的转换套路有两种:

  • HTML中转方案
    XML → HTML → PDF,利用iText的HTML解析能力,适合Web开发场景
  • 直接渲染方案
    支持XHTML/SVG/MathML等格式,可嵌入CSS样式,精准控制布局

4.2 iText代码实现

Maven依赖配置(注意选5.5.x稳定分支):

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.3</version>
</dependency>

极简转换示例:

public static void convertXMLtoPDFUsingIText(String xmlFilePath, String pdfFilePath) throws Exception {
    try (FileOutputStream outputStream = new FileOutputStream(pdfFilePath)) {
        // 创建PDF文档对象
        Document document = new Document();
        PdfWriter.getInstance(document, outputStream);
        document.open();

        // 直接读取XML内容写入PDF
        String xmlContent = new String(Files.readAllBytes(Paths.get(xmlFilePath)));
        document.add(new Paragraph(xmlContent));
        
        // 关闭资源
        document.close();
    }
}

⚠️ 注意:这个基础示例只是简单嵌入XML文本,实际生产需要结合XML解析和样式处理。

5. 总结对比

工具 优势 适用场景
Apache FOP 格式控制精准,支持复杂排版 报表/票据等专业文档生成
iText 生态丰富,HTML/CSS支持友好 Web内容转换/动态PDF生成

掌握这两种方案,基本能覆盖90%的XML转PDF需求。实际开发中踩坑点主要集中在:

  • FOP的XSL-FO样式调试
  • iText的内存管理(大文件处理)
  • 中文字体渲染问题

完整示例代码已上传GitHub:xml-2-pdf-demo


原始标题:How to Convert XML to PDF | Baeldung