记PDF转图片的那些坑

记PDF转图片的那些坑

Scroll Down

前提准备

相关地址集合:

项目的前提

  • 使用的是Think php5.0
  • 为了方便已经完成大文件上传
  • 还有一大批测试使用的pdf文档
  • PHP版本:7.3、5.6(均是 NTS版)

步骤

1. 安装 ImageMagick

注意一:因为 pdf 转图片的本质是通过 PHP 的 ImageMagick 扩展调用 ImageMagick 读取图片等一系列操作,所以需要安装 ImageMagick 客户端

注意二:因为条件限制本文只阐述 Windows 和 Linux 的安装方法

Windows

windows 安装很简单,直接下载安装包,一般选择最新的就行了,下一步下一步就行,下载地址在上面也贴出来了。最后很多人说要配置一下,环境变量;有的人没有配置成功了,也有人没有配置也成功了。具体是因为在安装的过程中可能自动帮你配置好了黄健变量。

注:根据下图中框出的选项并勾选。

Snipaste_2020-04-01_22-15-31

Linux

下载地址:ImageMagick-7.0.7-25 (嫌慢的可以试试:https://pic.sakura10032.club/file/ImageMagick-7.0.7-25.tar.gz)

  1. 下载命令:wget https://netix.dl.sourceforge.net/project/imagemagick/im7-src/ImageMagick-7.0.7-25.tar.gz
  2. 解压:tar -zxvf ImageMagick-7.0.7-25.tar.gz
  3. 解压完毕后进入该文件夹
  4. 执行命令(默认参数,没有更改): ./configure
  5. 执行完了后如下图所示,默认安装路径在/usr/local下

执行配置

  1. 执行命令,编译并安装ImageMagick: make && make install
  2. 完成之后进入安装文件夹,查看ImageMagick是否工作 cd /usr/local/bin/ ./convert -version

结果如下:

编译安装

2. 安装PHP扩展 Imagick(重中之重)

根据你的 PHP 版本进行安装,这里本人是7.3 x64的所以安装 7.3 Non Thread Safe (NTS) x64(Windows) imagick-3.4.4.tgz(Liunx)

Windows

windows 的安装很简单,直接把文件解压,将 php_imagick.dll 放到 PHP 的扩展文件夹中,然后在 php.ini 文件中开启扩展。最后,重启计算机。

在 php.ini 中添加下面这句即可

extension=php_imagick.dll

重启后在 phpinfo 页面中可以看到如下数据:

成功页面

注:如果没有出现,可能有以下几种情况

  1. Imagick 扩展和 PHP 版本不对应
  2. 你的 PHP 版本过高,建议换成 5.6 ;如果不能换,后面我会提到一劳永逸的办法
  3. 检查你的 php.ini 文件是否填写准确,在终端输入 php -m ,查看是否有 php_imagick 模块,或者报错
  4. 你运气不好,这东西有点玄学;老规矩 重启

Linux

下载我之前贴的链接文件,解压,配置

编译安装:使用下面命令行配置扩展安装,指定--with-php-config是为了统一管理我的extension.so,如果不指定,你也可以copy到php.ini指定的extension位置,--with-imagick默认是/usr/local如果你没改动的话。 ./configure --with-php-config=/usr/local/php7/bin/php-config --with-imagick=/usr/local

然后就是 make && make install

简单点直接使用 phpize 进行安装。

最终还是出现:

成功页面

坑一

错误:

convert: FailedToExecuteCommand 'gs' -sstdout=%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 '-sDEVICE=pngalpha' -dTextAlphaBits=4 -dGraphicsAlphaBits=4 '-r72x72' '-sOutputFile=/tmp/magick-26757KhSit2bKyfwa%d' '-f/tmp/magick-26757lL6cdz2j5VDZ' '-f/tmp/magick-26757SnLQ7f7amJLO'' (1) @ error/pdf.c/InvokePDFDelegate/291.

解决办法

安装GhostScript

注:像遇到 gs 报错,是因为在执行图片转换时需要调用 GhostScript 去将图片生成

Lunix

下载安装 ghostscript-9.22-linux-x86_64.tgz,解压并将执行文件复制到/usr/bin目录下

Windows

直接安装官网的 exe 文件安装即可

坑二

具体内容

在 pdf 需要进行多图片转化时,无法将 pdf 中所有的页数转换出来

解决办法

缩小对图片的分辨率,已经提高对图片的压缩

写在最后

将最后需要的代码贴出来

    /**
     * 将pdf文件转化为多张png图片
     * @param string $pdf pdf所在路径 (/www/pdf/abc.pdf pdf所在的绝对路径)
     * @param string $path 新生成图片所在路径 (/www/pngs/)
     * @return array|bool
     * @throws ImagickException
     */
    function pdf2pngMore($pdf, $path)
    {
        if (!extension_loaded('imagick')) {
            return false;
        }
        if (!file_exists($pdf)) {
            return false;
        }
        $im = new Imagick();
        $im->setResolution(80, 80); // 设置分辨率值越大分辨率越高
        $im->setCompressionQuality(100); // 设置压缩率
        $im->readImage($pdf);
        $result = [];
        foreach ($im as $k => $v) {
            $v->setImageFormat('jpg');
            $fileName = $path . $info . '-' . $k . '.jpg';
            if ($v->writeImage($fileName) == true) {
                $result[] = $fileName;
            }
        }
        return $result;
    }

最后,本文中一些图片因为我太懒了,就不高兴截图了,直接从网上复制了。

坑一:参考了这篇文章 https://blog.csdn.net/liangxun0712/article/details/79584016

真的写在最后了

差点忘了,之前提到过一劳永逸的方法

这里我隆重的介绍:就是使用 docker 安装环境配置。

Laradock

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 LinuxWindows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

就直接复制百度百科了,docker 我会之后憋出文章来(可能

一套完整的基于Docker的PHP开发环境。

包含了预先打包的Docker镜像,所有预先配置都是为了提供一个完美的PHP开发环境。

Laradock是在laravel社区众所周知的,因为这个项目最开始只关注在Docker上运行的laravel项目。后来,由于PHP社区的大量使用,它开始支持比如SymfonyCodeIgniterWordPressDrupal等其他的PHP项目。

具体的链接:Laradock中文文档

用这个就可以一劳永逸了,docker 真的香!!!