【问题标题】:Converting SVG to PDF with ImageMagick with reliable font selection?使用具有可靠字体选择的 ImageMagick 将 SVG 转换为 PDF?
【发布时间】:2017-01-02 09:20:59
【问题描述】:

我有一个简单的测试 SVG,它使用两种已安装的字体(Helvetica-NarrowHelvetica-Bold):

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="50">
  <text x="0" y="24" fill="blue" font-family="Helvetica-Bold" font-size="24px">Bold</text>
  <text x="0" y="48" fill="blue" font-family="Helvetica-Narrow" font-size="24px">Narrow</text>
</svg>

如果我使用 ImageMagick(在 CentOS Linux 7 (Core) 上运行的 ImageMagick 7.0.2-0 Q16 x86_64)将其转换为 PDF 文件,则结果不会使用已安​​装的字体。

例如:

$ convert -density 600 test.svg test.pdf

产量:

看起来 ImageMagick 默认使用 Helvetica 的正常粗细,这与输入 SVG 中指定的任一字体系列都不匹配。

接下来,我尝试指定输入 SVG 中指定的字体之一的路径。这是Helvetica-Bold 字体的路径,由运行convert -list font 确定。

$ convert -density 600 -font /net/module/sw/ghostscript-fonts/5.50-32/n019004l.pfb test-helvetica-mix.svg test-helvetica-mix-bold.pdf

第一个&lt;text&gt; 元素是正确的——它使用Helvetica-Bold。第二个 &lt;text&gt; 元素不正确 - 它也使用 Helvetica-Bold,但实际上应该使用 Helvetica-Narrow

不过,我越来越接近这种方法,所以我尝试将路径添加到输入 SVG 中使用的第二种字体:

$ convert -density 600 -font /net/module/sw/ghostscript-fonts/5.50-32/n019004l.pfb -font /net/module/sw/ghostscript-fonts/5.50-32/n019043l.pfb test-helvetica-mix.svg test-helvetica-mix-both.pdf

ImageMagick 对两个元素都使用Helvetica-Narrow 字体,出于同样的原因,这是不正确的。

有没有办法说服 ImageMagick 使用输入 SVG 中 &lt;text&gt; 元素中指定的正确字体?

【问题讨论】:

  • 原始 SVG 是否在您的机器上正确呈现? IE。使用正确的字体?
  • ImageMagick 是一个万能转换器。如果它与一种特定格式存在问题,这不会是意料之外的。您是否尝试过专门研究 SVG 的软件?例如阿帕奇蜡染? xmlgraphics.apache.org/batik/tools/rasterizer.html
  • SVG 是正确的。虽然我很欣赏其他工具的建议,但我应该注意,我正在寻找指定问题的解决方案,即使 ImageMagick 与安装的字体正常工作所需的具体内容。 (最好在此线程之外讨论其他工具。)
  • 嗯,css中没有单独的方法来指定窄/粗体吗?喜欢font-family="Helvetica" font-weight="bold" ?但不确定那里的 Narrow 样式,但是当您只修改带有粗体文本的行时,您的调用变体之一可能会给出正确的输出?
  • 请尝试运行identify -list font | grep -i helvetica 并粘贴结果。

标签: pdf svg types fonts imagemagick


【解决方案1】:

看看convert -list font 说什么

Font: Helvetica-Bold
  family: Helvetica
  style: Normal
  stretch: Normal
  weight: 700
  glyphs: /usr/share/fonts/type1/gsfonts/n019004l.pfb
Font: Helvetica-Narrow
  family: Helvetica Narrow
  style: Normal
  stretch: Condensed
  weight: 400
  glyphs: /usr/share/fonts/type1/gsfonts/n019043l.pfb

Helvetica-BoldHelvetica-Narrow 的字体系列分别为 HelveticaHelvetica Narrow。您可以通过在&lt;text&gt; 上使用其他属性来实现预期的效果(粗体/窄体),例如:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="50">
  <text x="0" y="24" fill="blue" font-family="Helvetica" font-size="24px" font-weight="700">Bold</text>
  <text x="0" y="48" fill="blue" font-family="Helvetica Narrow" font-size="24px" font-stretch="Condensed">Narrow</text>
</svg>

我研究了我们是否可以直接使用类型名称(Helvetica-BoldHelvetica-Narrow),但无济于事,这是我能找到的唯一解决方案,ImageMagick 的convert 工具尊重这一点。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    尝试编辑位于 ~/.magick/type.xml 之类的 ImageMagick 字体文件

    您可以强制它使用特定字体并通过您想要的任何名称识别它。 imagick_type_gen.

    这是一个链接,可以帮助您尝试做的事情: Make ImageMagick recognize a font

    进一步阅读与 ImageMagick 一起使用的附加工具: http://gothick.org.uk/2008/03/14/using-os-x-fonts-in-imagemagick/

    【讨论】:

      【解决方案3】:

      您需要明确字体的安装位置:在 SVG 安装中、操作系统中或嵌入在 PDF 中。

      SVG 有自己的字体系统,这会导致无穷无尽的问题。 SVG 是在 Web 字体真正投入使用之前首次制作的,因此 SVG 制作了自己的可移植字体系统。现在您有了一个仅适用于 SVG 字体的字体系统,它们可能不会转换为 PDF 文件。

      最好的办法是使用@font-face 规则,例如@font-face { font-family: Helvetica; src: url('/var/www/fonts/Helvetica.ttf'); }。请参阅此 (https://graphicdesign.stackexchange.com/questions/5162/how-do-i-embed-google-web-fonts-into-an-svg/5167#5167) 以获得其他视图。

      另一种方法是完全放弃字体并让 SVG 呈现您想要的路径。即,创建一个带有作为渲染字体的图形的 PDF。当使用 Inkscape 从 PDF 到 SVG 进行另一个方向的旅行时,就会出现这种情况。 (见Convert PDF to clean SVG?,或https://www.magebay.com/forum/forums/topic/pdf-svg-doesnt-embed-the-fonts/)。

      很抱歉,在不了解更多细节的情况下,不能归结为“添加这一行”,但这应该会有所帮助。

      【讨论】:

        猜你喜欢
        • 2015-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-24
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 2015-02-16
        相关资源
        最近更新 更多