PHP实现pdf转图片

1、依赖:imagick扩展以及ghostscript

docker:
apt-get update && \
apt-get install -y --no-install-recommends libmagickwand-dev && \
pecl install imagick-3.4.3 && \
apt-get install ghostscript && \
docker-php-ext-enable imagick
php.ini添加 extension=imagick.so

centos:
yum install ImageMagick
yum install ImageMagick-devel
pecl install imagick
yum install -y ghostscript

注意:

一般网上很多都会提到imagick,但是会忽视ghostscript,其实ghostscript也是必须要的,这里被坑的不行,浪费一天时间,如果不装ghostscript会报‘failed to read the file’ ,看到这个错误一般会想到权限、路径什么的,其实都不是,所以很难排查;

这个不能直接处理远程的pdf文件,需要处理的话需要先下载到本地

实现简单代码:

/**
 * 将pdf转化为单一png图片
 *
 * @param string $pdf  pdf所在路径 (/www/pdf/abc.pdf pdf所在的绝对路径)
 * @param string $path 新生成图片所在路径 (/www/pngs/)
 *
 * @param string $picExtension
 *
 * @return string
 * @throws \ImagickException
 */
function pdf2Png($pdf, $path, $picExtension = '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();
    $picPath = sprintf('%s%s.%s', $path, self::getRandStr(), $picExtension);
    $canvas->appendImages(true)->writeImage($picPath);

    return $picPath;
}

public static function getRandStr()
{
    $str     = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890';
    $randStr = str_shuffle($str);//打乱字符串
    $rands   = substr($randStr, 0, 6);

    return $rands;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值