使用Apache FOP生成PDF时绘制SVG报错:未知格式对象{}svg
解决FOP转换PDF时"Unknown formatting object '{}svg'"警告的问题
你遇到的警告核心原因是SVG元素未声明正确的XML命名空间,FOP无法识别不带命名空间的<svg>标签,将其误判为未知的XSL-FO格式化对象。
问题根源
FOP处理fo:instream-foreign-object中的SVG内容时,要求<svg>标签必须属于SVG官方命名空间(http://www.w3.org/2000/svg)。你当前的代码里的<svg>没有指定该命名空间,导致FOP无法识别这是SVG图形,从而触发警告。
修复方案
1. 修正Java代码
创建SVG元素时,必须使用命名空间URI来生成元素:
// 定义SVG命名空间 String SVG_NAMESPACE = "http://www.w3.org/2000/svg"; // 使用命名空间创建svg元素 Element svg = document.createElementNS(SVG_NAMESPACE, "svg"); svg.setAttribute("width", "12pt"); svg.setAttribute("height", "12pt"); svg.setAttribute("viewBox", "0 0 24 24"); // 同样用命名空间创建rect元素 Element rect = document.createElementNS(SVG_NAMESPACE, "rect"); rect.setAttribute("x", "2"); rect.setAttribute("y", "2"); rect.setAttribute("width", "20"); rect.setAttribute("height", "20"); rect.setAttribute("fill", "none"); rect.setAttribute("stroke", "black"); svg.appendChild(rect);
2. 修正XSL-FO代码
直接在<svg>标签上添加命名空间声明:
<fo:table-cell border="solid 1px black" font-family="Arial" font-size="12pt" padding="2pt"> <fo:block> <fo:inline>Checkbox: </fo:inline> <fo:inline> <fo:instream-foreign-object> <!-- 新增xmlns属性指定SVG命名空间 --> <svg xmlns="http://www.w3.org/2000/svg" height="12pt" viewBox="0 0 24 24" width="12pt"> <rect fill="none" height="20" stroke="black" width="20" x="2" y="2"/> </svg> </fo:instream-foreign-object> </fo:inline> </fo:block> </fo:table-cell>
额外说明
- 无需使用
fo:svg标签:FOP的fo:svg是旧版扩展,标准做法是用fo:instream-foreign-object包裹带命名空间的标准SVG标签。 - 默认SVG支持:FOP默认启用SVG处理,无需额外配置,只要命名空间正确即可正常渲染。
内容的提问来源于stack exchange,提问作者KnightDanila
相关产品推荐
相关产品推荐

