在 PHP proc_open 中将 STDIN 传递给 Ghostscript

Passing STDIN to Ghostscript in PHP proc_open

我想在 PHP 中使用 Ghostscript 命令而不在文件中写入输入或输出。

$cmd = "gs -sOutputFile=%stdout% -sDEVICE=pdfwrite -dJOBSERVER -";

$descriptorspec = array(0 => array("pipe", "r"),1 => array("pipe", "w"));

$process = proc_open($cmd, $descriptorspec, $pipes);

if (is_resource($process)) {
    fwrite($pipes[0], file_get_contents('file.ps'));
    fclose($pipes[0]);

    $pdf_content = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    $return_value = proc_close($process);

    header('Content-type: application/pdf');
    header('Content-Disposition: attachment; filename="output.pdf"');
    echo $pdf_content;
}

写入 STDOUT 工作正常,但我无法让 STDIN 工作。如果将命令行替换为

$cmd = "gs -sOutputFile=%stdout% -sDEVICE=pdfwrite -dNOSAFER file.ps";

它运行良好,但在尝试读取来自 $pipes[0] 的输入时却不行。我哪里错了?

您需要提供“-”作为输入文件名。例如:

gs -sDEVICE=pdfwrite -o out.pdf - < /ghostpdl/examples/golfer.eps

告诉 Ghostscript 从标准输入获取输入,并将该文件的内容导入标准输入。

但是,对于 PDF 输入,如果您在 stdin 上发送输入,它会被写入磁盘上的一个临时文件,然后进行处理,因为 PDF 需要随机访问该文件,它不是一种可流式传输的格式。

对于 PDF 输出,我强烈建议不要写入标准输出。已经有一个功能需要代码在输出文件中查找,将来可能会有更多。显然,如果您将输出写入标准输出,那将是不可能的,所以我真的建议您不要那样做。