Извините за неправильное разъяснение. Мне нужно преобразовать этот файл .svg в pdf, я только сейчас нахожусь в начале разработки, поэтому я очень озадачен первым шагом. Также я хотел бы знать, если мой исходный ввод - файл .svg. Нужно ли явно преобразовывать его в файл .xml, прежде чем я смогу начать использовать XSLT?
Файл SVG является файлом XML в пространстве имен SVG. Нужно ли вам преобразовывать этот XML, зависит от того, как вы собираетесь его использовать. Если бы вы собирались сделать пакетную печать, используя что-то вроде Inkscape (редактор SVG), вы бы этого не сделали.
Если вы собираетесь использовать что-то вроде XSL-FO, вы бы это сделали. Ответ @Zoltan Hamori вводит в заблуждение. Вы можете использовать saxon для выполнения XSLT-преобразования (создания XSL-FO), но вам все равно понадобится процессор XSL-FO для создания PDF из XSL-FO.
Золтан упоминает FOP (процессор форматирования объектов Apache), но звучит так, будто FOP и XSL-FO одинаковы; они не. Его пример кода - таблица XSL-FO (XML в пространстве имен fo
). Вам понадобится процессор, такой как FOP, RenderX, Antenna House и т. Д., Чтобы создать PDF из XSL-FO.
В основном вам нужно:
- Ввод XML (это будет ваш SVG-файл)
- XSLT-преобразование для создания XSL-FO.
- XSL-FO процессор для создания PDF из XSL-FO
Изучение XSL-FO одновременно с изучением XSLT будет непростым делом, но я покажу вам два способа вывода SVG в PDF.
Первый способ - обратиться к файлу SVG с помощью fo:external-graphic
.
Второй способ - встроить SVG XML непосредственно в XSL-FO, используя fo:instream-foreign-object
.
Поскольку ввод XML - это SVG XML, я бы выбрал второй вариант. Однако я не уверен, какое влияние это окажет на время обработки и какой способ будет более эффективным.
Я показал пример ниже. Поскольку я показал оба способа вывода SVG, это создаст двухстраничный PDF. На каждой странице будет SVG-изображение.
Примечания
- Для тестирования я использовал пример SVG-файла, поставляемого с Inkscape. (Я удалил большую часть SVG XML из вывода XSL-FO, потому что он довольно большой.)
- Для моего процессора 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>
Надеюсь, это поможет.