我正在寻找一个SVG到PDF的转换器,它可以保留SVG中的文本。我试过蜡染、Inkscape和CairoSVG。它们生成的PDF都是位图图像,包括文本;文本不能在PDF查看器中选择/搜索。他们都做得不好,尤其是CairoSVG。
我按照这里的说明(注意,你不必编译FOP——你可以从这里下载PDF转码器)。现在我看到,如果我放大PDF,清晰度得到了保留,我假设这意味着文本得到了保留。然而,我不能搜索或选择文本。
此外,我比较了从FOP使用PDF转码器的输出与蜡染中的输出,我看不出有什么区别。
如果您使用过滤器、渐变或掩蔽,可能无法将此1:1转换为PDF。在这些情况下,转换器通常光栅矢量数据以实现类似的视觉外观,而不是保留矢量数据并获得非常不同的外观。
编辑:在您的示例案例中,我们可以借助以下XSLT转换确保使用填充属性而不是过滤器:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@fill[ancestor::svg:symbol]" priority="1">
<xsl:attribute name="fill">currentColor</xsl:attribute>
</xsl:template>
<xsl:template match="@filter[starts-with(.,'url(#colorFilter-')]">
<xsl:attribute name="color">
<xsl:value-of select="concat('#',substring(.,18,6))"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="svg:use[not(@filter)]">
<xsl:copy>
<xsl:attribute name="color">#fff</xsl:attribute>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这完全取决于在这个特定的SVG中过滤器的命名方式,因此它不适用于其他任何东西。不过,颜色不太正确。我很想知道为什么会出现这个颜色矩阵:
0.4 0 0 0 0
0 0.6 0 0 0
0 0 0.8 0 0
0 0 0 1 0
应用于白色显然不会导致rgba(40%,60%,80%,1)
。
看看rsvg-转换
,它是一个程序库,我用它把SVG文档转换成PDF它保留了文本,这样它就可以在PDF浏览器中选择和搜索。
这是一篇博客文章,将它与其他一些选项进行了比较,并展示了如何使用它:https://www.itsfullofstars.de/tag/rsvg-convert/
您是否尝试过将SVG打印到PDF打印机上?