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 的文件夹
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的 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;
}
}
如有问题 ,可以留言