PHP太早退出Inkscape的shell模式

时间:2014-03-12 09:00:37

标签: php inkscape

我有一堆系统生成的SVG文件,我需要转换为PDF进行进一步处理。 SVG以颜色保存和处理,以防有人想知道。这是我的转换代码:

$descspec = array(0 => array('pipe', 'r'),  // stdin
                  1 => array('pipe', 'w'),  // stdout
                  2 => array('pipe', 'w')); // stderr

// start Inkscape process
$process = proc_open('inkscape --shell', $descspec, $pipes);

foreach ($files as $color => $filearray) {

    foreach ($filearray as $filename) {

        $command = '"' . $path_to_svg . '" '.
                   '--export-area-drawing --export-text-to-path ' . 
                   '--export-pdf="' . $path_to_pdf . '"'

        fwrite($pipes[0], $command . "\n");
    }
}

fwrite($pipes[0], 'quit'."\n"); // leave shell mode
foreach ($pipes as $pipe) fclose($pipe);
proc_close($process); // close Inkscape

问题是这样,只有大约三分之一到一半的文件被转换。我的猜测是,在将所有命令写入foreach之后,第二个stdin循环终止,而不等待转换完成,因此发出quit并且Inkscape进程在之前终止整个转换完成。或者命令写入stdin,而Inkscape没有完成处理上一个命令,以便第二个(甚至可能是第三个和第四个)丢失。

(执行system('inkscape ' . $command)有效并且所有文件转换得很好,所以我不认为问题与文件有关。但是,我真的很想使用Inkscape' shell模式,所以我不必为每个文件启动Inkscape(即使使用--without-gui选项)。)

所以,如果有人能指出我的解决方案,我会非常感激。在Inkscape实际完成转换之前,如何保持进程运行?

0 个答案:

没有答案