一.插件版本
"mpdf/mpdf": "^8.0",
二.报错:Undefined index: list_style_type
这个是插件无法识别 li 标签导致,生成pdf是加入下面代码
<style> li { list-style-type: none; list-style-image: none; list-style-position: unset; } </style>
三.图片请求一直没有响应,导致卡死,生成不了pdf
一般是图片地址本身就连接不了,或者图片重定向或者404都有可能有问题
1.问题代码(插件里面fopen和file_get_contents方法没有加超时时间):
插件代码路径:vendor\mpdf\mpdf\src\Image\ImageProcessor.php
前面获取不到文件信息,后面就用curl请求
2.加入超时时间代码
//对fopen和file_get_contents方法游戏,单位:秒
ini_set('default_socket_timeout', 5);
// 对后面的curl请求有效
$mpdf->curlTimeout = 5;
$mpdf->curlExecutionTimeout = 7;
四.插件识别不了svg,如果html有svg可以转成png,然后替换dom(可以用jquery的方法replaceWith替换dom)
前端js svg转png方法
https://blog.csdn.net/qq_39634880/article/details/140546066?spm=1001.2014.3001.5501
五.样式上,插件识别不了display:flex样式和iconfont之类
iconfont如果不多可以转成图片
六.完整代码
$html = '<div>测试</div>';
/*
* 关于设置的default_socket_timeout,curlExecutionTimeout,curlTimeout请求超时时间
* 本地测试了一下,如果文档中存在相同的图片链接,如果第一次都超时了,第二次不会再请求了,默认是失败
*
* 例如:
* <img src='127.0.0.1:8080/test.png'/> 这个第一次请求超时,会真正的去请求
* <img src='127.0.0.1:8080/test.png'/> 这个默认是失败了
*
* 定义输出流超时时间 - 主要针对插件里面的fopen和file_get_contents方法,这两个方法访问图片url地址,如果地址一直没有响应(图片url重定向也有可能导致一直获取不到图片,导致卡死,比如http重定向到https),这个两个方法就一直卡着
* 图片获取文件路径 :vendor\mpdf\mpdf\src\Image\ImageProcessor.php
* 不过获取不到最后会用curl_setopt去请求的,curlTimeout,curlExecutionTimeout这个两个参数是对应超时时间
* 这边设置超时时间,避免一直卡着,导致生成pdf失败
*
* 单位:秒
*/
ini_set('default_socket_timeout', 5);
$mpdf = new Mpdf([
'mode' => 'utf-8',
'tempDir' => 'c:/GCloud_Document/pdf/',
'useSubstitutions' => true,
'backupSubsFont' => ['dejavusanscondensed', 'arialunicodems', 'sun-exta'],
]);
$mpdf->SetFooter('{PAGENO} / {nbpg}');
// pdf里面的title名称
$mpdf->SetTitle('测试');
$mpdf->allow_charset_conversion = true;
$mpdf->useAdobeCJK = true;
$mpdf->autoLangToFont = true;
$mpdf->autoScriptToLang = true;
//存在一张图片加载不了就接口报错,这边注释掉
// $mpdf->showImageErrors = true;
/*
* curlTimeout是设置连接对方主机时的最长等待时间
* curlExecutionTimeout整个cURL函数执行过程的最长等待时间
* 设置这两个主要是请求图片相关,有些图片访问不了,不设置,就一直卡着
* 这边试了下,最终以curlExecutionTimeout这个时间
*
* 单位:秒
*/
$mpdf->curlTimeout = 5;
$mpdf->curlExecutionTimeout = 7;
$mpdf->biDirectional = true;
//样式,自己写个路径
$header = "<link href='./pdf.css' rel='stylesheet'>";
/*
* vendor//mpdf//mpdf//src//Tag//BlockTag.php 900行报错:Undefined index: list_style_type
* 加以下样式就不报错,虽然不报错了,但是样式上不好看
*/
$header.='<style> li { list-style-type: none; list-style-image: none; list-style-position: unset; } </style>';
$mpdf->WriteHTML($header);
$html = "<div>{$html}</div>";
$mpdf->Bookmark('测试', 0);
try {
$mpdf->WriteHTML($html);
} catch (\Exception $ex) {
var_dump('生成pdf失败:');
var_dump($ex->getMessage());
return;
}
//D是下载
$mpdf->Output('test.pdf', 'D');