【问题标题】:Issue with Imagick and also with phmagick: Postscript delegate failed / No such file or directoryImagick 和 phmagick 的问题:Postscript 委托失败/没有这样的文件或目录
【发布时间】:2012-05-14 10:05:31
【问题描述】:

我正在使用 imagick 3.0.1 和 phmagick (http://www.francodacosta.com/phMagick/download)。无论如何,当我尝试将 PDF 转换为 JPEG 时,两者都会给我同样的错误。

例如: Postscript 委托失败`/tmp/magick-bfxIrUJ5':没有这样的文件或目录@error/pdf.c/ReadPDFImage/669

我正在使用 Ghostcript-9.05(在 /usr/local/bin/gs 上运行)。 还有 ImageMagick-6.7.6-8(在 /usr/local/bin/convert 上运行)。

我已经检查了文件夹的权限 (755)。 ImageMagick 在终端上的效果非常好。

例如,我的 PHP 使用 Imagick:

//use imagick
$im = new imagick( '/pdf/553571072.pdf' );

// convert to jpg
$im->setImageColorspace(255);
$im->setCompression(Imagick::COMPRESSION_JPEG);
$im->setImageFormat('jpeg');

//write image on server
$im->writeImage('/jpg/553571072.jpg');

顺便说一句,Imagick 它出现在我的 phpinfo() 中。我正在研究 linux/apache/amd64。

我们将不胜感激任何建议!

【问题讨论】:

  • 从终端正常运行是无关紧要的。你没有在 Apache 的 UID 下运行,所以它不是一个有效的测试。
  • 您的代码示例是来自 Web 应用程序还是来自命令行?您是否真的从文件夹“/pdf”读取并写入文件夹“/jpg”,即它们都在文件系统的根目录中?
  • Halfer,代码来自 Web 应用程序,我也尝试使用完整路径 '/var/vhost/...../pdf/',与 jpg 相同。文件夹位于基础中,与 /css 和 /js 相同。马克,我不明白你的意思,我在 VPS 上运行一个 Web 应用程序。谢谢大家。

标签: php pdf imagemagick ghostscript imagick


【解决方案1】:

我在使用 ImageMagick ImageMagick 6.7.7-10GhostScript 9.10 时遇到了这些问题。

事实证明 PDF 已损坏,尽管一些较新的 GS 版本可以读取它们,但由于出现以下错误,旧版本不能。

   **** Warning:  An error occurred while reading an XREF table.
   **** The file has been damaged.  This may have been caused
   **** by a problem while converting or transfering the file.
   **** Ghostscript will attempt to recover the data.

在Linux下,你可以先通过pdftk传递PDF:

pdftk 'bad.pdf' output 'fixed.pdf'

在那之后,我在 Ubuntu 上一切正常。

【讨论】:

    【解决方案2】:

    我对@HelloWorld 提出的“纯PHP 解决方案”的贡献(谢谢!) 在已接受答案的cmets 中,稍作修正:必须添加变量名 在扩展默认 PATH 之前,所以
    putenv( getenv('PATH') . ':/usr/local/bin' ); 不起作用,但
    putenv( 'PATH=' . getenv('PATH') . ':/usr/local/bin' );

    *我的声誉低于 50 分,无法在正确的位置添加我的评论,所以我不得不创建一个新答案 :-)

    【讨论】:

      【解决方案3】:

      好的,感谢 Nuno Franco da Costa (http://www.francodacosta.com/) 的帮助,终于成功了。

      问题是我的 GhostScript 路径对于 Shell 来说是可以的,但对于系统和 PHP 来说是错误的。要更正此问题,您应该将您的 /usr/local/bin/gs 文件链接到 /usr/bin/gs

      从 Shell 执行以下操作:

      [root@din ~]# convert -list configure | grep -i delegates
      DELEGATES     bzlib fontconfig freetype jpeg jng png tiff x11 xml zlib
      

      检查gs 文件是否已存在于/usr/bin 中。如果有,我们会为其创建一个备份。
      如果没有/usr/bin/gs,您可以跳过这一步

      [root@din ~]# ls -l /usr/bin/gs
      -rwxr-xr-x 1 root root 6024 Sep 30  2010 /usr/bin/gs
      [root@din ~]# mv /usr/bin/gs /usr/bin/gs.orig
      

      现在创建从/usr/local/bin/gs/usr/bin/gs 的链接

      [root@din ~]# sudo ln -s /usr/local/bin/gs /usr/bin
      

      这应该可以解决问题。非常感谢各位。

      【讨论】:

      • 这也解决了我的问题......但无法指定 php-imagick gs 可执行文件在哪里?
      • 我刚刚通过这个答案。有一个简单的解决方案。只需将 'gs' 的实际路径添加到 php PATH 中: putenv(getenv('PATH').':/usr/local/bin')
      猜你喜欢
      • 2019-04-17
      • 2014-01-24
      • 2013-01-13
      • 2021-05-13
      • 1970-01-01
      • 2016-02-11
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多