无法使用 Apache FOP 在 PDF 中绘制 SVG - 遇到未知格式对象“{}svg”(fo:instream-foreign-object} 的子级

问题描述 投票:0回答:1

我使用 XSL-FO 在表中为简单的复选框创建了以下代码:

Java代码

Element svg = document.createElement("svg");
svg.setAttribute("width", "12pt");
svg.setAttribute("height", "12pt");
svg.setAttribute("viewBox", "0 0 24 24");

Element rect = document.createElement("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);
<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>
    <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>

但是,当我尝试将其转换为 PDF 时,我收到以下警告:

Unknown formatting object "{}svg" encountered (a child of fo:instream-foreign-object}

什么可能导致此错误?

我尝试将 SVG 属性添加到 FOP 的配置中并使用 fo:svg 标签,但它仍然无法正常工作。

java pdf svg xsl-fo apache-fop
1个回答
1
投票

FOP 需要知道您提供给它的 XML 类型。在本例中,有两个 XML 命名空间在起作用:格式化对象

http://www.w3.org/1999/XSL/Format
和 SVG
http://www.w3.org/2000/svg

声明命名空间有不同的方法。您可以在此示例 PDF 中看到它们。在下面的示例中,SVG 命名空间只是在 svg 元素中声明,然后 FOP 知道所有子元素都属于同一命名空间(除非声明了另一个命名空间)。

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.w3.org/1999/XSL/Format">
  <layout-master-set>
    <simple-page-master margin="10mm" page-width="210mm" page-height="297mm" master-name="simple">
      <region-body region-name="simple-body" margin-bottom="20mm" margin-top="20mm" />
    </simple-page-master>
  </layout-master-set>
  <page-sequence master-reference="simple">
    <flow flow-name="simple-body">
      <block>Hello World!</block>
      <block>
        <instream-foreign-object>
          <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>
        </instream-foreign-object>
      </block>
    </flow>
  </page-sequence>
</root>

在 Java 中,如果您只使用 createElementNS 和 SVG 命名空间,Java 会找出如何在 XML 文档中声明 SVG 命名空间。

© www.soinside.com 2019 - 2024. All rights reserved.