【发布时间】:2018-04-17 11:11:06
【问题描述】:
我正在尝试使用 php 中的 ghostscript 将多页 pdf 转换为 jpg。现在的命令看起来像这样:
gs -q -dBATCH -sDEVICE=jpeg -dNOPAUSE -dSAFER -dJPEGQ=100 -dGraphicsAlphaBits=4 -dTextAlphaBits=4 -r72 -sOutputFile=- some.pdf
我想要的是找到一种方法将 pdf 作为字符串输入,看起来像这样:'%PDF-1.4 %���� 1 0 obj endobj 2 0 obj endobj, etc.'并将所有页面输出到标准输出。为命令提供一个实际的 pdf 文件效果很好,但它返回一个页面。如果选择文件写入,则可以选择 p%03d.jpg 来获取所有页面,但我需要将其转储到临时/内存中。据我了解,您需要使用管道才能使其正常工作。我用 proc_open() 做了一些事情,但没有成功,因为我不知道如何将字符串传递给管道。
$args = [
'-dBATCH',
'-sDEVICE=jpeg',
'-dNOPAUSE',
'-dSAFER',
'-dJPEGQ=100',
'-dGraphicsAlphaBits=4',
'-dTextAlphaBits=4',
'-r72',
'-sOutputFile=-',
$path . '/some.pdf'// this shouold be passed as string stdin
];
$descr = [
0 => ['pipe', 'r'],
1 => ['pipe', 'w'],
2 => ['pipe','w']
];
$pipes = array();
$args = implode(' ', $args);
$commd = "gs -q $args";
$process = proc_open($commd, $descr, $pipes);
$response = '';
if (is_resource($process)) {
fputs($pipes[0], $pdf);
fclose($pipes[0]);
while ($f = fgets($pipes[1])) {
$response .= $f;
}
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
}
echo '<img src="data:image/png;base64, ' . base64_encode($response) . '" />';
更新: 找到输入的解决方案。它是一个破折号,而不是代表输入文件的最后一个参数。多页输出仍然是个问题。
【问题讨论】:
-
Hello @Calin 不要自己实现,我强烈建议您使用抽象库,例如:ghostscript-PHP 用于 GhostScript 或 imagick
-
嗨@Yanis-git。感谢您的回答。我想避免使用 Imagick,因为它在合理的分辨率上真的很慢,对于另一个它没有适应这个,它是非常基本的。
标签: php ghostscript