php pdf转图片

#php Imagick pdf转图片
最近公司做一个附件管理,需要上传pdf转图片,上网查了一大堆资料,顺利的安装好,并转图片成功,中间也走过很多坑,所以记录下来,供大家参考。

安装imagick扩展之前先要了解下ImageMagick和ghostscript 的关系:
php pdf转图片_第1张图片

1、安装编译工具

yum install wget make gcc gcc-c++ gtk±devel zlib-devel openssl openssl-devel pcre-devel kernel keyutils patch perl

2、安装ghostscript

wget http://downloads.ghostscript.com/public/ghostscript-9.02.tar.gz
tar zxf ghostscript-9.02.tar.gz
cd ghostscript-9.02
./configure
make
make install

3、安装ImageMagick

cd /usr/local/src #进入软件包存放目录
wget http://www.imagemagick.org/download/ImageMagick.tar.gz #下载ImageMagick
tar zxvf ImageMagick.tar.gz #解压
cd ImageMagick-6.7.9-3 #进入安装目录
./configure --prefix=/usr/local/imagemagick #配置
make #编译
make install #安装
export PKG_CONFIG_PATH=/usr/local/imagemagick/lib/pkgconfig/ #设置环境变量

4、安装imagick

cd /usr/local/src
wget http://pecl.php.net/get/imagick-3.0.1.tgz #下载imagick
tar zxvf imagick-3.0.1.tgz
cd imagick-3.0.1
/usr/bin/phpize #用phpize生成configure配置文件 这个是我的phpize路径,可以用whereis phpize查看
./configure --with-php-config=/usr/bin/php-config --with-imagick=/usr/local/imagemagick #配置 php-config路径同上查看方式
make #编译
make install #安装

5、php加载imagick扩展

#vi /etc/php.ini
extension=“imagick.so”
#:wq! #保存退出

6、重新加载php-fpm

#service php-fpm reload
如果是apache 则 #service httpd restart

7、测试

  1. 在代码中phpinfo();
  2. 命令行中 php -m
    都可以查看到是否安装成功扩展,有imagick说明安装成功

可能出现的错误

  1. 我之前安装过很多次都提示安装失败,安装完imagick后没有任何提示,从网上搜索了一下,还有一种方法安装,通过pecl安装imagick扩展,代码如下:
    pecl install imagick

  2. 在安装过程中出现错误,一般是由于缺少编译工具包导致,可根据提示参照第一步安装相应的工具包即可,可能还需要安装libpng,libjpeg

  3. 安装好了,可能pdf转的图片格式也不是都可以转的,需要进入imagick目录,用命令行查看一下可以转的格式支不支持,命令如下:
    convert -list format
    没有对应的格式就需要重新安装版本了

  4. 安装好了,需要pdf转图片,代码如下


下面展示一些 代码片

 private function _pdf2png($pdf,$path){
        if(!extension_loaded('imagick')){
            return false;
        }
        if(!file_exists($pdf)){
            return false;
        }
        $image = new Imagick();
        $image->setResolution( 300, 300 );
        $image->setcompressionquality(100);
        $image->readimage($pdf);
        $pages = count($image);
        if($pages == 0){
            return false;
        }
        FoxCommon::createdir(Yii::app()->params['staticPath'] . $path);
        foreach ($image as $k => $v){
            $v->setImageFormat( "jpg" );
            $fileName = $path . '/' . $k . '.jpg';
            $filePath = Yii::app()->params['staticPath'] . '/' .$fileName;
            if(file_exists($filePath)){
                $files[] = $fileName;
            }else{
                if($v->writeImage($filePath) == true){
                    $files[] = $fileName;
                };
            }
        }
        return $files;
    }

后来上传到线上,实际使用中发现,上传10兆以上的文件,转图片就很慢了,而且服务器Imagick没转图片成功会占用很多磁盘空间,就算转成功了一个图片也2到3兆,太大了,后来一查是图片转的质量的问题,下面两段代码的问题:

$image->setResolution( 300, 300 ); // 设置图像分辨率
$image->setcompressionquality(100); // 设置对象的默认压缩质量

将上面两段代码改外

$image->setResolution( 80, 80 ); // 设置图像分辨率
//$image->setcompressionquality(100); // 设置对象的默认压缩质量不设置,一个介于1和100之间的整数,1 =高压缩,100=低压缩,也可以根据自己的实际情况来

改完后转十几兆的pdf就很快了,几秒钟就行了,而且转出来的图片就几百K,图片的质量还是可以的,至此就大功告成了。

ps:有兴趣的可以关注下我的公众号和小程序,谢谢啦~~
在这里插入图片描述在这里插入图片描述

你可能感兴趣的:(php,学习,Yii,php)