You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

dompdf导出PDF时<td>内加载的SVG格式二维码出现失真问题

dompdf导出PDF时SVG格式URL二维码失真解决方案

问题根因

  1. 配置顺序错误:现有代码先执行loadHTML()再设置dompdf配置项,此时isRemoteEnabled、isHtml5ParserEnabled等配置在加载HTML和资源时并未生效,资源解析走默认逻辑。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:45:04