从PHP调用Ghostscript:无法打开初始设备

从PHP调用Ghostscript:无法打开初始设备,php,ghostscript,Php,Ghostscript,我已经从MacPorts安装了Ghostscript,并试图从PHP脚本中调用它,从多页PDF文件中提取单个页面,然后输出它。我的代码如下所示: <?php $cmd = '/opt/local/bin/gs -sDEVICE=pdfwrite -dNOPAUSE \ -dBATCH -dSAFER -dFirstPage=20 -dLastPage=20 -sOutputFile=%stdout "/path/to/input/pdf.pdf"'; // Will

我已经从MacPorts安装了Ghostscript,并试图从PHP脚本中调用它,从多页PDF文件中提取单个页面,然后输出它。我的代码如下所示:

<?php

$cmd = '/opt/local/bin/gs -sDEVICE=pdfwrite -dNOPAUSE \
    -dBATCH -dSAFER -dFirstPage=20 -dLastPage=20
    -sOutputFile=%stdout  "/path/to/input/pdf.pdf"';

// Will uncomment this when it works
// header("Content-Type: application/pdf");

putenv("GS_LIB=/opt/local/share/ghostscript/9.02/lib");
putenv("GS_FONTPATH=/opt/local/share/ghostscript/fonts");
putenv("TMPDIR=/tmp");

passthru($cmd);

相同的命令在shell中工作。

apache/webserver用户可能没有权限或相同的环境变量。也许可以试试sudo,或者确保apache具有适当的权限。

我也有这个错误,我花了5个小时才找到解决方案。请注意这两个代码块之间的差异:

$cmd = '/opt/local/bin/gs -sDEVICE=pdfwrite -dNOPAUSE \
    -dBATCH -dSAFER -dFirstPage=20 -dLastPage=20
    -sOutputFile=%stdout  "/path/to/input/pdf.pdf"';

$cmd = '/opt/local/bin/gs -sDEVICE=pdfwrite -dNOPAUSE \
    -dBATCH -dSAFER -dFirstPage=20 -dLastPage=20 \
    -sOutputFile=%stdout  "/path/to/input/pdf.pdf"';

shell不喜欢意外的换行符,因此只要在每行换行符前面添加一个反斜杠,问题就解决了。

我遇到了
****无法打开初始设备,退出。
使用PHP调用pdf生成脚本时出现错误消息

我沿着权限和选项的道路走,完全是偶然发现了一些东西。我没有为PHP分配足够的内存来完成事务

我补充说:

ini_set("memory_limit", "2048M");

在调用我的生成脚本之前,它没有错误地完成。内存显然可能过多,但您可以根据需要进行调整。

我通过删除第行中的双引号解决了问题:

$cmd = '/opt/local/bin/gs -sDEVICE=pdfwrite -dNOPAUSE \
-dBATCH -dSAFER -dFirstPage=20 -dLastPage=20
-sOutputFile=%stdout  /path/to/input/pdf.pdf';

在PHP+Ubuntu18.4+Apache2.4上使用shell_exec进行测试,Apache用户具有对源PDF的读访问权限,以及对TMPDIR的读/写访问权限。我不确定还需要什么。我已尝试使用putenv()添加我的shell的所有环境变量,结果相同。@alexantd如果您在$cmd中尝试sudo并以用户的身份从命令行运行它,会发生什么情况。我整个上午都在与此进行斗争,我不知道我做了什么,但完全相同的代码现在可以工作了。谢谢:)将shell脚本所在目录的chmod权限设置为0777,解决了我的问题。
$cmd = '/opt/local/bin/gs -sDEVICE=pdfwrite -dNOPAUSE \
-dBATCH -dSAFER -dFirstPage=20 -dLastPage=20
-sOutputFile=%stdout  /path/to/input/pdf.pdf';