You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 01:01:13