[PHP] 将pdf转为图片--使用Imagick扩展

1,009 阅读3分钟

网上搜索的安装方法会报如下错误

PHP Warning: PHP Startup: Unable to load dynamic library 'php_imagick.dll' (tried: D:\phpstudy_pro\Extensions\php\php7.0.9nts\ext\php_imagick.dll (找不到指定的模块。), D:\phpstudy_pro\Extensions\php\php7.0.9nts\ext\php_php_imagick.dll.dll (找不到指定的模块。)) in Unknown on line 0 参考了PHP7.0版本报错PHP7.4版本报错这两篇文章后总结出如何在PHP7.0版本安装imagick扩展的步骤,7.1、7.2、7.3、7.4版本的安装留待以后测试。 测试完成,此流程亦适用于7.1--7.4。

需要下载的文件

  • ImageMagick
  • imagick
  • Ghostscript

前期准备

打印phpinfo(),查看自己的php版本信息,如下图红框部分

QQ截图20220210144340.png

我的php版本是7.0、64位、NTS、VC14、Thread Safety是disabled,这些信息下面下载文件会用到

1.下载并配置ImageMagick

下载地址:windows.php.net/downloads/p…

我的版本是VC14、64位,所以下载的是 ImageMagick-6.9.3-7-vc14-x64.zip

QQ截图20220210145718.png

将下载后的文件解压缩,把bin目录下的文件复制到在C盘中新建文件夹ImageMagick-6.9.3-7-vc14-x64中

QQ截图20220210151341.png

新建环境变量:C:\ImageMagick-6.9.3-7-vc14-x64

QQ截图20220210151610.png

新建系统变量:MAGICK_HOME,其值为:C:\ImageMagick-6.9.3-7-vc14-x64

QQ截图20220210151719.png

2.下载并配置imagick

PHP 7.4、8.0、8.1版本

PHP 7.1、7.2、7.3、7.4版本

PHP 5.5、5.6、7.0、7.1版本

我的版本是PHP7.0、64位、NTS、Thread Safety是disabled故下载 7.0 Non Thread Safe (NTS) x64

QQ截图20220210153143.png

将下载后的文件解压缩,把php_imagick.dll文件复制到php根目录的ext目录里,我使用的是phpstudy,复制的路径如图

QQ截图20220210153805.png

然后在php根目录下的php.ini文件中添加extension = php_imagick.dll

至此Imagick扩展安装完成,重启电脑后可在phpinfo()中看到

QQ截图20220210154217.png

3.下载并配置Ghostscript

下面贴出64位版本的下载地址,32位请自行去github下载:github.com/ArtifexSoft…

gs918w64.exe

gs919w64.exe

gs920w64.exe

gs921w64.exe

gs922w64.exe

gs923w64.exe

gs924w64.exe

gs925w64.exe

gs926aw64.exe

gs927w64.exe

gs950w64.exe

gs951w64.exe

gs952w64.exe

gs9530w64.exe

gs9531w64.exe

gs9532w64.exe

gs9533w64.exe

gs9540w64.exe

gs9550w64.exe

运行下载后的文件会自动安装,安装完毕后将bin的目录添加到环境变量中

QQ截图20220211155641.png

至此所有准备工作已完成。

3.php代码

    public function pdfToimg($pdf, $path)
    {
        //路径格式如下
        //$pdf = 'D:\phpstudy_pro\WWW\www.nilin.ceshi.com\test11.pdf';
        //$path = 'D:\phpstudy_pro\WWW\www.nilin.ceshi.com\assss2.png';
        $im = new Imagick();
        $im->setCompressionQuality(100);
        $im->setResolution(120, 120);//设置分辨率 值越大分辨率越高

        $im->readImage($pdf);

        $canvas = new Imagick();
        $imgNum = $im->getNumberImages();
        foreach ($im as $k => $sub) {
            $sub->setImageFormat('png');
            $sub->setResolution(120, 120);
            $sub->stripImage();
            $sub->trimImage(0);
            $width  = $sub->getImageWidth() + 10;
            $height = $sub->getImageHeight() + 10;
            if ($k + 1 == $imgNum) {
                $height += 10;
            } //最后添加10的height
            $canvas->newImage($width, $height, new ImagickPixel('white'));
            $canvas->compositeImage($sub, Imagick::COMPOSITE_DEFAULT, 5, 5);
        }

        $canvas->resetIterator();
        $canvas->appendImages(true)->writeImage($path);

        return "转换成功";
    }

4.总结

  • 在运行代码后报错 500 Internal Server Error,经排查问题是出在 $im->readImage($pdf); 处。百度后找到解决办法是更换gs版本,于是便从gs918开始一个个尝试。
  • 尝试过所有gs版本后还是未能解决问题,又找到了一个办法是在bin的同级目录下复制并粘贴gswin64.exe/gswin64c.exe,改名为gs.exe。尝试后还是未能解决问题。

QQ截图20220211162020.png

  • 最后受到启发是不是程序没加载imagick或者是$pdf的路径不对,于是有如下调试
    if (!extension_loaded('imagick'))
    {
        die('Imagick is not installed'); 
    }else{
        echo 'Imagick installed<hr>';
    } 

    $pdf = "D:\phpstudy_pro\WWW\www.nilin.ceshi.com\test11.pdf"; 
    if(file_exists($pdf)){ 
        echo "$pdf exists.<br>"; 
    } 
    else{ 
        die("$pdf doesnt exist."); 
    }

结果输出

QQ截图20220211162819.png

  • 问题出在pdf地址不对,可是这个目录下的pdf文件确实存在。最终我想出是不是 $pdf = "D:\phpstudy_pro\WWW\www.nilin.ceshi.com\test11.pdf";""的缘故。于是尝试将其改为''后问题意外的解决了。但是不理解的地方一是我尝试过将$pdf文件路径使用单引号,$path使用双引号的时候也能成功运行。二是将png转为jpg,路径也均是用""$pdf = "D:\phpstudy_pro\WWW\www.nilin.ceshi.com\aaaa.png";$path = "D:\phpstudy_pro\WWW\www.nilin.ceshi.com\bbbb.jpg";也能成功运行。 为什么pdf文件路径使用双引号就不行了呢? 原因出在:双引号下的\t会被转义,如下图红框部分,所以实际的路径变成了D:\phpstudy_pro\WWW\www.nilin.ceshi.com est11.pdf,导致readImage($pdf)读取的是无效路径。

    QQ截图20220211170858.png

  • 建议小伙伴们遇到类似问题后把以上途径都尝试一下,毕竟我这只是其中的一种情况。不一定适用于所有人。

  • php版本升级到7.2.9时,按照上文流程配置后仍报错PHP Warning: PHP Startup: Unable to load dynamic library 'php_imagick.dll' (tried: D:\phpstudy_pro\Extensions\php\php7.2.9nts\ext\php_imagick.dll (找不到指定的模块。), D:\phpstudy_pro\Extensions\php\php7.2.9nts\ext\php_php_imagick.dll.dll (找不到指定的模块。)) in Unknown on line 0。排查后发现是丢失了VCOMP140.dll文件,下载安装Visual C++ Redistributable for Visual Studio 2015后解决问题。至此测试了php 7.1、7.3、7.4版本下均正常运行。