如何使用XSL FO与XML文档生成PDF?附现有XSLT实现代码
用XSL FO + XML生成PDF的可行方案及技术建议
当然可以用XSL FO结合XML生成PDF,但要注意:浏览器原生的XSLTProcessor(也就是你现有代码里用的工具)只能把XML转成DOM片段(HTML/XML),没法直接把XSL FO渲染成PDF——因为XSL FO是专门的排版格式,需要专用的FO处理器来转成PDF。
一、优先推荐:后端处理(兼容性好、性能稳定)
后端有成熟的XSL FO处理工具,分两种场景操作:
- 如果你的「XSL FO」是指能将XML转换为XSL FO文档的XSLT样式表:
- 把XML和XSLT样式表传到后端,先用XSLT处理器(比如Java的Saxon、Node.js的
xslt3)将XML转换为标准的XSL FO文档。 - 再用FO处理器(比如Apache FOP、RenderX XEP)把XSL FO文档渲染成PDF。
- 把XML和XSLT样式表传到后端,先用XSLT处理器(比如Java的Saxon、Node.js的
- 如果已经有现成的XSL FO文档:直接用FO处理器转成PDF即可。
二、前端处理(限制较多,仅适合轻量场景)
前端没有原生支持FO转PDF的API,只能依赖第三方WebAssembly库(比如fop-wasm,是Apache FOP的WebAssembly移植版),步骤如下:
- 用你现有代码的思路,先把XML通过XSLT转换成XSL FO文档(如果还没生成FO的话),代码示例:
var AppModule = function AppModule() {}; AppModule.prototype.transformXMLToFO = function (XML, XSLTForFO) { let xmlStr = b64DecodeUnicode(XML?.replaceAll("\r\n", "")); let xsltStylesheet = b64DecodeUnicode(XSLTForFO?.replaceAll("\r\n", "")); const parser = new DOMParser(); let xmlDoc = parser.parseFromString(xmlStr, "text/xml"); let xsltDoc = parser.parseFromString(xsltStylesheet, "application/xml"); let xsltProcessor = new XSLTProcessor(); xsltProcessor.importStylesheet(xsltDoc); // 生成XSL FO片段(XML格式) let foFragment = xsltProcessor.transformToFragment(xmlDoc, document); let foStr = new XMLSerializer().serializeToString(foFragment); return foStr; };
- 把生成的FO字符串传入
fop-wasm这类库,在前端直接生成PDF。
关键注意事项
- 浏览器的
XSLTProcessor仅支持XSLT 1.0,如果你的XSL FO样式表是XSLT 2.0/3.0版本,前端无法处理,必须用后端的XSLT处理器(比如Saxon)。 - 前端FO转PDF的库体积通常较大(比如
fop-wasm包大小超10MB),会影响页面加载速度,所以非必要不建议用前端方案。
内容的提问来源于stack exchange,提问作者Lakshmi Reddy Kishtipati
相关产品推荐
相关产品推荐

