使用Fonet渲染XSL生成PDF时抛出Unknown formatting object ^h2异常
问题成因
Fonet是基于XSL-FO标准实现的PDF渲染引擎,仅支持识别符合XSL-FO规范的格式化对象标签,原生不具备HTML标签解析能力。
你在XSLT中配置了disable-output-escaping="yes",会把Text节点存储的原始HTML字符串直接拼入转换结果。Fonet渲染过程中读到<h2>这类HTML标签时,会将其判定为未定义的FO标签,直接抛出Unknown formatting object ^h2异常。如果Text节点只包含纯文本,输出内容不存在非法标签,功能就可以正常运行。
解决方案
根据项目实际情况二选一即可:
- 方案1:在转换环节完成HTML到XSL-FO的映射
不要直接输出原始HTML,编写XSLT匹配规则,将用到的HTML标签、内联样式逐一转换为合法的XSL-FO标签和属性,常用映射关系参考:- 块级标题标签(h2/h4等):对应
<fo:block>标签,通过font-size、font-weight、space-after属性分别控制字号、字重、段后间距 - 行内格式标签:
<strong>/<b>映射为font-weight="bold",<em>/<i>映射为font-style="italic",<u>映射为text-decoration="underline" - 通用样式属性:HTML内联样式里的
text-align、color、background-color可以直接映射为FO标签的同名属性
如果业务中用到的HTML结构复杂、样式多变,可以先通过结构化转换完成HTML到XSL-FO的转义,再将生成的合法FO内容传入Fonet渲染。
- 块级标题标签(h2/h4等):对应
- 方案2:更换为原生支持HTML渲染的PDF组件
如果不想长期维护HTML到XSL-FO的映射逻辑,可以直接替换渲染库,选择支持HTML+CSS直接转PDF的组件,跳过XSL-FO转换流程,对你当前存储的带内联样式的HTML片段兼容性更好,开发维护成本更低。
内容的提问来源于stack exchange,提问作者ThisIsNicola
相关产品推荐
相关产品推荐

