dompdf导出PDF时<td>内加载的SVG格式二维码出现失真问题
dompdf导出PDF时SVG格式URL二维码失真解决方案
问题根因
- 配置顺序错误:现有代码先执行
loadHTML()再设置dompdf配置项,此时isRemoteEnabled、isHtml5ParserEnabled等配置在加载HTML和资源时并未生效,资源解析走默认逻辑。 - URL类内容生成的二维码信息密度远高于普通短字符串:URL携带
://、/等特殊字符且整体长度更长,生成的SVG二维码点阵更密集,dompdf对外部引用的高密度点阵SVG解析时尺寸计算逻辑存在缺陷,自动适配尺寸时会出现点阵错位、拉伸的失真问题,普通短字符串生成的二维码点阵稀疏,计算偏差小所以肉眼看不出异常。
修复方案
方案1(优先推荐,兼容性最好):调整配置顺序+内联SVG资源
直接把SVG内容嵌入HTML,绕开dompdf加载外部SVG资源的解析缺陷。
第一步:调整业务代码配置顺序
将配置项设置放到loadHTML()执行之前:
$reports = $this->getReports($request); extract($request->all()); $this->createQRCODE($reports); $pdf = \App::make('dompdf.wrapper'); $pdf->setPaper('A4', 'portrait'); // 先设置配置再加载HTML $pdf->setOptions(['isHtml5ParserEnabled' => true, 'isRemoteEnabled' => true]); $html = view('pdf/rekap-lp')->with(compact('reports', 'start_date', 'end_date'))->render(); $pdf->loadHTML($html); return $pdf->stream(uniqid().'.pdf');
第二步:修改视图层代码,内联SVG
替换原有img标签,直接输出SVG文件内容:
<td> {!! file_get_contents(public_path('img/qr-code/lp/' . $item->id_lp .'.svg')) !!} </td>
方案2:保留img标签,添加固定宽高
如果不想修改为内联方式,给img标签明确指定宽高,避免dompdf自动计算尺寸出错:
<img src="{{ asset('img/qr-code/lp/' . $item->id_lp .'.svg') }}" width="70" height="70" style="object-fit: contain;">
方案3:生成二维码时直接输出PNG格式
dompdf对PNG位图的支持比SVG矢量图更稳定,URL类内容生成的PNG二维码不会出现解析失真问题。
内容的提问来源于stack exchange,提问作者Dean TristaNato
相关产品推荐
相关产品推荐

