使用 PHP 将 SVG 转换为 JPG 时,Imagick 不使用自定义字体

Axe*_*xel 5 php svg imagemagick imagick

尝试将 SVG 转换为 JPG 图像时,我遇到了自定义字体无法呈现的问题。我正在font-family="Lobster"为 SVG 文本元素使用定义。

我的服务器设置如下:

  • CentOS 6.5(32 位)
  • ImageMagick 6.5.4-7
  • PHP 5.2.17

我正在测试的 PHP 代码,但不起作用。我正在尝试使用自定义字体Lobster

//Setup SVG to be read by Imagick.
$SVG = '<?xml version="1.0" encoding="utf-8"?>';
$SVG .= '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">';
$SVG .= '<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="158px" height="92px" viewBox="0 0 158 92" enable-background="new 0 0 158 92" xml:space="preserve">';
$SVG .= '<text transform="matrix(1 0 0 1 32 58)" font-family="Lobster" font-style="normal" font-size="20px" font-weight="400">Lobster</text>';
$SVG .= '</svg>';

$image = new Imagick();

//Convert SVG to JPG
$image->readImageBlob($SVG);
$image->setImageFormat("jpeg");

//Save the thumbnail.
$save_path = '/home/username/lobster.jpg';
$image->writeImage($save_path);


echo '<img src="lobster.jpg" alt="" /><br />';
Run Code Online (Sandbox Code Playgroud)

产生以下图像:

龙虾.jpg

我尝试过的:

我已经创建了一个type.xml文件,位于/home/username/.magick/type.xmlLobster 字体定义中,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE typemap [
<!ELEMENT typemap (type)+>
<!ELEMENT type (#PCDATA)>
<!ELEMENT include (#PCDATA)>
<!ATTLIST type name CDATA #REQUIRED>
<!ATTLIST type fullname CDATA #IMPLIED>
<!ATTLIST type family CDATA #IMPLIED>
<!ATTLIST type foundry CDATA #IMPLIED>
<!ATTLIST type weight CDATA #IMPLIED>
<!ATTLIST type style CDATA #IMPLIED>
<!ATTLIST type stretch CDATA #IMPLIED>
<!ATTLIST type format CDATA #IMPLIED>
<!ATTLIST type metrics CDATA #IMPLIED>
<!ATTLIST type glyphs CDATA #REQUIRED>
<!ATTLIST type version CDATA #IMPLIED>
<!ATTLIST include file CDATA #REQUIRED>
]>
<typemap>

  <type
     format="ttf"
     name="Lobster"
     fullname="Lobster"
     family="Lobster"
     glyphs="/home/username/fonts/Lobster/Lobster.ttf"
     style="normal"
     stretch="normal"
     weight="400"
     />

</typemap>
Run Code Online (Sandbox Code Playgroud)

我在/usr/lib/ImageMagick-6.5.4/config/type.xml文件中包含了一个直接包含,如下所示:

<typemap>
   <include file="type-ghostscript.xml" />
   <include file="/home/username/.magick/type.xml" />
</typemap>
Run Code Online (Sandbox Code Playgroud)

使用该$image->queryfonts();方法输出字体时,可以看到列表中定义的Lobster字体。例如,这个:

$image = new Imagick();
$fonts = $image->queryfonts();
foreach($fonts as $font) {
    echo $font . '<br />';
}
Run Code Online (Sandbox Code Playgroud)

返回这个:

[...]
Hershey-Plain-Triplex-Regular
Hershey-Script-Complex-Regular
Hershey-Script-Simplex-Regular
Lobster
MeriendaOne
NewCenturySchlbk-Bold
NewCenturySchlbk-BoldItalic
NewCenturySchlbk-Italic
NewCenturySchlbk-Roman
[...etc]
Run Code Online (Sandbox Code Playgroud)

此外,我相信 ImageMagick 正在使用它自己的内部 SVG 渲染器。外壳命令:

convert -list format | grep SVG
Run Code Online (Sandbox Code Playgroud)

返回:

MSVG  SVG       rw+   ImageMagick's own SVG internal renderer
SVG  SVG       rw+   Scalable Vector Graphics (RSVG 2.26.0)
SVGZ  SVG       rw+   Compressed Scalable Vector Graphics (RSVG 2.26.0)
Run Code Online (Sandbox Code Playgroud)

关于为什么这不起作用的任何想法?

Dan*_*ack 0

请重新启动您的网络服务器或 PHP-FPM 实例。

显然,有关 SVG 中可以使用哪些字体的信息由 ImageMagick 缓存,即使 queryFonts() 返回的列表缓存。

在我重新启动 php-fpm 实例之前,您的代码示例对我不起作用,然后它就完美运行了。