:

使用 Imagick 转换PDF到PNG

song100e 发布于:2018-7-10 14:13 分类:PHP  有 94 人浏览,获得评论 0 条 标签: Imagick 

今天遇到个业务问题,就是给订单开电子发票,给客户显示来看,由于生成的是pdf文件,怕在客户手机上看还要下载插件什么的,索性就直接转成png图片格式了。网上的主流方案也是使用php的扩展ImageMagick插件。

1 安装ImageMagick
下载:wget https://netix.dl.sourceforge.net/project/imagemagick/im7-src/ImageMagick-7.0.7-25.tar.gz
解压:tar -zxvf ImageMagick-7.0.7-25.tar.gz
解压完毕后进入该文件夹:
执行命令 ./configure 默认安装路径在/usr/local下
执行命令 make && make install,编译并安装ImageMagick
20180316173853845.jpg
完成之后进入安装文件夹,查看ImageMagick是否工作
cd /usr/local/bin/
./convert -version

2 安装PHP扩展Imagick.so
http://pecl.php.net/package/imagick/download
解压后进入该目录,执行phpize
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-imagick=/usr/local
make && make install
安装完了后我们要修改php的配置文件,添加上imagick.so,重启php-fpm
imagick.PNG

这个时候我们试试pdf转png,以失败告终,控制台的测试都失败了别说用php的系统调用了。

convert.png


3 安装GhostScript

https://www.ghostscript.com/download/gsdnld.html

ghostscript.PNG

下载,解压,进入文件夹,
完了之后记得给gs的可执行文件copy一份到/usr/bin目录下,这样就可以全局执行了
到这里基本上就完成了所有模块的安装,试试pdf转png行不行

很好,没有报错,转成了png图片了,下面终于可以写代码了。

        Note:在生产环境中出现了一个奇怪现象,和测试环境一样的版本,却无法转化图片,经过多轮编译安装测试,采用以下安装方法解决问题, 希望对碰到同样问题的小伙伴有所帮助。
[root@VM_0_16 ~]# cd /usr/src
[root@VM_0_16 src]# wget http://ghostscript.com/releases/ghostscript-8.71.tar.gz
[root@VM_0_16 src]# tar zxvf ghostscript-8.71.tar.gz
[root@VM_0_16 src]# cd ghostscript-8.71
[root@VM_0_16 ghostscript-8.71]# ./configure --prefix=/usr
[root@VM_0_16 ghostscript-8.71]# mkdir obj
[root@VM_0_16 ghostscript-8.71]# mkdir bin
[root@VM_0_16 ghostscript-8.71]# make all
[root@VM_0_16 ghostscript-8.71]# make install

4 编写PHP代码

<?php
$PDF = './test.pdf';
$Path= './';
var_dump(pdf2png($PDF,$Path));

function pdf2png($PDF,$Path){
   if(!extension_loaded('imagick')){
        return false;
   }
   if(!file_exists($PDF)){
        return false;
   }
   $IM =new imagick();
   $IM->setResolution(652, 605);
   $IM->setCompressionQuality(100);
   $IM->readImage($PDF);
   foreach($IM as $Key => $Var){
        $Var->setImageFormat('png');
        $Filename = $Path.'/'.md5($Key.time()).'.png';
        if($Var->writeImage($Filename)==true){
            $Return[]= $Filename;
        }
   }
   return $Return;
}



赞助我,共同学习进步!