在windows平台下php使用imagick库把pdf转换成(合并)图片

来源:互联网 发布:淘宝助理快递模板设置 编辑:程序博客网 时间:2024/05/21 15:07

在windows平台下php使用imagick库把pdf转换成(合并)图片

开发背景
上传的word文档需要转换成图片,在网上找了资料,主要是先转换成pdf:
1. 在windows下用com组件加上office,优点是转换后的文档基本和原来一样,缺点就是依赖于windows平台
2. 第二种是用openoffice加上Java写的jodconverter,优点是各个平台都行,缺点是如果原文档有特殊格式(公式、宏…),则转换后会丢失,而且需要开放shell权限(webservice除外)

这里主要是介绍pdf转换成图片

开发环境

  • win7
  • ImageMagick-6.9.1-4-Q16-x86-dll.exe (ftp://ftp.imagemagick.org/pub/ImageMagick/binaries/ImageMagick-6.9.1-4-Q16-x86-dll.exe)
  • php_imagick-3.3.0rc1-5.5-ts-vc11-x86.zip(http://windows.php.net/downloads/pecl/releases/imagick/3.3.0rc1/php_imagick-3.3.0rc1-5.5-ts-vc11-x86.zip)
  • php-5.5.25-Win32-VC11-x86.zip(http://windows.php.net/downloads/releases/php-5.5.25-Win32-VC11-x86.zip)
  • vcredist_x86.exe(http://download.microsoft.com/download/9/C/D/9CD480DC-0301-41B0-AAAB-FE9AC1F60237/VSU4/vcredist_x86.exe)
  • ghostscript(http://power2.onlinedown.net/down/gs906w32.zip)

安装环境

  • php就不介绍了
  • imagick: 双击安装,在出现多个复选框的时候需要把”安装目录添加到path环境变量中”、“c/c++的开发环境”勾选上,另外如果不希望默认用imagick打开图片,把相关的勾去掉。最后在安装完成后需要定义环境变量MAGICK_HOME=$magick-install-dir/modules/coders/
  • php-imagick: 把php_imagick.dll放到php安装目录/ext/下,然后修改php.ini,添加extension=php-imagick.dll。如果是全新安装php,看看extension_dir有没有定义,如果没有需要定义:extension_dir=$php-install-dir/ext
  • ghostscript:正常安装就可以,如果不安装代码运行的时候会报错
  • vcredist: 这个是vc11编译后的代码需要,可以先不用安装,先把代码写了,然后试运行,如果没有问题说明windows自带了,如果出现类似于“nnn.dll无法定位或打开”或者 “vcomp110.dll没找到”则需要安装

安装大概花了1天半,代码花了半天。安装上面已经写了,需要特别注意的就是在下载不同的库的时候需要注意由哪个vc版本编译的,以及当前windows支持哪个版本,这个可以去c盘下搜索vcomp,看看结果是什么,有没有自己需要的,如果没有,就去windows的官网下载运行时环境。

下面是代码段,仅供参考

try {            $im = new imagick();            $im->setCompressionQuality(90);            $im->readImage('file.pdf');            $canvas = new imagick();            foreach($im as $k => $sub){                $sub->setImageFormat('png');                $sub->stripImage();                $sub->trimImage(0);                $canvas->newImage($sub->getImageWidth()+10,                     $sub->getImageHeight()+10+($k+1 == $im->getNumberImages() ? 10 : 0),                     'gray');                $canvas->compositeImage($sub, Imagick::COMPOSITE_COPY, 5, 5);            }            $canvas->resetIterator();            $canvas->appendImages(true)->writeImage($dest);        } catch (Exception $e) {            throw $e;        }

下面谈谈代码
开始的时候是参照网上给出的代码段进行的,可是不太理想,有的是根本不行
1. 例如用addImage方法,最后用combineImage进行合并,这套思路试了好久,最后就是没有结果,可能方法的细节没有把握到位。
2. 用单个image进行compositeImage,这个思路需要注意的就是设置image的大小,另外在循环copy之前,需要不断改变image的大小,而我使用setSize则无法达到要求(其他方法没试),所以也很别扭。

最后无意中看到了appendImages这个方法,觉得有点暮然回首的感觉。如果不需要做特殊处理,可以不用canvas,直接调用append就行

心得:使用一个不熟的第三方库开发的时候,最好先把api大致浏览下,然后再去网上参照相关思路。还有,如果本地的文档介绍不详细,可以参照php.net上的文档, 而且上面还有有一些别人写的例子供参考。

另外附上牛人总结的关于图片压缩的文章:http://blog.lizhigang.net/archives/228

以上仅是个人经验,如有不足请指出!

0 0
原创粉丝点击