我使用 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 标签,但它仍然无法正常工作。
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 命名空间。