关于使用php的mpdf插件遇到的一些问题

一.插件版本

"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:/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='c:/pdf/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');

六.生成pdf慢就是图片影响,其他基本上不影响,如果没有图片基本上几秒搞定

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值