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

Laravel中使用dompdf生成PDF时二维码显示失真问题

Laravel dompdf生成PDF二维码失真问题解决

问题背景

使用Laravel的dompdf生成PDF时,二维码出现严重失真情况,无论通过CSS类、img标签设置尺寸都无法匹配预期大小,扫描识别困难。

核心原因

  • 默认生成的二维码为SVG格式,dompdf对SVG缩放渲染支持不佳
  • 二维码分辨率不足,缩放后出现像素化
  • dompdf的DPI设置与二维码尺寸不匹配

解决步骤

1. 生成高分辨率PNG二维码

修改控制器中二维码生成逻辑,指定PNG格式并设置足够大的尺寸(避免后续缩放操作):

// 生成PNG格式二维码,尺寸设为600px(高分辨率)
$qrCode = QrCode::format('png')
    ->size(600)
    ->generate(route('donate', ['hash' => $hash], true));

// 可选:将二维码存储到storage,使用URL替代base64更稳定
$qrPath = 'temp/qr-' . $hash . '.png';
Storage::put($qrPath, $qrCode);
$data['qr_code'] = Storage::url($qrPath);

// 若坚持使用base64,需确保是PNG编码
// $data['qr_code'] = base64_encode($qrCode);

2. 调整dompdf配置

提高DPI匹配二维码分辨率,同时确保纸张尺寸单位正确(dompdf默认单位为点,1英寸=72点):

// 自定义横向纸张尺寸(示例为A4横向:297mm×210mm 转换为点单位)
$customPaper = [0, 0, 841.89, 595.28];
$file = $pdf->loadView('admin.order.card', $data)
    ->setPaper($customPaper, 'landscape')
    ->setOptions([
        'dpi' => 300, // 匹配二维码300DPI分辨率
        'isHtml5ParserEnabled' => true,
        'isRemoteEnabled' => true // 加载外部图片需开启此选项
    ]);

3. 优化CSS避免图片拉伸

设置二维码容器固定尺寸,图片保持等比例缩放,强制清晰渲染:

.qr-wrap {
    margin: 20px auto;
    width: 300px; /* 预期显示的二维码尺寸 */
    height: 300px;
}
.qr {
    width: 100%;
    height: auto; /* 保持宽高比,防止拉伸失真 */
    image-rendering: crisp-edges; /* 提升渲染清晰度 */
}

视图中对应标签修改:

<div class="qr-wrap">
    <img class="qr" src="{{ $card['qr_code'] }}" alt="捐赠二维码" />
</div>

4. 替换transform定位(可选)

dompdf对transform属性支持有限,若右侧文本区域的定位导致二维码渲染异常,改用flex布局替代:

.card .right {
    width: 50%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
}
.card .right .text {
    text-align: center;
    white-space: normal;
    width: 80%;
}

效果验证

完成上述修改后,生成的PDF中二维码将清晰显示,尺寸符合设定要求,可正常扫描识别。

内容的提问来源于stack exchange,提问作者twan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:34:59