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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部