代码分享之使用ImageMagick将PDF转图片技术
使用 PHP 扩展 Imagick 将 PDF 转成图片,实际上 Imagick 完全是一个客户端,调用的还是 ImageMagick 提供的功能。关于 Imagick 扩展,官方文档的示例很少,文档的描述也非常少,导致一般人看文档后仍然不知道怎么写代码。而官网的评论特别混乱,需要不断试错才知道正确的写法。
将 PDF 转换为图片代码分享
下面分享使用 PHP 扩展 Imagick 将 PDF 转为图片的代码示例,仅供参考:
function ConvertPdfToJpg($pdf){ $im = new Imagick($pdf); $im->setResolution(100, 100); $count = $im->getNumberImages(); $result = array(); for ($i=0; $i<$count; $i++) { $im2 = new Imagick(); $im2->setResolution(100, 100); $im2->readimage($pdf . '[' . $i . ']'); $im2->setImageFormat('jpeg'); $dir_name = 'businessplan/thumb/' . date('Ymd/H') . '/'; $dir_path = UPLOAD_PATH . $dir_name; if (!is_dir($dir_path)) { mkdir($dir_path, 0755, true); } $filename = uniqid() . '.jpg'; $im2->writeImage($dir_path . $filename); $im2->clear(); $im2->destroy(); $result[] = $dir_name . $filename; } $im->clear(); $im->destroy(); return $result; }
上面的代码在功能上是没有问题的,从程序的写法上来看,感觉效率是不高的。每次遍历一张 PDF,都重新 new 了一个对象,然后通过这个对象去读取这一张 PDF 的内容(这样会不会重新加载整个 PDF 文档?);第一次为了计算 PDF 页数,也 new 了一个对象。不过实际运行下来,还是非常慢,一个十多页的 PDF,如果内容特别复杂,需要将近一分钟的时间,如果内容相对简单,十几秒可以转换完成。测试发现,降低 resolution 的值可以加快速度,设置为 30 的话图片的质量仍然能被接受。
解决 imagemagick no decode delegate for this image format
如果 ImageMagick 没有正确安装好,程序在运行的时候会报“NoDecodeDelegateForThisImageFormat”这样的错误。下面给出 CentOS 下的安装方法,如下示例:
$ yum -y groupinstall 'Development Tools' $ yum -y install bzip2-devel freetype-devel libjpeg-devel libpng-devel libtiff-devel giflib-devel zlib-devel ghostscript-devel djvulibre-devel libwmf-devel jasper-devel libtool-ltdl-devel libX11-devel libXext-devel libXt-devel lcms-devel libxml2-devel librsvg2-devel OpenEXR-devel php-devel $ wget http://www.imagemagick.org/download/ImageMagick.tar.gz $ tar -xvzf ImageMagick.tar.gz $ cd ImageMagick* $ ./configure $ make $ make install $ convert --version
安装完成后,使用 convert --version 来检测 ImageMagick 是否安装成功。
更多参考
参考链接:https://www.vultr.com/docs/install-imagemagick-on-centos-6
暂无