php实现批量导出pdf 压缩打包下载

一、下载 mpdf 

       mPDF 是一款强大的 pdf 导出插件 ,可以基本兼容 HTML标签和CSS3样式  

首先了解一下 mPDF版本所需环境:https://packagist.org/packages/mpdf/mpdf   

php实现批量导出pdf 压缩打包下载_第1张图片

       我这里仅演示 composer 下载 mPDF V7.1 的版本   (如果composer没有 可以参考 该篇文章第一部分 :https://blog.csdn.net/weixin_38730732/article/details/80106678)

在项目的 composer.json 文件里面 添加 

php实现批量导出pdf 压缩打包下载_第2张图片

然后 在该目录下执行

composer update

完成后 会在项目目录 的vendor 下面多出一个 mpdf 的文件夹

二、PHP使用mPDF导出单个

 TEMP_PATH]);//设置缓存目录,可以自己自定义设置
        $mpdf->autoScriptToLang = true;//支持中文设置
        $mpdf->autoLangToFont = true;//支持中文设置
        $mpdf->useAdobeCJK = true;
        $html = self::curlData($url, $data); // 我这里写一个抓取页面的方法
        $mpdf->WriteHTML($html);
        $mpdf->Output('学生图谱.pdf', 'D');//D表示浏览器直接下载   $mpdf->Output('文件名','D');
//      $mpdf->Output(); 表示直接输出
//      $mpdf->Output(TEMP_PATH."/".time() . '.pdf',"F");// F表示储存在服务器文件下
       
    }

    /**
     * 远程抓取html
     * @param $url
     * @param $data
     * @param string $method
     * @param string $type
     * @return bool|string
     */
    public static function curlData($url, $data, $method = 'GET', $type = 'json') {
        //初始化
        $ch = curl_init();
        $headers = [
            'form-data' => ['Content-Type: multipart/form-data'],
            'json' => ['Content-Type: application/json'],
        ];
        if ($method == 'GET') {
            if ($data) {
                $querystring = http_build_query($data);
                $url = $url . '?' . $querystring;
            }
        }
        // 请求头,可以传数组
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers[$type]);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);         // 执行后不直接打印出来
        if ($method == 'POST') {
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');     // 请求方式
            curl_setopt($ch, CURLOPT_POST, true);               // post提交
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);              // post的变量
        }
        if ($method == 'PUT') {
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
        if ($method == 'DELETE') {
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 不从证书中检查SSL加密算法是否存在
        $output = curl_exec($ch); //执行并获取HTML文档内容
        curl_close($ch); //释放curl句柄
        return $output;
    }
}

三、php批量导出pdf 压缩包下载

这里的压缩用的是php的 ZipArchive 这个函数, 下面我写了一个类 

