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

Posted

技术标签:

【中文标题】从 PHP 调用 Ghostscript:无法打开初始设备【英文标题】:Invoking Ghostscript from PHP: Unable to open the initial device 【发布时间】:2011-07-20 17:02:08 【问题描述】:

我已经从 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);

当我在网络浏览器中点击此脚本时,我看到:

GPL Ghostscript 9.02 (2011-03-30) Copyright (C) 2010 Artifex Software, Inc.
All rights reserved. This software comes with NO WARRANTY: see the file
PUBLIC for details. **** Unable to open the initial device, quitting.

同样的命令可以在 shell 中运行。

【问题讨论】:

【参考方案1】:

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

【讨论】:

Apache 用户具有对源 PDF 的读取权限,以及对 TMPDIR 的读/写权限。我不确定还需要什么。我尝试使用 putenv() 添加所有 shell 的环境变量,结果相同。 @alexantd 如果您在 $cmd 中尝试 sudo 并从其工作的命令行以用户身份运行它会发生什么。 我整个上午都在和这个作斗争,我不知道我做了什么,但是现在完全相同的代码可以工作。谢谢:) 将shell脚本所在目录的chmod权限设置为0777,解决了我的问题。【参考方案2】:

我也遇到了这个错误,我花了 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 不理解意外的换行符,因此只需在每个换行符前添加一个反斜杠 \ 即可解决问题。

【讨论】:

【参考方案3】:

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

$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 测试

【讨论】:

【参考方案4】:

我在使用PHP调用pdf生成脚本时遇到**** Unable to open the initial device, quitting.错误信息。

我正在遵循权限和选项的路径,完全偶然地偶然发现了一些东西。我没有为 PHP 分配足够的内存来完成交易。

我补充说:

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

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

【讨论】:

以上是关于从 PHP 调用 Ghostscript:无法打开初始设备的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何在文件路径中使用空格从java调用ghostscript

PDF 优化 Acrobat 与 Ghostscript

如何在ghostscript中调用字体目录

在 Azure php 服务器上使用 Imagick 安装 Ghostscript

Treepoem 条码生成器无法找到 ghostscript

如何从 C# 程序执行 ghostscript