【问题标题】:Inkscape inside PHP/Apache doesn't render fonts to PNGPHP/Apache 中的 Inkscape 不会将字体呈现为 PNG
【发布时间】:2012-04-15 13:40:15
【问题描述】:

我今天发现的一个问题与unanswered problem 类似;虽然不一样,但可能有相同的原因。

我正在使用inkscape 将 SVG 文件渲染为 PNG 或 PDF。在大多数情况下,我打算使用 Gearman 在后台渲染这些,但现在我正在 PHP/Apache 进程中创建一些缩略图。似乎如果在 Apache 进程中调用 inkscape(通过 PHP 的 exec),它找不到它需要呈现的字体。因此,图形元素呈现良好,但任何文本元素都不会在 PNG 输出中绘制。

我怀疑 Apache 内部的 CLI 环境与我通常的 bash 控制台不同,这意味着无法看到字体。我在 OS X 10.6.8 上。有什么想法吗?

编辑:从 cmets 开始,我在 Apache 和 Gearman 中捕获了php -i,并将第一个与第二个进行了比较(因此理论上应用差异会使其工作)。 result is here

编辑 2:我在两种环境中都使用 system 尝试过 convert -list font - 完全没有区别。

【问题讨论】:

  • 我已经使用 Gearman 中的阻塞高优先级任务解决了这个问题,无论如何这是我的首选解决方案 - 因为它可以帮助我控制并发 inkscape 进程的数量。但我仍然认为这个问题很有趣,所以鼓励任何有想法的人发布它们!当机器允许我时,赏金即将到来。
  • (忽略反对票 - 我显然惹恼了 anon_coward,他反对了我的几个不相关的帖子!)
  • +1,听起来很有趣,这个问题没有错:)
  • 找不到外部文件听起来像是路径问题。您是否查看了被调用进程所看到的环境变量(可能只是执行一个打印出$_ENV 或调用phpinfo() 的php 脚本)?
  • 感谢@DCoder。我通常认为这是一个文件权限问题,但另一方面,我也在 www 用户下运行 Gearman 进程(与 Apache 相同)。我会尝试在 Apache 中转储环境内容,看看是否有问题 - 好主意。

标签: php apache fonts inkscape


【解决方案1】:

作为记录,以下是帮助解决此问题的 proc_open 的用法:

$command = "{$exec} --without-gui {$params} {$file} {$redirect}";
$return = -1;
// Comment this out for now
//exec($command, self::$output, $return);

$descriptorspec = array(
    0 => array("pipe", "r"),
    1 => array("pipe", "w"),
    2 => array("file", "/dev/null", "a")
);
$pipes = array();
$env = array(
    // Try additional stuff here, but culprit was:
    'HOME' => '/Users/jon',
);
$resource = proc_open(
    $command,
    $descriptorspec,
    $pipes,
    $cwd = null,
    $env
);

【讨论】:

  • 感谢您分享这部分内容。再观察一下:命令中的参数是否正确转义 (escapeshellargs)?
  • 其实我没有;好问题。即使我没有从用户输入中获取任何参数,我是否应该使用它?
  • 出于习惯,我通过它运行所有参数。如果您不接受任何用户输入(您的文件名是自动生成的,并且确保不包含诸如空格之类的可疑内容),那么您可能是安全的。
  • 是的,所有路径都没有空格,文件叶名是 md5 哈希。但这仍然是个好主意——我想我也会这样做。
【解决方案2】:

正如在上面的 cmets 中确定的那样,这是由环境差异引起的 - HOME env var 在执行过程中的设置不同。使用 proc_open 而不是简单的 exec 可以更精确地控制所述过程并明确设置 env var 解决了问题。

【讨论】:

  • exec("HOME=/path/to/home /usr/bin/inkscape") 也可以。我想知道为什么系统字体不适用于未设置的家庭。
猜你喜欢
  • 2022-07-19
  • 2014-05-08
  • 2016-10-12
  • 1970-01-01
  • 2018-06-17
  • 2018-06-10
  • 1970-01-01
  • 2019-12-21
  • 2021-10-07
相关资源
最近更新 更多