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

Laravel生成含二维码PDF时如何去除多余显示的XML标签

问题根因

SimpleSoftwareIO/simple-qrcode 默认生成SVG格式二维码,mccarlosen/laravel-mpdf 底层依赖的mPDF库对带XML声明头的内联SVG解析存在兼容缺陷,无法正常渲染图形时会直接将SVG内部的XML标签作为明文输出,就是你看到的异常内容。

可用解决方案

优先选择方案1,兼容性最好,无需额外调整mPDF配置:

  • 方案1:将二维码输出为PNG格式嵌入
    二维码生成时指定输出PNG二进制流,转base64后通过标准img标签引入,mPDF对base64格式PNG的解析支持无兼容问题。
    将Blade模板中原有二维码调用代码替换为:

    <div class="card">
        <div class="card-body">
            <img src="data:image/png;base64,{{ base64_encode(QrCode::size(300)->format('png')->generate('hello')) }}" alt="二维码">
        </div>
    </div>
    
  • 方案2:保留SVG格式,过滤XML声明并开启mPDF SVG支持
    如果需要矢量格式的二维码,可以先过滤SVG开头的XML声明标签,同时调整mPDF配置开启内联SVG解析。
    第一步,调整PDF生成代码,补充SVG解析相关配置:

    $pdf = LaravelMpdf::loadView(
        'testing_qr', compact('testing'),
        [],
        [
            'orientation' => 'landscape',
            'format' => 'A5',
            'showImageErrors' => true
        ]
    );
    return $pdf->stream('test.pdf');
    

    第二步,修改Blade中二维码输出逻辑,过滤多余XML头:

    <div class="card">
        <div class="card-body">
            {!! preg_replace('/^<\?xml.*?\?>/i', '', QrCode::size(300)->generate('hello')) !!}
        </div>
    </div>
    

    注意:该方案稳定性弱于PNG方案,若SVG包含mPDF不支持的属性仍可能出现渲染异常。

  • 方案3:临时文件存图引用
    若上述方案仍有异常,可在生成PDF前先将二维码保存为本地PNG临时文件,Blade中直接引用本地文件路径渲染,该方式兼容性最高。
    控制器端代码调整:

    // 生成临时二维码文件
    $tempQrPath = public_path('temp/qrcode_'.time().'.png');
    // 确保temp目录存在且有写入权限
    QrCode::size(300)->format('png')->generate('hello', $tempQrPath);
    $testing['qr_temp_path'] = $tempQrPath;
    
    $pdf = LaravelMpdf::loadView(
        'testing_qr', compact('testing'),
        [],
        ['orientation' => 'landscape', 'format' => 'A5']
    );
    // PDF输出后可删除临时文件
    // register_shutdown_function(function() use ($tempQrPath) {
    //     @unlink($tempQrPath);
    // });
    return $pdf->stream('test.pdf');
    

    Blade模板中引用:

    <div class="card">
        <div class="card-body">
            <img src="{{ $testing['qr_temp_path'] }}" alt="二维码">
        </div>
    </div>
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:51:22