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

时间:2016-08-25 20:01:19

标签: pdf svg types fonts imagemagick

我有一个简单的测试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

收率:

default font applied

看起来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

bold font specified

第一个<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>元素中指定的正确字体?

3 个答案:

答案 0 :(得分:2)

查看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的{{{ 1}}工具。希望它有所帮助。

答案 1 :(得分:0)

尝试编辑位于〜/ .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/

答案 2 :(得分: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的另一个行程方向时,这会显示出来。 (请参阅Convert PDF to clean SVG?https://www.magebay.com/forum/forums/topic/pdf-svg-doesnt-embed-the-fonts/)。

对不起,如果不了解更多关于细节的信息,就不能归结为“添加这一行”,但这应该会有所帮助。