使用PDF输入时出现Imagick / Ghostscript错误

时间:2014-12-21 19:26:54

标签: php imagemagick ghostscript imagick

我在Windows上安装了ImageMagick,其中包含用于imagick PHP的DLL。

我需要将PDF转换为JPEG格式。所以我也安装了Ghostcript。

如果我运行此命令:

 convert rose.pdf rose.jpg 

效果很好。但是,如果我尝试使用PHP在我的Web环境中重现相同的功能:

$im = new imagick('test_pdf.pdf[0]' ); 

$im->setImageColorspace(255);
$im->setCompression(Imagick::COMPRESSION_JPEG);
$im->setCompressionQuality(100);
$im->setImageFormat('pdf');
$im->writeImage('thumb.jpg');

然后我的页面关闭了。

我认为Imagick PHP因PDF格式而失败,因为它不知道如何使用Ghostscript库gslib

但是,使用此代码,我可以将PNG转换为JPEG。

我尝试在delegates.xml进行编辑,但我不确定应该如何做。

以下是我delegates.xml的相关行:

<delegate decode="pdf" encode="eps" mode="bi" \
    command="&quot;@PSDelegate@&quot; \
   -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 \
   -dEPSCrop \
   -sDEVICE=epswrite &quot;-sOutputFile=%o&quot; -- &quot;%i&quot;"/>

<delegate decode="pdf" encode="ps" mode="bi" \
    command="&quot;@PSDelegate@&quot; \
   -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 \
   -dEPSCrop -dAlignToPixels=0 -dGridFitTT=2 \
   -sDEVICE=pswrite &quot;-sOutputFile=%o&quot; -- &quot;%i&quot;"/>

更新

我尝试使用-verbose运行ImageMagick以获取其他提示:

convert -verbose 2.pdf 1.jpg

结果:

[ghostscript library] Files/gs/gs9.15/bin/gswin64c.exe" -q -dQUIET -dSAFER -dBATCH 
-dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dEPSCrop -dAlignToPixels=0 -dGridFitTT=2
 "-sDEVICE=pngalpha" -dTextAlphaBits=4 -dGraphicsAlphaBits=4 "-r72x72"
 "-sOutputFile=C:/Users/Usuario/AppData/Local/Temp/magick-PjagmlB-%08d" 
 "-fC:/Users/Usuario/AppData/Local/Temp/magick-1l5fdY8X"
 "-fC:/Users/Usuario/AppData/Local/Temp/magick-Fr-GsA3"
  C:/Users/Usuario/AppData/Local/Temp/magick-_PjagmlB-000000 
 1 PNG 609x791 609x791+0+0 8-bit DirectClass 47.8KB 0.016u 0:00.031
 2.pdf PDF 609x791 609x791+0+0 16-bit DirectClass 47.8KB 0.000u 0:00.031
 2.pdf=>1.jpg PDF 609x791 609x791+0+0 16-bit DirectClass 131KB 0.031u 0:00.046 –

Apache错误日志

