如题,博主今天遇到个业务问题,需要对用户上传的PDF文件转png操作,其实就是个首页预览功能,不细说了。

首先,作为一个懒人,遇到新的问题我首先想的是这个坑我还是不亲自去踩了,机制的google了一发,发现很多人写的教程,大喜。前人艰难填坑后人一路坦途,但是理想和现实总是有差距的,各个博主众说纷纭,还有好几年前的过期博文,按他们铺的路走差点没把自己埋坑里。不得已又自己来踩坑了,我尽量把我的过程写的详细,为后人提供参考,但是我懒,233333,你们懂得。

对于什么是Imagick大家可能比较陌生,但是ImageMagick大家说不定还是有点了解的,imagick其实就是ImageMagick的php扩展,有非官方说法:Imagick的新能比GD要优越不少,博主比较懒,就没去具体测试了,有兴趣的同学可以自己研究一下。

相关地址集合:

php官方文档: http://php.net/manual/en/book.imagick.php

ghostscript官网: https://www.ghostscript.com

ImageMagick官方下载地址:https://sourceforge.net/projects/imagemagick/files/

imagick函数中文解释:http://www.jb51.net/article/60161.htm

前提:你会编译安装php,服务器安装了c++、gcc-c++等基本库

1 安装ImageMagick

博主通过不为人知的“肮脏”手段拿到了下载地址,直接在服务器上下载了源码包:

下载地址: https://netix.dl.sourceforge.net/project/imagemagick/im7-src/ImageMagick-7.0.7-25.tar.gz

下载命令:

wget https://netix.dl.sourceforge.net/project/imagemagick/im7-src/ImageMagick-7.0.7-25.tar.gz

运行截图如下,我先进入了/home/app目录下,所以文件也下载在这里

下载完成后使用下面的命令解压:

tar -zxvf ImageMagick-7.0.7-25.tar.gz

解压完毕后进入该文件夹:

执行命令(默认参数,没有更改)

./configure

执行完了后如下图所示,默认安装路径在/usr/local下

执行命令,编译并安装ImageMagick,需要一段时间,不如先来一局农药压压惊。或者你可以另开一个terminal连接服务器开始安装别的东西。

make && make install

完成之后进入安装文件夹,查看ImageMagick是否工作

cd /usr/local/bin/

./convert -version

结果如下:

2 安装PHP扩展Imagick.so

很遗憾,这不是php官方的标准包,所以没有继承在php源码包里面,我在ext/文件夹下没有找到,不过官方文档给出了下载页面地址:

http://pecl.php.net/package/imagick/download

然而机智的我又直接把扩展包的下载地址贴上来了,方便服务器下载:http://pecl.php.net/get/imagick-3.4.3.tgz

我很懒,命令行在图里,同学自己看了==

解压后进入该目录,执行phpize,我希望你能找到你的phpize在哪,如果你是编译安装的话,如果没有软链到/usr/bin/目录下,你可以使用绝对路径调用phpize。使用下面命令行配置扩展安装,指定--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

这些路径很重要,有时候自己清楚点比较好

安装完了后我们要修改php的配置文件,添加上imagick.so,重启php-fpm

修改配置文件,记得保存

kill php-fpm主进程 并 重启,这里各个人方法不同,我按我的演示一下:

重启完了看看自己的phpinfo吧,已经有了

这个时候我们试试pdf转png

以失败告终,控制台的测试都失败了别说用php的系统调用了,一样gg,大部分国内博客的教程基本到此为止,然后就开始贴代码了,我特么就想喷一句,代码格式都乱七八糟的,到底是你写的还是copy的?关键时候还是overstack靠谱。看上面截图提示的错误信息:

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.

