网上搜索的安装方法会报如下错误
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版本信息,如下图红框部分
我的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
将下载后的文件解压缩,把bin目录下的文件复制到在C盘中新建文件夹ImageMagick-6.9.3-7-vc14-x64中
新建环境变量:C:\ImageMagick-6.9.3-7-vc14-x64
新建系统变量:MAGICK_HOME,其值为:C:\ImageMagick-6.9.3-7-vc14-x64
2.下载并配置imagick
我的版本是PHP7.0、64位、NTS、Thread Safety是disabled故下载 7.0 Non Thread Safe (NTS) x64
将下载后的文件解压缩,把php_imagick.dll文件复制到php根目录的ext目录里,我使用的是phpstudy,复制的路径如图
然后在php根目录下的php.ini文件中添加extension = php_imagick.dll
至此Imagick扩展安装完成,重启电脑后可在phpinfo()中看到
3.下载并配置Ghostscript
下面贴出64位版本的下载地址,32位请自行去github下载:github.com/ArtifexSoft…
运行下载后的文件会自动安装,安装完毕后将bin的目录添加到环境变量中
至此所有准备工作已完成。
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。尝试后还是未能解决问题。
- 最后受到启发是不是程序没加载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.");
}
结果输出
-
问题出在pdf地址不对,可是这个目录下的pdf文件确实存在。最终我想出是不是
$pdf = "D:\phpstudy_pro\WWW\www.nilin.ceshi.com\test11.pdf";中""的缘故。于是尝试将其改为''后问题意外的解决了。但是不理解的地方一是我尝试过将原因出在:双引号下的\t会被转义,如下图红框部分,所以实际的路径变成了$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文件路径使用双引号就不行了呢?D:\phpstudy_pro\WWW\www.nilin.ceshi.com est11.pdf,导致readImage($pdf)读取的是无效路径。 -
建议小伙伴们遇到类似问题后把以上途径都尝试一下,毕竟我这只是其中的一种情况。不一定适用于所有人。
-
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版本下均正常运行。