很抱歉错误的澄清。我需要将此 .svg 文件转换为 pdf,我现在才刚刚开始开发,所以对第一步真的很困惑。另外,我想知道,如果我的初始输入是一个 .svg 文件,我是否必须在开始使用 XSLT 之前将其显式转换为 .xml?
SVG 文件是SVG 命名空间中的 XML 文件。是否需要转换 XML 取决于您将如何使用它。如果您打算使用 Inkscape(一个 SVG 编辑器)之类的工具进行批量打印,您不会这样做。
如果你打算使用 XSL-FO 之类的东西,你会的。@Zoltan Hamori 的回答有点误导。您可以使用 saxon 执行 XSLT 转换(创建 XSL-FO),但仍需要 XSL-FO 处理器从 XSL-FO 创建 PDF。
Zoltan 提到了 FOP(Apache 格式化对象处理器),但他说 FOP 和 XSL-FO 是一样的;他们不是。他的代码示例是一个 XSL-FO 表(命名空间中的 XML fo
)。您需要诸如 FOP、RenderX、Antenna House 等处理器来从 XSL-FO 创建 PDF。
基本上你需要的是:
- XML 输入(这将是您的 SVG 文件)
- XSLT 转换以创建 XSL-FO。
- XSL-FO 处理器从 XSL-FO 创建 PDF
在学习 XSLT 的同时学习 XSL-FO 会很困难,但我将向您展示两种在 PDF 中输出 SVG 的方法。
第一种方法是使用fo:external-graphic
.
第二种方法是使用fo:instream-foreign-object
.
由于 XML 输入是 SVG XML,我会选择第二个选项。但是,我不确定这对处理时间有什么影响以及哪种方式更有效。
我在下面展示了一个示例。由于我展示了两种输出 SVG 的方法,这将创建一个 2 页的 PDF。每个页面都有 SVG 图形。
笔记
- 为了测试,我使用了 Inkscape 附带的示例 SVG 文件。(我从 XSL-FO 输出中删除了大部分 SVG XML,因为它非常大。)
- 对于我的 XSLT 处理器,我使用了 Saxon-HE 9.2.0.6。
- 对于我的 FO 处理器,我使用了 Apache FOP 版本 0.95(尽管我更喜欢 RenderX)。
还
- Saxon-HE 和 Apache FOP 都是免费的。
- 如果您给我您的电子邮件,我可以将我使用的 SVG 文件连同完整的 XSL-FO 输出一起发送给您。我还可以将创建的 PDF 发送给您。
XSLT 2.0
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<!--
This is an "identity" template.
It copies whatever node from input to the output without changing it.
Learn it. Use it. Love it. -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="my-page">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<!-- This is the first way to output an SVG; by referencing the graphic. -->
<fo:external-graphic src="test.svg"/>
<!-- This is the second way to output an SVG; by outputting the SVG XML directly. -->
<fo:instream-foreign-object>
<xsl:apply-templates/>
</fo:instream-foreign-object>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
XSL-FO(由 Saxon 从 SVG 输入和 XSL 样式表创建)
<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg">
<fo:layout-master-set>
<fo:simple-page-master master-name="my-page">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<fo:external-graphic src="test.svg"/>
<fo:instream-foreign-object>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="595.99438"
height="491.50516"
id="svg2675">
<!-- CONTENT REMOVED FOR STACKOVERFLOW.COM EXAMPLE -->
</svg>
</fo:instream-foreign-object>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
希望这可以帮助。