convert: no images defined `%d.png' @ error/convert.c/ConvertImageCommand/3275.

带有gs 开头的命令行执行失败,gs其实就是下面要说的ghostscript

3 安装GhostScript

官方地址:https://www.ghostscript.com/

使用教程:https://www.ghostscript.com/doc/9.22/Use.htm

官方安装教程: https://www.ghostscript.com/doc/9.22/Install.htm

下载地址: https://www.ghostscript.com/download/gsdnld.html

博主比较懒,不想编译安装了,直接下载了编译后的可执行程序,能有就行,23333

我选的是这个,看起来是免费的屌丝版,能用就行,233333

这个下载地址被重定向了好多次,没法直接给你们贴上,不过我传到了我的七牛云上,地址给大家共享下:

https://file.mumov.com/ghostscript-9.22-linux-x86_64.tgz

下载到服务器,解压,进入文件夹:

完了之后记得给gs的可执行文件copy一份到/usr/bin目录下,这样就可以全局执行了

命令行在图里,懒,不写了

到这里基本上就完成了所有模块的安装,试试pdf转png行不行

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

4 PHP代码实现pdf转图片

我懒,原谅我直接贴代码了

class ImageMagick{

    private $handler;
    public function __construct()
    {
        $this->handler = new \Imagick();
    }

    /**将pdf转为png图片列表
     * @param $pdf_path string pdf文件的绝对路径
     * @param $out_path string 生成图片存放位置的绝对路径
     * @param int $from int  从第几页开始转
     * @param int $to int 截止于第几页
     * @return array
     * @throws SystemInnerException
     */
    public function convertPdf2Images($pdf_path,$out_path,$from=1,$to=1)
    {
        $this->handler->setResolution(120,120);
        $this->handler->setCompressionQuality(50);
        $this->handler->readImage($pdf_path);
        $pages = count($this->handler);
        if($pages == 0)
            throw new SystemInnerException('empty pdf file!');
        $index = 1;

        $data = [];
        foreach ($this->handler as $k=>$v)
        {
            if($index == $from)
            {
                if($from<=$to) {

                    $v->setImageFormat('jpg');
                    $tmp_name = str_random('16') . '.jpg';
                    if ($v->writeImage($out_path.$tmp_name) == true)
                        $data[] = $tmp_name;
                    $index++;
                    $from++;
                }else
                    break;
            }else
                $index++;
        }

        return $data;
    }
}

好了,到这里结束了,博主自认为写的比其他的可能要清除那么一丢丢,如果有疑问,欢迎留言喷我,23333

(详细)CentOS 7+环境下PHP使用Imagick+ghostscript将PDF文件转为图片相关推荐

  1. CentOS 7+环境下PHP使用Imagick+ghostscript将PDF文件转为图片

    原文详细地址:https://blog.csdn.net/liangxun0712/article/details/79584016 php官方文档: http://php.net/manual/en ...

  2. hp ux安装mysql5.1.56_详细讲解Linux环境下MySQL5.1安装步骤

    1.下载MySQL免安装版/二进制版软件(不用编译) 文件格式:MYSQL-VERSION-OS.tar.gz 2.创建MySQL组,建立MySQL用户并加入到mysql组中 (不同版本的Unix中, ...

  3. Centos 7 环境下将修改后的MAC地址永久保存

    Centos 7 环境下将修改后的MAC地址永久保存的正确的步骤如下: #ifconfig eth0 down #vim /etc/sysconfig/network-scripts/ifcfg-et ...

  4. centos docker环境下如何清理磁盘空间

    Docker 容器磁盘占用100%(/data/docker/overlay2空间占用显示) overlay 40G 40G 0G 100% /var/lib/docker/overlay2/{id} ...

  5. CentOS 8环境下GitBlit安装部署

    目录: 一.安装jdk 二.GlitBli搭建 三.Git搭建 阅读本文前建议先阅读另一篇关于Windows环境下的GitBlit部署,之后在Linux上会熟练很多哦(⊙o⊙).传送门:Windows ...

  6. LINUX环境下资源下载中文目录及中文文件名称问题

    为什么80%的码农都做不了架构师?>>>    http://www.yeeach.com/2009/04/09/linux%E7%8E%AF%E5%A2%83%E4%B8%8B%E ...

  7. Windows环境下如何方便快捷的执行jar文件

    Windows环境下如何方便快捷的执行jar文件 1 介绍 后缀文件为.jar的文件是java的打包文件,通常包含的是一个完整的java应用程序.在Windows环境下面获取的软件如果是jar文件,最 ...

  8. 在Virtualbox环境下win10与虚拟机通过FileZilla传输文件(FTP传输)

    在Virtualbox环境下win10与虚拟机通过FileZilla传输文件(FTP传输) 使用FileZilla传输文件(FTP传输)好处 什么是FTP传输 需要的环境以及软件等 使用FileZil ...

  9. Java8环境下使用restTemplate单/多线程下载大文件和小文件

    Java8环境下使用restTemplate单/多线程下载大文件和小文件 0. 准备工作 1. 简单的下载文件 2. 单线程大文件下载 3. 多线程下载 0. 准备工作 下面使用的restTempla ...

最新文章

  1. 第一个PhoneGap程序以及错误解决
  2. tenantid拦截php,实现领域驱动设计。为什么在所有版本库查询中都包含TenantId?...
  3. shell脚本分析mysql慢查询日志(slow log)
  4. JDK源码解析 —— IO流中的包装类使用到了装饰者模式
  5. 使用FileSystemWatcher监视指定目录
  6. 【概率论与数理统计】如何理解自由度n?
  7. Gamebryo实例学习之二BackgroundLoad
  8. keras优化算法_自然场景文本识别(OCR),keras-yolo3-densenet-ocr
  9. Java文件下载/下载文件的案例
  10. laravel 检测sql_在Laravel PHP应用程序中轻松进行面部检测
  11. 基于JAVA+SpringMVC+Mybatis+MYSQL的图书馆预约占座管理系统
  12. Asp.net 邮件传输
  13. 计算机配色与人工配色原则,计算机配色的理论与实践研究
  14. fly.js 的二次封装
  15. 弧形银幕电影的成像原理
  16. html页面整体缩小,浏览器缩放原理以及窗口、html页面大小
  17. 关于oracle中ora-00600的报错
  18. 【大数据处理】广州餐饮店铺爬虫并可视化,上传至hdfs
  19. 杰克 - 鬼马海盗主角加勒比海盗系列的
  20. 21世纪的中国人能否看懂这个大清帝国时代的法国人(2)

热门文章

  1. 小黄车凉了?1分钟带你解锁共享经济的3种新玩法
  2. delphi bpl插件系统开发
  3. Centos下关于ssh、scp与rsync设置与应用
  4. hdu6097—Mindis(计算几何)
  5. SCU - 4437 Carries
  6. java工程积累——项目管理:破窗理论
  7. 初学Java(一)Java介绍
  8. Scikit-Learn&More,用于机器学习的综合数据集生成
  9. Python 3.x--tkinter(二): 抽象画?!
  10. 如何判断生成的交易策略(EA)是好是坏?