ImageMagick 忽略 SVG 中的样式表(使用 php-imagick 转换为 PNG)

ImageMagick ignores style sheets in SVG (conversion to PNG with php-imagick)

我正在使用我在 PHP 中使用 ImageMagick 加载的 SVG 模板,将一些值插入 DOM,然后将其转换为 PNG。在我的本地开发环境中,这工作正常,但在我的远程网络服务器上却不行,生成的图像大部分是黑色的。

ImageMagick 似乎无法读取样式sheet 声明并应用类。我试图找出原因,但没有成功。我没有得到异常,其他线程暗示旧版本的 ImageMagick 可能有这个问题,但似乎版本是最新的。

我有点困惑PHPInfo 说模块版本是 3.4.4,但在 2017 年发布,而 ImageMagick 网站说 3.4.4 是在 12/2020 发布的。这有意义吗?我的本地开发环境使用相同的版本,但有一些附加信息 (3.4.4.r66.g448c1cd),发布日期为 2021-01-30。所以我不确定我是否在网络服务器上使用当前版本。

默认情况下,imagick 模块无法处理 SVG 文件类型,因此我安装了“libmagickcore-6.q16-3-extra”并重新加载了 php 和 nginx。从那时起,我得到了 PNG,但没有应用 sheet 样式。

服务器信息:Debian GNU/Linux 9.9 (stretch), PHP7.3, nginx/1.10.3

这是我的 SVG 开头的样子:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px"
   width="975" height="579.05542" viewBox="0 0 974.99995 579.05544" xml:space="preserve" id="svg_score">
   <defs id="defs">
      <style type="text/css" id="style">
         @font-face {
            font-family: SFProDisplay-Regular;
            src: url('sfprodisplay-regular.ttf');
         }
         .st0 {
            fill: #FFFFFF;
         }
         .st1 {
            fill-rule: evenodd;
            clip-rule: evenodd;
         }
         .st2 {
            clip-path: url(#SVGID_10_);
         }
         .st3 {
            clip-path: url(#SVGID_12_);
         }
         .st4 {
            fill: #77af42;
            stroke: #000000;
            stroke-width: 2.11;
            stroke-linejoin: round;
            stroke-miterlimit: 10;
         }
         .st11 {
            fill: none;
            stroke: #FFFFFF;
            stroke-width: 3;
            stroke-miterlimit: 10;
         }
         .filledstar {
            fill: #FFFFFF;
            stroke: #FFFFFF;
            stroke-width: 3;
            stroke-miterlimit: 10;
         }
         .value {
            font-style: normal;
            font-variant: normal;
            font-stretch: normal;
            font-family: SFProDisplay-Regular;
            font-size: 36.3px;
            letter-spacing: -.7;
         }
      </style>
   </defs>

我也试过将 style 标签放在 defs 标签之外,但这也不起作用。 一个选项可能是将 SVG 委托更改为 Inkscape,但我认为这使这个问题变得更加复杂,正如我在我的开发 ImageMagick 上看到的那样,我没有找到如何将 delegete 更改为 Inkscape for php-imagick.

我已经没有想法了,真的希望你能帮我解决这个问题。

ImageMagick 可以使用 3 种不同的 SVG 渲染器中的任何一种。按照结果质量的顺序,一个是 Imagemagick 内部 MSVG/XML 渲染器,其次是 RSVG 代理,最后一个是 Inkscape。您可能在一个有效的系统上使用后者之一,在给出黑色结果的系统上使用内部系统。我建议你在两个系统上都安装 Inkscape,然后再测试。如果 ImageMagick 可以找到它,它将使用 Inkscape,否则如果找不到 RSVG,它将默认使用 MSVG。 RSVG 需要作为委托库安装,但 Inkscape 可以单独安装。