使用ImageMagick将SVG转换为PDF时如何选择可靠的字体?

7

我有一个简单的测试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(ImageMagick 7.0.2-0 Q16 x86_64 在 CentOS Linux 7 (Core) 上运行)将此文件转换为 PDF 文件,则结果不会使用已安装的字体。

例如:

$ convert -density 600 test.svg test.pdf

产生的结果:

应用默认字体

看起来 ImageMagick 默认使用普通的 Helvetica 字重,这与输入 SVG 中指定的任何字体系列都不匹配。

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

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

指定加粗字体

第一个<text>元素是正确的——它使用了Helvetica-Bold。第二个<text>元素是错误的——它也使用了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

both font paths added

ImageMagick使用Helvetica-Narrow字体类型来渲染两个元素,这是不正确的,原因是相同的。

是否有一种方法可以说服ImageMagick使用输入SVG中<text>元素中指定的正确字体类型?


原始的SVG在您的计算机上是否正确呈现?即,字体是否正确? - Paul LeBeau
ImageMagick是一款全能的转换器。如果它在处理某种特定格式时出现问题,这并不意外。您尝试过专门处理SVG的软件吗?例如Apache Batik?https://xmlgraphics.apache.org/batik/tools/rasterizer.html - Paul LeBeau
SVG是正确的。虽然我很感激其他工具的建议,但我应该指出,我正在寻找解决特定问题的解决方案,即使安装了字体,也可以使ImageMagick正常工作。(讨论其他工具可能最好在本主题之外进行。) - Alex Reynolds
哦,CSS中难道没有单独指定细/粗体的方法吗?比如 font-family="Helvetica" font-weight="bold"?但是我不确定是否有细体样式,也许你调用其中一个变量并仅修改粗体文本行就能得到正确的输出? - Stefan Hegny
请尝试运行 identify -list font | grep -i helvetica 并将结果粘贴。 - Mark Setchell
3个回答

4

查看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。您可以通过在<text>上使用其他属性来实现预期的效果(加粗/变窄)。

<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工具所认可。希望能对您有所帮助。


0

0

您需要澄清字体的安装位置:是在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时,这将显示出来(请参见将PDF转换为干净的SVG?https://www.magebay.com/forum/forums/topic/pdf-svg-doesnt-embed-the-fonts/)。

很抱歉,如果不了解具体情况,它不能简化为“添加这一行”,但这应该会有所帮助。


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