1. 宝塔面板安装php imagemagick 这个插件 看好对应版本

  2. 目录结构如图
    未命名图片.png

  3. 出现问题
    Fatal error: Uncaught exception 'ImagickException' with message 'FailedToExecuteCommand `'gs' -sstdout=%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT

  4. 安装 ghostscript

    wget https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs9561/ghostscript-9.56.1.tar.gz
    tar -zxvf ghostscript-9.56.1.tar.gz -C /usr/local/
    cd /usr/local/ghostscript-9.56.1
    ./configure
    make
    make install
  5. 方法一:编辑 index.php

     function pdf2png($pdf,$path,$page=-1)
    {  
       if(!extension_loaded('imagick'))
       {  
           return false;  
       }  
       if(!file_exists($pdf))
       {  
           return false;  
       }  
       $im = new Imagick();  
       $im->setResolution(120,120);  
       $im->setCompressionQuality(100);
       if($page==-1){   
          $im->readImage($pdf);
    } else{
          $im->readImage($pdf."[".$page."]");
    }
       foreach ($im as $Key => $Var)
       {  
           $Var->setImageFormat('png');  
           $filename = $path."/". ++$i.'.png';
           if($Var->writeImage($filename) == true)
           {  
               $Return[] = $filename;  
           }  
       }  
       return $Return;  
    }  
    $fileName="./pdf/secret.pdf";
    $fileDir = substr($fileName, 0,-4);
    if(!is_dir($fileDir)){
    mkdir($fileDir);
    }
    print_r(pdf2png($fileName,$fileDir));

    输入网址 www.XXX.com/pdf2image/index.php 则会生成文件名字对应的图片目录

  6. 方法二:编辑index.php

    function numeroPaginasPdf($archivoPDF)  //查询pdf文件的总页数
    {
        $pdfname = $archivoPDF;
            $pdftext = file_get_contents($pdfname);
            $num = preg_match_all("/\/Page\W/", $pdftext, $dummy);
            return $num;
     
    }
    function shell2img($file,$path,$page){
    $cmd = 'gs -dQUIET -dBATCH -dNOPAUSE -sDEVICE=jpeg -r150 -dFirstPage=1 -dLastPage='.$page.' -sOutputFile='.$path.'/%d.jpg '.$file;
    echo $cmd;
    shell_exec($cmd);
    }
    $fileName="./pdf/thinkphp.pdf";
    $pdfpath = dirname(__FILE__)."/".$fileName;
    $dirpath = dirname(__FILE__)."/". substr($fileName, 0,-4);
    if(!is_dir(substr($fileName, 0,-4))){
    mkdir(substr($fileName, 0,-4));
    }
    $pageCount = numeroPaginasPdf($fileName);
    shell2img($pdfpath,$dirpath,$pageCount);

    未命名图片.png

  7. 总结 这两种方法是有区别的

    第一种方法相对比较安全一些,但是慢,有多慢呢?会死的那种;

    第二种方法由于使用到了函数 shell_exec 安全方面会需要注意一些,因为这个函数通常属于被禁用的函数,是否转换完成没有反馈

    第二种方法直接使用的是shell脚本来操作的所以相对于第一种方法快很多。

    安全和速度需要权衡一下