SVG转PDF转换器,保留文本

6
我正在寻找一款SVG转PDF转换器,它可以保留SVG中的文本。我已经尝试过Batik、Inkscape和CairoSVG,但它们生成的PDF都是位图图像,包括文本;在PDF查看器中无法选择或搜索文本。此外,它们的效果也不是很好,特别是CairoSVG。
我按照这里的说明操作(请注意,您不必编译FOP - 您可以从这里下载PDF转码器)。现在我发现,如果我放大PDF,清晰度得到了保留,这意味着文本被保留下来了。但是,我无法搜索或选择文本。
另外,我比较了使用FOP的PDF转码器与Batik的输出结果,发现没有任何区别。

你能详细说明一下你是如何使用Inkscape将SVG文档转换为PDF的吗?我已经使用Inkscape转换了各种基于文本的文档,但是对我来说,文本并没有被转换成图像。 - halfer
我看到了。生成的PDF质量比Batik差,所以我猜我没有尝试突出任何东西。我的原始问题已经被Inkscape解决了,但生成的PDF不是我想要使用的东西。显示的SVG不如其他查看器好。 - user2233706
生成的PDF质量比Batik差 - 具体是什么方面?您能否提供一个由Inkscape处理的输入SVG和输出PDF的示例?(编辑:Thomas提出了一个非常好的观点,即渐变可能会迫使渲染器执行您描述的操作;尽管如此,对于这样的问题,应该提供输入和输出文件,否则读者只能猜测)。 - halfer
这是由ChromeBatikInkscape生成的PDF。原始SVG最好在Chrome或Batik中查看。该SVG文件是由程序生成的,我不得不删除其中的部分内容以得出一个最简示例。Chrome具有最佳的PDF文档,但问题是页面大小受限。 - user2233706
@user2233706:这是一个非常有趣的问题。如果悬赏可以帮助你解决它,而且你仍在继续工作,让我知道,我会添加一个悬赏。 - halfer
显示剩余5条评论
3个回答

1
如果您在使用滤镜、渐变或蒙版,则可能无法将其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)

我的SVG是由另一个程序生成的。我将其简化为以下内容,仅显示文本: <svg xmlns="http://www.w3.org/2000/svg"> <g transform='translate(0.0,39.75)'><text x='65.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#000000' >测试</tspan></text></g> </svg> 并运行了以下命令: java -jar batik-rasterizer.jar -m application/pdf ..\test.svg -font-family Arial从PDF查看器中无法选择文本。该文本被转换为矢量图像。 - user2233706
我无法重现您的问题。我正在使用Batik光栅化器执行此操作:rasterizer -m application/pdf test.svg,并且可以使用Adobe Reader或Evince完美地选择文本。您使用的是哪个PDF阅读器? - Thomas W
1
首先,感谢您花时间处理此事。现在SVG在Firefox中可以正确渲染。然而,在Chrome中它完全无法渲染。其次,我正在Windows上使用PDF-XChange Viewer。我安装了Adobe Reader 8.1,但是出现了相同的问题。我还安装了Evince,结果也一样。当您说选择时,是否意味着您可以复制它?并且您能否搜索它?我假设这是矢量图像,因为当我放大时,质量得到了保持,但是您会发现文本不太平滑,就好像是用多个路径绘制的。另外,通过您的转换,文本仍然无法选择。 - user2233706

1
请看 rsvg-convert,它是 librsvg 的一部分。我曾用它将 SVG 文档转换为 PDF,并且它可以保留文本,使得在 PDF 查看器中可以选择和搜索。

这里有一篇博客文章将其与其他选项进行了比较,并展示了如何使用它:https://www.itsfullofstars.de/tag/rsvg-convert/


0

你尝试过将SVG打印到PDF打印机上吗?


是的。问题在于我的SVG非常大。它可能有几英尺长。将其打印到PDF会导致多页输出。 - user2233706
Google Chrome在将SVG转换为PDF方面表现出色,它比其他任何工具都更好地保留了原始PDF。生成的PDF可以在PDF查看器中进行选择,这正是我想要的。但是,输出页面大小仅限于信纸或类似大小的纸张。我不想受到任何纸张大小的限制。 - user2233706
我的意思是“PDF中的文本可以在PDF查看器中选择。” - user2233706

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接