ImageMagick-6.9.3-7-vc11-x86.zip
ImageMagick-6.8.9-6-Q16-x86-dll.zip
ImageMagick-6.9.2-1-Q16-x64-dll.zip

项目需求,要将pdf文件转化成图片格式,要求清晰度够高。php自带的GD库没去找过方法,但之前就看到网上很多人对imageMagick软件很推崇,对于PHP,http://pecl.php.net提供了对应的扩展可以使用。当时没感觉有多难,因为之前有装过yaf扩展,基本流程都知道的。

windows7

公司提供的是windows7系统(64位),所以首先在windows7上进行尝试。注意,这个64位与后面安装的软件及扩展都没有关系,没有关系,没有关系!

本地环境是基于xampp(Apache/2.4.18 (Win32) PHP/5.6.16)搭建的,xampp坑人的一点是在windows系统上,不管你系统本身,它都是x86(32bit)版本,而在mac os和 linux确都是64位的。所以下载的软件和扩展中选择的版本也要是x86的。

之前没有装过需要软件支持的扩展,这次装了之后才了解到,往往软件版本更迭要比扩展来得快。imageMagick对于PHP的扩展官方叫imagick,目前(2018/06/14)软件imageMagick最新版本到了7.0.8-0,而扩展imgaick到了3.4.3稳定版,对于编译版本,只有一个安装包,而对于exe安装文件根据php版本来分的,要求php5.4以上。在php某个版本上,又有ts和nts,x86和x64之分。通过输出phpinfo(),参数Architecture决定x86和x64,参数Thread Safety值为enabled,就是ts,值为disabled,就是nts。参数Compiler代表编译器类型,我的Compiler值为MSVC11 (Visual C++ 2012),即vc11。这几个参数再选择windows版本的软件和扩展有着决定作用,只有选择相对应的版本才能有效。并且,在imagick扩展安装之后,phpinfo()输出中会有一个iamgick模块,里面Imagick compiled with ImageMagick version标识了支持软件的最大版本(或者说指定版本,在windows上如果扩展支持的版本与安装版本不一致的话,扩展中可能会成功的展示出支持的版本类型,但是当我使用readImage函数读取pdf文件时,程序会挂掉,弹出server httpd falied错误)。

安装过程很是艰辛。因为一直在不断地试错。

下载了错误的扩展版本,扩展模块一直出不来。

在安装了3.4.3版本扩展(最高支持软件版本到6.9.3-7),再在官网上安装了最新版本的7.0的软件,之前不知道,安装了软件后要看看有没有支持版本,直接去跑程序,然后程序报错,说不支持pdf版本,有两个原因,一是软件不匹配,未提供版本,二是未安装ghostscript(pdf读取器)。

去软件官网找6.9.3-7版本,没有,去网上搜,csdn上提供了版本资源,但要钱,很坑,估计是知道了官网没有提供版本,就立马炒的火热,超级贵的都有。

好不容易找到一个,但感觉目录结构很不对,一般的是安装好后自动把安装目录添加到path,如:D:\ImageMagick-6.8.9-Q16,然后再手动添加一个key为MAGICK_HOME的系统变量,值类似:D:\ImageMagick-6.8.9-Q16\modules\coders,要指向到modules下的coders目录,说是要定位modules目录位置。之前也有看到把coders下文件全都复制到安装目录下的,大概就是省得再去添加系统变量。但是这个我好不容易下下来的版本,安装目录下的结构为bin,include和lib,根本没有modules目录,并且版本属于便携版,即需要手动添加可执行文件到path下。我把bin目录地址放到系统变量path下后,convert指令可以正常使用,也有支持的版本,查看bin目录,发现其实就是把coders下的文件都复制到安装目录了,也就是那些支持的文件类型。但是跑代码的时候,一直报错,提示缺少delegates.xml文件,还有delegate failed以及image type不支持demo.pdf。网上找教程怎么都不ok,就算之后装了ghostscript也没什么x用。

不行的话,只能试试其他正常一点的版本了,看到《匹配方案及下载地址》教程,下了一个对用php5.6的版本,但根本找不到可用的软件包,或者有哪些软件包的地址都失效了。很坑,扩展支持到6.9.3-7,但官方版本最低的都是6.9.10,下了这个相近版本,试了一下,支持文件类型出来了,但是执行的时候还是会挂掉,弹出错误server httpd failed。又看到有的博主说,扩展里提到的软件版本是支持的软件最大版本,所以使用低版本的软件可能是一个解决方案,但我搜了那么多,要么是那种编译包,要么就是文件地址不存在。最后只找到上面提到的目录结构有点异常的6.9.3-7版本和6.8.9。但后者安装后,还是跟前面一样,支持的文件类型出来了,但是跑程序的时候,会挂掉,弹出错误server httpd failed。

真的是辗转反侧,就是没有找到解决方案,于是又找到那个目录结构有点异常的6.9.3-7的版本,想着它缺少的文件在其他版本里是不是可以拿来替换。在6.8.9的版本里,我把所有安装目录下的xml文件全都复制出来,放到6.9.3-7下的bin目录中。再跑一次,竟然成功了!开心开心!

但扩展imagick确实在效率上比软件直接命令行执行差太多了。甚至在高清晰度的要求了,执行时间超过了php默认的超时时间30s,这样的效率是不能忍的。反观同公司的java同事找到的pdf2img,在执行效率上确实胜过php太多。不禁有点伤感,难怪做java开发的有点瞧不起PHP开发的,虽然后者在web开发领域很强势,但代码执行效率及扩展性是硬伤啊!

但想到php7.0以后,听说执行效率有一个跨度的飞跃,又重燃了信心,只要这个行业没有正真的垮掉,就一直做下去,当然,java和python也是要学起来的,这些起码是个后路吧!

未完待续

相关链接:
imageMagick官网下载地址
pecl扩展下载地址
匹配方案及下载地址
Ghostscript官网下载地址

参考:
CentOS 7+环境下PHP使用Imagick+ghostscript将PDF文件转为图片
wamp环境下安装imagick扩展
windows7下php5.4成功安装imageMagick,及解决php imagick常见错误问题
windows下6.9.3-7便携版下载原地址
Cactuslab · ImageMagick installer for Mac OS X
意外找到的游戏开发学习教程
centos安装php扩展imagick-高性能处理图片(主要看他对imagick类的重新封装)