Laravel 8+DomPDF 2.2生成PDF时Base64图片无法显示问题排查
在Laravel 8中使用DomPDF 2.2生成PDF时Base64图片无法显示的问题
我正在尝试使用DomPDF 2.2在Laravel 8中生成PDF,但Base64格式的图片无法被识别;不过直接返回HTML时图片可以正常显示。
HTML中的图片标签写法:
<img style="padding: 0px; margin: 0px;" width="100%" src="data:image/png;base64, ' . $base64 . '" />
生成PDF的代码:
$pdf = app('dompdf.wrapper'); $context = stream_context_create([ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, ], ]); $pdf->getDomPDF()->setHttpContext($context); $pdf->getDomPDF()->set_option("isPhpEnabled", true); $pdf->getDomPDF()->set_option("isHtml5ParserEnabled", true); $pdf->getDomPDF()->set_option("isRemoteEnabled", true); $pdf->getDomPDF()->set_option("isFontSubsettingEnabled", true); $pdf->getDomPDF()->set_option("enable_html5_parser", true); ob_start(); $pdf->loadHtml($paginaHTML); ob_get_clean(); $pdf->setPaper('letter', ($orientacion == 1 ? 'portrait' : 'landscape')); $pdf->save(public_path('img/' . $pdfName));
问题排查与修复
1. Base64字符串拼接格式错误
你的img标签里,Base64内容前后多了不必要的单引号,同时data:image/png;base64,后面多了空格,导致src属性不符合标准格式。正确写法应直接拼接纯Base64编码内容:
<!-- 错误写法 --> <img style="padding: 0px; margin: 0px;" width="100%" src="data:image/png;base64, ' . $base64 . '" /> <!-- 修复后写法 --> <img style="padding: 0px; margin: 0px;" width="100%" src="data:image/png;base64,' . $base64 . '" />
2. 移除不必要的输出缓冲操作
你用ob_start()和ob_get_clean()包裹loadHtml的操作完全多余,甚至可能干扰DomPDF读取HTML内容,直接删除这部分代码,改为直接调用:
// 删掉以下两行 ob_start(); $pdf->loadHtml($paginaHTML); ob_get_clean(); // 改为 $pdf->loadHtml($paginaHTML);
3. 清理重复的配置项
你重复设置了isHtml5ParserEnabled和enable_html5_parser,二者是同一配置的不同写法,保留其中一个即可:
// 保留其中一行即可,建议保留下面这句 $pdf->getDomPDF()->set_option("isHtml5ParserEnabled", true);
修复后的完整代码示例
$pdf = app('dompdf.wrapper'); $context = stream_context_create([ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, ], ]); $pdf->getDomPDF()->setHttpContext($context); $pdf->getDomPDF()->set_option("isPhpEnabled", true); $pdf->getDomPDF()->set_option("isHtml5ParserEnabled", true); $pdf->getDomPDF()->set_option("isRemoteEnabled", true); $pdf->getDomPDF()->set_option("isFontSubsettingEnabled", true); $pdf->loadHtml($paginaHTML); $pdf->setPaper('letter', ($orientacion == 1 ? 'portrait' : 'landscape')); $pdf->save(public_path('img/' . $pdfName));
内容的提问来源于stack exchange,提问作者alonso
相关产品推荐
相关产品推荐

