我正在尝试用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.”并将所有页面输出到stdout。为命令提供一个实际的pdf文件效果很好,但它只返回一个页面。如果选择文件写入,则有一个选项p%03d.jpg可以获取所有页面,但我需要将其转储到temp/memory。据我所知,您需要使用管道才能使其工作。我使用proc_open()做了一些操作,但没有成功,因为我不知道如何将字符串传递到管道。
$args = [
'-dBATCH',
'-sDEVICE=jpeg',
'-dNOPAUSE',
'-dSAFER',
'-dJPEGQ=100',
'-dGraphicsAlphaBits=4',
'-dTextAlphaBits=4',
'-r72',
'-sOutputFile=-',
$path . '/some.pdf'// this should 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) . '" />';
**更新:**找到输入的解决方案。它是一个破折号,而不是表示输入文件的最后一个参数。多页输出仍然是一个问题。
2条答案
按热度按时间jyztefdp1#
不能使用Ghostscript在内存中渲染PDF文件。
Ghostscript只处理磁盘上的PDF文件。如果您通过管道从stdin输入,则Ghostscript只会创建一个临时文件,将PDF存储在该文件中,然后呈现该临时文件。这是因为PDF文件本质上要求能够在文件中随机查找。
所以实际上通过stdin发送文件只是将临时文件的创建转移到Ghostscript内部完成,而不是自己完成。如果你认为这样做可以提高性能,那你就错了。
如果你指定
-
(stdout)作为输出文件,那么all输出被发送到stdout。如果有多个页面,那么两个页面都被发送到输出(它还能做什么呢?)。你自己决定每个页面的结束位置并将其拆分。如果忽略
-q
并查看发送到stdout的内容(例如,通过将其重定向到一个文件),您将看到通常的Ghostscript样板文件在开始时发送。如果您进一步忽略-dNOPAUSE
(注意你将需要按'返回'为每一页,你不会被提示,所以只要敲一下键就可以了),然后查看输出,您会看到每页都由分隔因此,您可以看到每个页面都已发送,并由您确定每个JPEG的结束位置。
我不确定您还期望发生什么,因为您要向stdout发送多页输出。
ohtdti5x2#
我已经在本地测试了这段代码,它对我很有效:
我正在使用passthru来指导输出答案,并在output buffering周围播放以捕获