我试图用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%����10 obj<> endobj 2 0 obj<> endobj等。'并将所有页面输出到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 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) . '" />';
更新 找到了输入的解决方案。它是一个破折号而不是代表输入文件的最后一个参数。多页输出仍然是一个问题。
答案 0 :(得分:1)
您无法使用Ghostscript在内存中呈现PDF文件。
Ghostscript仅处理来自磁盘的PDF文件。如果从stdin管道输入,则所有发生的事情是Ghostscript创建一个临时文件,将PDF存储在其中,然后呈现临时文件。这是因为PDF文件固有地需要能够在文件中随机搜索。
事实上,通过stdin发送文件,你只是将临时文件的创建移到Ghostscript内部,而不是自己动手。如果你认为你通过这种方式改善了表现,你就错了。
如果指定-
(stdout)作为输出文件,则 all 将输出发送到stdout。如果有多个页面,那么两个页面都会被发送到输出(它还能做什么?)。由您来决定每个页面的结束位置并将其拆分。
如果省略-q
并查看发送到stdout的内容(例如,通过将其重定向到文件),您将看到通常的Ghostscript样板文件在开始时发送。如果你进一步省略-dNOPAUSE
(注意你需要按每个页面'返回'并且不会提示你,所以只需敲击一下键)然后查看输出你会看到每个页面由
>>showpage, press <return> to continue<<
因此,您可以看到每个页面都已发送,由您决定每个JPEG结束的位置。
鉴于你要向stdout发送多页输出,我不确定你还会发生什么。
答案 1 :(得分:0)
我已在本地测试此代码,并且正在为我工作:
我正在使用passthru来指导输出答案,并使用output buffering来捕捉
<?php
$command = "/path/to/gs -dBATCH -sDEVICE=jpeg -dNOPAUSE -dSAFER -dJPEGQ=100 -dGraphicsAlphaBits=4 -dTextAlphaBits=4 -r72 -sOutputFile=- ./someFile.pdf";
// Capture output on buffer.
ob_start();
// Will automatically output answer of your command
passthru($command);
// you get buffered output.
$response = ob_get_contents();
// Flush buffer.
ob_end_clean();
echo '<img src="data:image/png;base64, ' . base64_encode($response) . '" />';