PHP中使用imagick实现把PDF转成图片

这篇文章主要介绍了PHP中使用imagick实现把PDF转成图片,本文着重讲解了2个错误的处理,特别是GhostScript错误,需要的朋友可以参考下

PHP Manual里,对imagick的描述,真的是简洁,每个成员函数,点击打开就看到如下文本:

Warning

This function is currently not documented; only its argument list is available.

刚才解决了PHP加载问题后,对图片的处理相当方便,网上随便找了一段:

  1. <?php
  2. Header("Content-type: image/jpeg");
  3. /**
  4. * 缩小图片尺寸.
  5. *
  6. * @param $image 待处理的二进制图片
  7. * @param $width 处理后图片尺寸的宽度(px)
  8. * @param $height 处理后图片尺寸的高度(px)
  9. * @param $crop 是否裁剪图片
  10. *
  11. * @return 处理好的二进制图片
  12. */
  13. function resize($image, $width, $height, $crop)
  14. {
  15. $imagick = new Imagick($image);
  16. $w = $imagick->getImageWidth();
  17. $h = $imagick->getImageHeight();
  18. if ($w > $width || $h > $height)
  19. {
  20. if ($crop)
  21. {
  22. $imagick->cropThumbnailImage($width, $height);
  23. }
  24. else
  25. {
  26. $imagick->resizeImage($width, $height, Imagick::FILTER_LANCZOS, 1, true);
  27. }
  28. }
  29. $processed_image = $imagick->getImageBlob();
  30. return $processed_image;
  31. }
  32. $s=resize("123.jpg", 60, 40, 1);
  33. echo $s;
  34. ?>

但我要用这个扩展做的,是将PDF转成PNG,PDF哦!代码如下:

  1. <?php
  2. /**
  3. * PDF2PNG
  4. * @param $pdf 待处理的PDF文件
  5. * @param $path 待保存的图片路径
  6. * @param $page 待导出的页面 -1为全部 0为第一页 1为第二页
  7. * @return 保存好的图片路径和文件名
  8. */
  9. function pdf2png($pdf,$path,$page=-1)
  10. {
  11. if(!extension_loaded('imagick'))
  12. {
  13. return false;
  14. }
  15. if(!file_exists($pdf))
  16. {
  17. return false;
  18. }
  19. $im = new Imagick();
  20. $im->setResolution(120,120);
  21. $im->setCompressionQuality(100);
  22. if($page==-1)
  23. $im->readImage($pdf);
  24. else
  25. $im->readImage($pdf."[".$page."]");
  26. foreach ($im as $Key => $Var)
  27. {
  28. $Var->setImageFormat('png');
  29. $filename = $path."/". md5($Key.time()).'.png';
  30. if($Var->writeImage($filename) == true)
  31. {
  32. $Return[] = $filename;
  33. }
  34. }
  35. return $Return;
  36. }
  37. $path="images";//请确保当前目录下有这个文件夹,由于一直要用,所以就不加检测了
  38. $s=pdf2png("test.pdf",$path);
  39. $scount=count($s);
  40. for($i=0;$i<$scount;$i++)
  41. {
  42. echo "<div align=center><font color=red>Page&nbsp;".($i+1)."</font><br><a href=\"".$s[$i]."\" target=_blank><img ".$s[$i]."\"></a></div><p>";
  43. }
  44. ?>

跟上面的差不多吧?可是总是不成功,readImage那边异常了,查看错误输出:

PHP Fatal error: Uncaught exception 'ImagickException' with message 'PostscriptDelegateFailed `test.pdf': No such file or directory'

百度谷歌了好久,最后灵机一动,不是说Postscript么?我找,我装。

这个Postscript,其实是GhostScript。

装好后,一跑,OK啦!