1
            ],
            [    
                "id" =>2
            ]
        ]
        $html = preg_replace('# #', '%20', "http://xxxx/xxxx/index");//抓取页面的地址
        Pdf::importPdf($html, $getData, $dir = time());
    }
}
 TEMP_PATH]); 
            $mpdf->autoScriptToLang = true;//支持中文设置
            $mpdf->autoLangToFont = true;//支持中文设置
            $mpdf->useAdobeCJK = true;
            $html = self::curlData($url, $data[$i]);
            $mpdf->WriteHTML($html);
            $mpdf->Output(TEMP_PATH."/".$dir."/".$data[$i]['stuNo'] . '.pdf',"F"); //命名用英文或数字,中文会出错, F表示转了pdf后先存入服务器的 TEMP_PATH."/".$dir 这个文件夹下面 并命名,全部转换好pdf后 我们对这个文件夹进行压缩下载
        }
        //todo 多文件压缩下载
        $zipName = TEMP_PATH."/".$dir.".zip";
        // 如果压缩文件不存在,就创建压缩文件
        if (!is_file($zipName)) {
            $fp = fopen($zipName, 'w');
            fclose($fp);
        }
        $zip = new \ZipArchive();
        // OVERWRITE选项表示每次压缩时都覆盖原有内容,但是如果没有那个压缩文件的话就会报错,所以事先要创建好压缩文件
        // 也可以使用CREATE选项,此选项表示每次压缩时都是追加,不是覆盖,如果事先压缩文件不存在会自动创建
        if ($zip->open($zipName, \ZipArchive::OVERWRITE) === true) {
            $current = $dir; // 你要压缩的文件的主目录
            $path = TEMP_PATH . "/" .$dir;
            self::addFileToZip($path, $current, $zip);
            $zip->close();
            self::deldir(TEMP_PATH."/".$dir."/");//删除文件
            rmdir(TEMP_PATH."/".$dir);//删除空文件夹
            self::downloadFile($zipName,"tupu.zip");
            unlink($zipName);//完成所有操作 删除压缩包
        } else {
            exit('下载失败!');
        }

    }

    /**
     * 文件压缩
     * @param $path
     * @param $current
     * @param $zip
     *
     * create by fyh 20191202
     */
    public static function addFileToZip($path, $current, $zip) {
        // 打开文件夹资源
        $handler = opendir($path);
        // 循环读取文件夹内容
        while (($filename = readdir($handler)) !== false) {
            // 过滤掉Linux系统下的.和..文件夹
            if ($filename != '.' && $filename != '..') {
                // 文件指针当前位置指向的如果是文件夹,就递归压缩
                if (is_dir($path . '/' . $filename)) {
                    self::addFileToZip($path . '/' . $filename, $filename, $zip);
                } else {
                    // 为了在压缩文件的同时也将文件夹压缩,可以设置第二个参数为文件夹/文件的形式,文件夹不存在自动创建压缩文件夹
                    $zip->addFile($path . '/' . $filename, $current . '/' . $filename);
                }
            }
        }
        @closedir($handler);
    }

    /**
     * 删除文件夹下所有文件
     * @param $path
     *
     * create by fyh 20191202
     */
    public static function deldir($path) {
        //如果是目录则继续
        if (is_dir($path)) {
            //扫描一个文件夹内的所有文件夹和文件并返回数组
            $p = scandir($path);
            foreach ($p as $val) {
                //排除目录中的.和..
                if ($val != "." && $val != "..") {
                    //如果是目录则递归子目录,继续操作
                    if (is_dir($path . $val)) {
                        //子目录中操作删除文件夹和文件
                        self::deldir($path . $val . '/');
                        //目录清空后删除空文件夹
                        @rmdir($path . $val . '/');
                    } else {
                        //如果是文件直接删除
                        unlink($path . $val);
                    }
                }
            }
        }
    }

    /**
     * 下载压缩包
     * @param $filePath
     * @param $showName
     * @return bool
     *
     * create by fyh 20191202
     */
    public static function downloadFile($filePath, $showName) {
        if (is_file($filePath)) {
            //打开文件
            $file = fopen($filePath, "r");
            //返回的文件类型
            Header("Content-type: application/octet-stream");
            //按照字节大小返回
            Header("Accept-Ranges: bytes");
            //返回文件的大小
            Header("Accept-Length: " . filesize($filePath));
            //这里设置客户端的弹出对话框显示的文件名
            Header("Content-Disposition: attachment; filename=" . $showName);
            //一次性将数据传输给客户端
            //echo fread($file, filesize($filePath));
            //一次只传输1024个字节的数据给客户端
            //向客户端回送数据
            $buffer = 1024;//
            //判断文件是否读完
            while (!feof($file)) {
                //将文件读入内存
                $file_data = fread($file, $buffer);
                //每次向客户端回送1024个字节的数据
                echo $file_data;
                ob_flush();//将本来存在输出缓存中的内容取出来,设置为等待输出状态
                flush();//输出缓冲区给客户端
            }
            return true;
        } else {
            return false;
        }
    }

    /**
     * 远程抓取html
     * @param $url
     * @param $data
     * @param string $method
     * @param string $type
     * @return bool|string
     *
     * create by fyh 20191129
     */
    public static function curlData($url, $data, $method = 'GET', $type = 'json') {
        //初始化
        $ch = curl_init();
        $headers = [
            'form-data' => ['Content-Type: multipart/form-data'],
            'json' => ['Content-Type: application/json'],
        ];
        if ($method == 'GET') {
            if ($data) {
                $querystring = http_build_query($data);
                $url = $url . '?' . $querystring;
            }
        }
        // 请求头,可以传数组
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers[$type]);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);         // 执行后不直接打印出来
        if ($method == 'POST') {
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');     // 请求方式
            curl_setopt($ch, CURLOPT_POST, true);               // post提交
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);              // post的变量
        }
        if ($method == 'PUT') {
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
        if ($method == 'DELETE') {
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 不从证书中检查SSL加密算法是否存在
        $output = curl_exec($ch); //执行并获取HTML文档内容
        curl_close($ch); //释放curl句柄
        return $output;
    }
}

如有问题 ,可以留言

你可能感兴趣的:(PHP导入导出,php导出pdf,mPDF,批量导出pdf,php压缩下载,导出pdf)