php实现批量导出pdf 压缩打包下载
生活随笔
收集整理的這篇文章主要介紹了
php实现批量导出pdf 压缩打包下载
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、下載 mpdf?
? ? ? ?mPDF 是一款強大的 pdf 導出插件 ,可以基本兼容 HTML標簽和CSS3樣式??
首先了解一下 mPDF版本所需環境:https://packagist.org/packages/mpdf/mpdf? ?
? ? ? ?我這里僅演示 composer 下載 mPDF?V7.1 的版本? ?(如果composer沒有 可以參考 該篇文章第一部分 :https://blog.csdn.net/weixin_38730732/article/details/80106678)
在項目的 composer.json 文件里面 添加?
然后 在該目錄下執行
composer update完成后 會在項目目錄 的vendor 下面多出一個 mpdf 的文件夾
二、PHP使用mPDF導出單個
<?phpnamespace app\helpers; use Mpdf; //引入 *重要 class Pdf{/*** 單個導出pdf* @param $url 需要抓取的鏈接地址* @param array $data 請求鏈接需要攜帶的參數*/public static function importPdf($url,array $data) {$mpdf = new Mpdf\Mpdf(["tempDir" => 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 這個函數, 下面我寫了一個類?
<?php use app\helpers\Pdf;// 引入類 class PdfController extends Controller{public function importPdfAction(){$getData = [["id" =>1],[ "id" =>2]]$html = preg_replace('# #', '%20', "http://xxxx/xxxx/index");//抓取頁面的地址Pdf::importPdf($html, $getData, $dir = time());} } <?php /*** 批量導出pdf 壓縮下載 類* Created by VeryStar.* User: Rob* Date: 2019/11/26* Time: 17:20*/ namespace app\helpers; use Mpdf;class Pdf{/*** 批量導出pdf并壓縮下載* @param $url 抓取頁面地址* @param $data 抓取頁面需要的參數* @param string $dir 壓縮目錄名(用英文或者數字)*/public static function importPdf($url,$data, $dir="") {mkdir(TEMP_PATH."/".$dir,0777,true); // TEMP_PATH 這個是我自己設置的pdf緩存目錄,可以自己設置for ($i = 0;$i<count($data);$i++) {$mpdf = new Mpdf\Mpdf(["tempDir" => 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实现批量导出pdf 压缩打包下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Wonderware INSQL his
- 下一篇: 从再生龙(clonezilla)镜像直接