PHP PDF转换为PNG图片实现方法

前言

在Web开发中,经常需要将PDF文档转换为图片格式进行预览或处理。本文介绍如何使用PHP的Imagick扩展将PDF文件转换为PNG图片。

Imagick扩展简介

Imagick是一个用于创建和修改图像的PHP扩展,它使用ImageMagick库作为底层支持。ImageMagick是一个功能强大的图像处理套件,支持超过200种图像格式,包括PDF。

安装Imagick扩展

在使用之前,需要确保PHP已安装Imagick扩展:

// 检查扩展是否加载
if (!extension_loaded('imagick')) {
    throw new Exception('Imagick扩展未安装');
}

方法一:PDF转换为多张PNG图片

将PDF的每一页转换为单独的PNG图片文件:

<?php
/**
 * 将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图片:

<?php
/**
 * 将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;
    }
}

两个方法的区别

特性pdf2pngpdf2png2
输出结果每页生成一张图片,返回数组所有页面合并为一张图片
图片处理直接输出,无额外处理去除多余空白,添加边距
适用场景需要单独处理每页需要整体预览

优化建议

以上两个方法还可以进一步优化:

  • 自定义分辨率:将分辨率作为参数传入,根据需要调整图片质量
  • 自动创建目录:当目标目录不存在时,自动创建
  • 错误处理:增加更详细的异常捕获和日志记录
  • 内存管理:处理大PDF文件时,及时释放内存
  • 水印支持:添加自定义水印功能

使用示例

// 转换为多张图片
$images = pdf2png('/www/pdf/document.pdf', '/www/pngs/');
print_r($images);

// 转换为单张图片
pdf2png2('/www/pdf/document.pdf', '/www/pngs/');

注意事项

  • 确保服务器已安装Imagick扩展和Ghostscript
  • PDF文件页数较多时,可能消耗较多内存和处理时间
  • 建议设置合理的分辨率,平衡图片质量和文件大小

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部