抱歉我的表述可能有误,我需要将这个.svg文件转换成.pdf文件,我现在处于开发的初期,对第一步非常困惑。另外,如果我的初始输入是一个.svg文件,那么我是否必须明确地将其转换为.xml文件才能开始使用XSLT呢?
SVG文件实际上是SVG命名空间中的XML文件。您是否需要转换该XML取决于您将如何使用它。如果您要使用像Inkscape(一种SVG编辑器)之类的东西进行批量打印,则不需要转换。
如果您要使用类似XSL-FO的东西,则需要转换。@Zoltan Hamori的答案有点误导。您可以使用saxon执行XSLT转换(创建XSL-FO),但您仍然需要XSL-FO处理器来从XSL-FO创建PDF。
Zoltan提到了FOP(Apache Formatting Objects Processor),但他让FOP和XSL-FO听起来像是同一个东西;它们并不相同。他的代码示例是XSL-FO表格(
fo
命名空间中的XML)。您需要处理器(例如FOP、RenderX、Antenna House等)来从XSL-FO创建PDF。
基本上您需要以下内容:
1. XML输入(这将是您的SVG文件)
2. XSLT转换以创建XSL-FO。
3. XSL-FO处理器以从XSL-FO创建PDF
同时学习XSLT和XSL-FO将会很困难,但我将向您展示两种在PDF中输出SVG的方法。
第一种方法是使用
fo:external-graphic
引用SVG文件。
第二种方法是使用
fo:instream-foreign-object
直接嵌入SVG XML到XSL-FO中。
由于XML输入是SVG XML,因此我会选择第二个选项。但是,我不确定这对处理时间有何影响,哪种方式更有效率。
我在下面展示了一个示例。由于我展示了输出SVG的两种方式,因此这将创建一个2页PDF。每一页都有SVG图形。
注:
1. 为了测试,我使用了Inkscape提供的一个示例SVG文件。(我从XSL-FO输出中删除了大部分SVG XML,因为它非常大。)
2. 对于我的XSLT处理器,我使用的是Saxon-HE 9.2.0.6。
3. 对于我的FO处理器,我使用的是Apache FOP Version 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样式表创建)
XSL-FO是一种用于描述页面格式的语言。它使用XML格式,并且可以通过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">
</svg>
</fo:instream-foreign-object>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
希望这有所帮助。