PHP PDF转化为图片(PNG)
在Web开发中,经常需要将PDF文件转换为图片格式进行预览展示。PHP提供了Imagick扩展来实现这个功能。下面分享两个常用的PDF转PNG方法。
方法一:将PDF转化为多张PNG图片(每页一张)
/**
* 将pdf文件转化为多张png图片
* @param string $pdf pdf所在路径 (/www/pdf/abc.pdf pdf所在的绝对路径)
* @param string $path 新生成图片所在路径 (/www/pngs/)
*
* @return array|bool
*/
function pdf2png($pdf, $path)
{
if (!extension_loaded('imagick')) {
return false;
}
if (!file_exists($pdf)) {
return false;
}
$im = new Imagick();
$im->setResolution(120, 120); //设置分辨率 值越大分辨率越高
$im->setCompressionQuality(100);
$im->readImage($pdf);
foreach ($im as $k => $v) {
$v->setImageFormat('png');
$fileName = $path . md5($k . time()) . '.png';
if ($v->writeImage($fileName) == true) {
$return[] = $fileName;
}
}
return $return;
}
方法二:将PDF转化为单一PNG图片(所有页拼接到一张图)
/**
* 将pdf转化为单一png图片
* @param string $pdf pdf所在路径 (/www/pdf/abc.pdf pdf所在的绝对路径)
* @param string $path 新生成图片所在路径 (/www/pngs/)
*
* @throws Exception
*/
function pdf2png2($pdf, $path)
{
try {
$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->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 . microtime(true) . '.png');
} catch (Exception $e) {
throw $e;
}
}
使用示例
// PDF转多张图片
$pdfFile = '/www/pdf/example.pdf';
$savePath = '/www/pngs/';
$images = pdf2png($pdfFile, $savePath);
if ($images) {
foreach ($images as $img) {
echo '生成图片: ' . $img . '
';
}
}
// PDF转单张图片
pdf2png2($pdfFile, $savePath);
echo '转换完成';
环境要求
- PHP Imagick扩展:无论是转化为多张还是单张图片,都需要安装PHP的Imagick扩展
- Ghostscript:Imagick依赖Ghostscript来处理PDF文件,需要安装并配置环境变量
常见问题及解决方案
1. 报错:Failed to read the file
检查以下几点:
- PDF文件路径是否正确,是否为绝对路径
- 文件权限是否可读
- Ghostscript是否正确安装
2. 报错:PostscriptDelegateFailed
这是Ghostscript相关的错误,解决方法:
// Windows环境下,设置Ghostscript路径
putenv('PATH=' . getenv('PATH') . ';C:\Program Files\gs\gs9.52\bin');
3. CPU占用100%的问题
如果遇到CPU占用过高,可以尝试使用Ghostscript命令行的方式:
// 使用Ghostscript命令行转换,可控制资源占用
function pdf2pngByGs($pdf, $path) {
$command = "gs -dNOPAUSE -dBATCH -sDEVICE=png16m -r120 -sOutputFile={$path}%d.png {$pdf}";
exec($command, $output, $returnCode);
return $returnCode === 0;
}
优化建议
这两个方法还可以再优化:
- 自定义设置图片的分辨率(修改setResolution参数)
- 存放图片的地址不存在时,自动创建目录
- 添加错误日志记录
- 支持更多输出格式(JPG、WebP等)
Linux环境安装Imagick和Ghostscript
# CentOS/RHEL
yum install ImageMagick ImageMagick-devel ghostscript
# Ubuntu/Debian
apt-get install imagemagick php-imagick ghostscript

发表评论 取消回复