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