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
相关产品推荐
相关产品推荐

