我有一堆系统生成的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实际完成转换之前,如何保持进程运行?