2. XML转PDF转换流程解析
XML转PDF的核心流程其实就两步,简单粗暴但高效:
XML解析阶段
⚠️ 先把XML拆开吃透:解析器会分析XML结构,提取出数据和层级关系。Java里常用三种解析方式:- DOM(文档对象模型):整个XML加载到内存,适合小文件但耗资源
- SAX(简单XML API):事件驱动流式解析,内存友好但代码复杂
- StAX(流式API):游标式解析,平衡了性能和易用性
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);
}
}
关键执行步骤:
- 用
FopFactory
初始化引擎 - 指定PDF输出流
- 通过XSLT样式表转换XML
- 将结果交给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