XML文件如何转换为PDF Java使用Flying Saucer转换XML

来源:编程学习作者:卡拉米头衔:草根站长
导读:本期聚焦于小伙伴创作的《XML文件如何转换为PDF Java使用Flying Saucer转换XML》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《XML文件如何转换为PDF Java使用Flying Saucer转换XML》有用,将其分享出去将是对创作者最好的鼓励。

在Java项目里实现XML文件到PDF的转换,Flying Saucer是常用的解决方案,它依赖iText渲染引擎,能够将符合XHTML标准的XML内容输出为格式规范的PDF文档,适配多数报表生成、数据导出的业务场景。

环境依赖准备

使用Flying Saucer需要引入两个核心依赖,分别是Flying Saucer的核心包和iText的适配包,Maven项目可以在pom.xml中添加如下依赖:

<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>flying-saucer-pdf</artifactId>
    <version>9.1.22</version>
</dependency>
<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>flying-saucer-pdf-itext5</artifactId>
    <version>9.1.22</version>
</dependency>

XML转PDF的核心逻辑

Flying Saucer本身不直接处理任意格式的XML,需要先将原始XML转换为XHTML格式,因为Flying Saucer的渲染规则是基于XHTML标准设计的。转换过程通常分为两步:

  • 第一步:使用XSLT将原始XML转换为符合XHTML规范的中间文件
  • 第二步:使用Flying Saucer读取XHTML内容,渲染生成PDF文件

XML转XHTML的实现

我们可以通过Java内置的javax.xml.transform包完成XSLT转换,首先需要准备一个XSLT样式文件,定义XML到XHTML的映射规则,示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
    <xsl:template match="/">
        <html>
            <head>
                <title>XML转换结果</title>
                <style>
                    body { font-family: SimSun; }
                    .title { font-size: 20px; font-weight: bold; }
                </style>
            </head>
            <body>
                <div class="title">
                    <xsl:value-of select="root/title"/>
                </div>
                <div>
                    内容:<xsl:value-of select="root/content"/>
                </div>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

对应的原始XML文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <title>测试文档</title>
    <content>这是一份XML转换PDF的测试内容</content>
</root>

使用Java代码实现XSLT转换的逻辑如下:

import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
import java.io.FileOutputStream;

public class XmlToXhtmlUtil {
    public static void transformXmlToXhtml(String xmlPath, String xsltPath, String outputXhtmlPath) throws Exception {
        // 创建转换器工厂
        TransformerFactory factory = TransformerFactory.newInstance();
        // 加载XSLT样式文件
        Source xsltSource = new StreamSource(new File(xsltPath));
        Transformer transformer = factory.newTransformer(xsltSource);
        // 加载原始XML文件
        Source xmlSource = new StreamSource(new File(xmlPath));
        // 输出转换后的XHTML文件
        Result xhtmlResult = new StreamResult(new FileOutputStream(outputXhtmlPath));
        // 执行转换
        transformer.transform(xmlSource, xhtmlResult);
    }
}

使用Flying Saucer生成PDF

得到XHTML文件后,就可以调用Flying Saucer的API生成PDF,核心代码如下:

import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class PdfGenerator {
    public static void generatePdfFromXhtml(String xhtmlPath, String outputPdfPath) throws Exception {
        // 创建iText渲染器
        ITextRenderer renderer = new ITextRenderer();
        // 设置XHTML文件路径,注意如果是本地文件需要加file协议前缀
        String url = new File(xhtmlPath).toURI().toURL().toString();
        renderer.setDocument(url);
        // 执行布局渲染
        renderer.layout();
        // 输出PDF文件
        try (OutputStream os = new FileOutputStream(outputPdfPath)) {
            renderer.createPDF(os);
        }
    }
}

完整调用示例

将两个步骤组合起来,完整的转换流程代码如下:

public class XmlToPdfDemo {
    public static void main(String[] args) {
        String xmlPath = "D:/test.xml";
        String xsltPath = "D:/transform.xslt";
        String xhtmlPath = "D:/temp.xhtml";
        String pdfPath = "D:/output.pdf";
        try {
            // 第一步:XML转XHTML
            XmlToXhtmlUtil.transformXmlToXhtml(xmlPath, xsltPath, xhtmlPath);
            // 第二步:XHTML转PDF
            PdfGenerator.generatePdfFromXhtml(xhtmlPath, pdfPath);
            System.out.println("转换完成,PDF文件路径:" + pdfPath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

常见问题与解决方法

中文显示乱码

Flying Saucer默认不支持中文字体,需要在XHTML的样式中指定中文字体,同时将字体文件加载到渲染器中,修改生成PDF的代码:

import org.xhtmlrenderer.pdf.ITextRenderer;
import org.xhtmlrenderer.resource.FSEntityResolver;
import com.lowagie.text.pdf.BaseFont;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class PdfGenerator {
    public static void generatePdfFromXhtml(String xhtmlPath, String outputPdfPath) throws Exception {
        ITextRenderer renderer = new ITextRenderer();
        // 加载中文字体,这里以宋体为例,字体文件路径根据实际位置调整
        String fontPath = "D:/simsun.ttc";
        renderer.getFontResolver().addFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        String url = new File(xhtmlPath).toURI().toURL().toString();
        renderer.setDocument(url);
        renderer.layout();
        try (OutputStream os = new FileOutputStream(outputPdfPath)) {
            renderer.createPDF(os);
        }
    }
}

XHTML格式校验失败

Flying Saucer对XHTML的格式要求比较严格,标签必须闭合、属性值需要加引号,如果转换时报格式错误,可以先使用XML校验工具检查XHTML文件是否符合规范,也可以调整XSLT样式文件,确保输出的XHTML标签正确。

注意事项

  • 原始XML如果结构复杂,需要对应调整XSLT样式文件,确保转换后的XHTML包含所有需要展示的内容
  • 生成PDF时如果需要添加页眉页脚、页码,可以在XHTML的样式中使用CSS的@page规则定义
  • 依赖版本尽量保持一致,避免不同版本之间的兼容性问题导致转换失败

XML_to_PDFJavaFlying_SaucerXHTML修改时间:2026-07-05 21:00:37

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。