Inkscape внутри PHP / Apache не отображает шрифты в PNG - PullRequest
5 голосов
/ 01 апреля 2012

Проблема, которую я обнаружил сегодня, похожа на эту неотвеченную проблему ; хотя и не то же самое, у него может быть та же причина.

Я рендеринг SVG-файлов, используя inkscape, как PNG или PDF. По большей части я намереваюсь использовать Gearman для рендеринга в фоновом режиме, но сейчас я создаю некоторые эскизы внутри процесса PHP / Apache. Похоже, что если inkscape вызывается (через PHP exec) внутри процесса Apache, он не может найти шрифты, необходимые для рендеринга. Таким образом, графические элементы отображаются нормально, но любые текстовые элементы не отображаются в выводе PNG.

Я подозреваю, что среда CLI внутри Apache отличается от моей обычной консоли bash в том смысле, что шрифты не видны. Я на OS X 10.6.8. Есть идеи?

Редактировать: следуя комментариям, я захватил php -i внутри Apache и Gearman и сравнил первое со вторым (так что в теории применение diff заставило бы его работать). результат здесь .

Редактировать 2: я пытался convert -list font в обеих средах, используя system - без различий.

Ответы [ 2 ]

3 голосов
/ 07 апреля 2012

Как было определено в комментариях выше, это было вызвано экологической разницей - переменная HOME env была установлена ​​по-разному в выполняемом процессе.Использование proc_open вместо простого exec дало более точный контроль над указанным процессом и явно установило, что env var решает проблему.

1 голос
/ 07 апреля 2012

Для справки, вот использование 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
);
...