的结果
[Mon Dec 22 09:11:59.022854 2014] [mpm_winnt:notice] [pid 6600:tid 520] AH00428: Parent: child `process 6552 exited with status 255 -- Restarting.
[Mon Dec 22 09:11:59.170587 2014] [mpm_winnt:notice] [pid 6600:tid 520] AH00455: Apache/2.4.9 (Win64) PHP/5.5.12 configured -- resuming normal operations -- PHP/5.5.12 configured -- resuming normal operations
[Mon Dec 22 09:11:59.170587 2014] [mpm_winnt:notice] [pid 6600:tid 520] AH00456: Apache Lounge VC11 Server built: Mar 16 2014 12:42:59
[Mon Dec 22 09:11:59.170587 2014] [core:notice] [pid 6600:tid 520] AH00094: Command line: 'c:\\wamp\\bin\\apache\\apache2.4.9\\bin\\httpd.exe -d C:/wamp/bin/apache/apache2.4.9'
[Mon Dec 22 09:11:59.170587 2014] [mpm_winnt:notice] [pid 6600:tid 520] AH00418: Parent: Created child process 4484
[Mon Dec 22 09:11:59.807339 2014] [mpm_winnt:notice] [pid 4484:tid 436] AH00354: Child: Starting 64 worker threads.

我在加载PDF时创建了一个var_dump

$im = new imagick( __DIR__ . DIRECTORY_SEPARATOR .'test_pdf.pdf' ); 
 var_dump($im);die;

但是在输入var_dump之前页面会关闭。

TEST SCENARIOS

  • 在CommandLine上使用PHP的PDF到JPG&gt;原理
  • 使用浏览器中的PHP-FPM将PDF格式化为JPG&gt;不起作用(上面的错误)
  • 从浏览器使用PHP-FPM将JPG转换为PDF&gt;原理

2 个答案:

答案 0 :(得分:1)

它对我有用:)。我已经尝试了几个月的安装而没有成功。

我只是按照这个主题:Where to find php_imagick.dll for php 5.5.12 for Windows wampserver 2.5?

然后,我在C:/wamp/bin/php/php.5.5.12/ext/imagick中复制/粘贴C:/Path/to/ImageMagick/delegates.xml并编辑代理标签为pdf:

<delegate decode="eps" encode="pdf" mode="bi" command="&quot;C:\Program Files (x86)\gs\gs9.15\bin\gswin32c.exe&quot; -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -sDEVICE=pdfwrite &quot;-sOutputFile=%o&quot; -- &quot;%i&quot;"/>

答案 1 :(得分:0)

以下是来自 我的 delegates.xml的相关行。但是我没有使用Imagick和PHP,所以我不确定这是你需要做的唯一改变才能让它发挥作用。

首先,一个表单,让您无需水平滚动即可阅读。您必须删除换行符以及我插入的行继续符号 \

<delegate decode="pdf" encode="eps" mode="bi" \
  command="&quot;/opt/local/bin/gsx&quot; \
 -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 \
 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=epswrite&quot; \
  &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/>

<delegate decode="pdf" encode="ps" mode="bi" \
  command="&quot;/opt/local/bin/gsx&quot; \
 -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 \
 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=ps2write&quot; \
  &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/>

现在的原始线条。您需要水平滚动才能完全看到它并保持原始形状:

<delegate decode="pdf" encode="eps" mode="bi" command="&quot;/opt/local/bin/gsx&quot; -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=epswrite&quot; &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/>
<delegate decode="pdf" encode="ps" mode="bi" command="&quot;/opt/local/bin/gsx&quot; -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=ps2write&quot; &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/>

这些行来自我的Mac OS X版ImageMagick,6.9.0-0 Q16 x86_64 2014-12-06

如您所见,它不使用@PSDelegate - 语法。相反,它包含Ghostscript可执行文件的完整路径,位于 我的 案例/opt/local/bin/gsx中。

对于 您的 情况,它应该是Ghostscript可执行文件的完整Windows路径,通常名为gswin32c.exegswin64c.exe

您对奇怪的@PSDelegate的问题可能来自于您安装了Ghostscript 之后安装了ImageMagick / Imagick ,并且之后才安装了Ghostscript。 ..

更新

也许你应该在delegates.xml文件中尝试安装Windows / Ghostscript以下几行:

<delegate decode="pdf" encode="eps" mode="bi" command="&quot;C:/Program Files/gs/gs9.15/bin/gswin64c.exe&quot; -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=epswrite&quot; &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/>
<delegate decode="pdf" encode="ps" mode="bi" command="&quot;C:/Program Files/gs/gs9.15/bin/gswin64c.exe&quot; -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=ps2write&quot; &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/>

注意 ,您不需要使用反斜杠('\') - Ghostscript和ImageMagick可以使用正斜杠('{{ 1}}')在Windows上。