• Linux
  • apache
  • centos
  • Git版本管理
  • Linux基本命令
  • linux配置与优化
  • Nginx
  • PHP
  • Redis
  • Supervisor
  • Swoole
  • windows
  • THINKPHP
  • 开发者手册
  • Chat GPT / Open Ai
  • 如何利用PHP将PDF转为图片以及拼接图片(附代码)

    全屏阅读
  • 基本信息
  • 作者:
  • 作者已发布:925篇文章
  • 发布时间:2023年08月30日 23:31:36
  • 所属分类:PHP+MySql, PHP原生源码
  • 阅读次数:221次阅读
  • 标签:
  • 对于如何利用PHP将PDF转为图片,其中最主要的是需要在服务器端安装ImageMagick扩展。有了ImageMagick扩展后,就可以使用下面的代码进行实现。

    * @param $pdf 待处理的PDF文件
    * @param $path 待保存的图片路径
    * @param int|待导出的页面 $page 待导出的页面 -1为全部 0为第一页 1为第二页
    * @return 保存好的图片路径和文件名 注:此处为坑 对于Imagick中的$pdf路径 和$path路径来说, php版本为5+ 可以使用相对路径。php7+版本必须使用绝对路径。所以,建议大伙使用绝对路径。
    注:此处为坑 对于Imagick中的$pdf路径 和$path路径来说, php版本为5+ 可以使用相对路径。php7+版本必须使用绝对路径。所以,建议大伙使用绝对路径。

    具体如何利用PHP将PDF转为图片请看如下具体实例代码:

    <?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date Time: 2023/08/30 23:31
     * Author: Mk
     * Email: 304276099@qq.com
     */
     
    namespace utils;
     
     
    class Handler
    {
        /**
         * PDF2PNG
         * @param $pdf  待处理的PDF文件
         * @param $path 待保存的图片路径
         * @param int|待导出的页面 $page 待导出的页面 -1为全部 0为第一页 1为第二页
         * @return 保存好的图片路径和文件名 注:此处为坑 对于Imagick中的$pdf路径 和$path路径来说,   php版本为5+ 可以使用相对路径。php7+版本必须使用绝对路径。所以,建议大伙使用绝对路径。
         * 注:此处为坑 对于Imagick中的$pdf路径 和$path路径来说,   php版本为5+ 可以使用相对路径。php7+版本必须使用绝对路径。所以,建议大伙使用绝对路径。
         */
        static function pdfToPng($pdf,$path,$page=-1)
        {
            if(!extension_loaded('imagick'))
            {
                return 1;
            }
            if(!file_exists($pdf))
            {
                return 2;
            }
            if(!is_readable($pdf))
            {
                return 3;
            }
            $im = new \Imagick();
            $im->setResolution(150,150);
            $im->setCompressionQuality(100);
            if($page==-1){
                $im->readImage($pdf);
            } else{
                $im->readImage($pdf."[".$page."]");
            }
     
            foreach ($im as $Key => $Var)
            {
                $Var->setImageFormat('png');
                $filename = $path. md5($Key.time()).'.png';
                if($Var->writeImage($filename) == true)
                {
                    $Return[] = $filename;
                }
            }
            //返回转化图片数组,由于pdf可能多页,此处返回二维数组。
            return $Return;
        }
     
     
        /**
         * spliceimg
         * @param array $imgs pdf转化png  路径
         * @param string $img_path
         * @return string 将多个图片拼接为成图的路径
         * 注:多页的pdf转化为图片后拼接方法
         * @internal param string $path 待保存的图片路径
         */
        static function spliceImg($imgs = array(),$img_path = '')
        {
     
            $width = 500; //自定义宽度
            $height = null;
            $pic_tall = 0;//获取总高度
            foreach ($imgs as $key => $value) {
                $arr = getimagesize($value);
                $height = $width/$arr[0]*$arr[1];
                $pic_tall += $height;
            }
            $pic_tall = intval($pic_tall);
            // 创建长图
            $targetImg = imagecreatetruecolor($width,$pic_tall);
            //分配一个白色底色
            $color = imagecolorAllocate($targetImg,255,255,255);
            imagefill($targetImg,0,0,$color);
     
            $tmp  = 0;
            $tmpy = 0; //图片之间的间距
            $src = null;
            $size = null;
            foreach ($imgs as $k => $v) {
                $src = Imagecreatefrompng($v);
                $size = getimagesize($v);
                //5.进行缩放
                imagecopyresampled($targetImg,$src, $tmp, $tmpy,0,0,$width,$height,$size[0],$size[1]);
                //imagecopy($targetImg, $src, $tmp, $tmpy, 0, 0, $size[0],$size[1]);
                $tmpy = $tmpy + $height;
                //释放资源内存
                imagedestroy($src);
                unlink($imgs[$k]);
            }
            $returnfile = $img_path.date('Y-m-d');
            if (!file_exists($returnfile))
            {
                if (!self::makeDir($returnfile))
                {
                    /* 创建目录失败 */
                    return false;
                }
            }
            $return_imgpath = $returnfile.'/'.md5(time().$pic_tall.'pdftopng').'.png';
            imagepng($targetImg,$return_imgpath);
            return $return_imgpath;
     
        }
     
     
        /**
         * makeDir
         * @param string $folder 生成目录地址
         * 注:生成目录方法
         * @return bool
         */
        static function makeDir($folder)
        {
            $reval = false;
            if (!file_exists($folder))
            {
                /* 如果目录不存在则尝试创建该目录 */
                @umask(0);
                /* 将目录路径拆分成数组 */
                preg_match_all('/([^\/]*)\/?/i', $folder, $atmp);
                /* 如果第一个字符为/则当作物理路径处理 */
                $base = ($atmp[0][0] == '/') ? '/' : '';
                /* 遍历包含路径信息的数组 */
                foreach ($atmp[1] AS $val)
                {
                    if ('' != $val)
                    {
                        $base .= $val;
                        if ('..' == $val || '.' == $val)
                        {
                            /* 如果目录为.或者..则直接补/继续下一个循环 */
                            $base .= '/';
                            continue;
                        }
                    }
                    else
                    {
                        continue;
                    }
                    $base .= '/';
                    if (!file_exists($base))
                    {
                        /* 尝试创建目录,如果创建失败则继续循环 */
                        if (@mkdir(rtrim($base, '/'), 0777))
                        {
                            @chmod($base, 0777);
                            $reval = true;
                        }
                    }
                }
            }
            else
            {
                /* 路径已经存在。返回该路径是不是一个目录 */
                $reval = is_dir($folder);
            }
            clearstatcache();
            return $reval;
        }
    }

    调用语句把pdf转成png,并拼接图片:把pdf转成png,并拼接图片(兼容ios预览无法显示签章问题)

    // 把pdf转成png,并拼接图片(兼容ios预览无法显示签章问题)
            $imgArr = Handler::pdfToPng($path,$_SERVER['DOCUMENT_ROOT'].'/file/');
            $img = '';
            if($imgArr&&is_array($imgArr)){
                $img = Handler::spliceImg($imgArr,$_SERVER['DOCUMENT_ROOT'].'/file/agreement/');
            }

    顶一下
    (0)
    100%
    订阅 回复
    踩一下
    (0)
    100%
    » 郑重声明:本文由mpxq168发布,所有内容仅代表个人观点。版权归恒富网mpxq168共有,欢迎转载, 但未经作者同意必须保留此段声明,并给出文章连接,否则保留追究法律责任的权利! 如果本文侵犯了您的权益,请留言。
  • 【上一篇】
  • 【下一篇】
  • 目前有 0 条留言 其中:访客:0 条, 博主:0 条

    给我留言

    您必须 [ 登录 ] 才能发表留言!