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

使用mPDF/qrcode库生成PDF时二维码无法显示的问题

mPDF嵌入mpdf/qrcode生成的二维码空白问题解决

我目前用mPDF配合mpdf/qrcode生成二维码嵌入PDF,PDF数据来自PHPSpreadsheet读取XLS文件,整体流程正常,但二维码始终空白,mPDF无报错。试过两种插入方法都无效:直接Base64编码传入,或者保存临时文件再插入,其他PDF内容显示正常。环境是mPDF 8.2.1、mpdf/qrcode 1.2、PHPSpreadsheet 3.7、PHP 8.3.14,GD和mbstring扩展已启用,$pdfUrl也验证过是正确的。

针对这个问题,可以从以下几个关键点排查解决:

1. 临时文件方法:延迟删除文件

mPDF对图像资源是延迟加载的,如果你在调用$mpdf->Image()后立刻删除临时文件,mPDF还没来得及读取文件内容,就会导致二维码区域空白。必须等PDF输出完成后再删除临时文件:

use Mpdf\QrCode\QrCode;
use Mpdf\Output;

$qrCode = new QrCode($pdfUrl);
$output = new Output\Png();
$qrCodeImage = $output->output($qrCode, 300);

$tempFile = tempnam(sys_get_temp_dir(), 'qr');
file_put_contents($tempFile, $qrCodeImage);
// 手动指定文件类型为PNG,避免自动识别失败
$mpdf->Image($tempFile, 10, 10, 40, 40, 'PNG');

// 先输出PDF(不管是保存到文件还是输出内容)
$mpdf->Output('output.pdf', 'F'); 
// 再删除临时文件
unlink($tempFile);

2. Base64方法:优化编码并指定文件类型

确保Base64编码没有多余字符,同时手动指定图像类型,避免mPDF解析data URI出错:

use Mpdf\QrCode\QrCode;
use Mpdf\Output;

$qrCode = new QrCode($pdfUrl);
$output = new Output\Png();
$qrCodeImage = $output->output($qrCode, 300);

// 移除base64编码后的多余填充字符,手动指定PNG类型
$base64Img = 'data:image/png;base64,' . rtrim(base64_encode($qrCodeImage), '=');
$mpdf->Image($base64Img, 10, 10, 40, 40, 'PNG');

3. 验证二维码生成有效性

先确认mpdf/qrcode生成的确实是有效PNG:把生成的$qrCodeImage保存成本地文件,手动打开看是否能正常显示二维码:

file_put_contents('test_qr.png', $qrCodeImage);

如果这个文件无法打开,说明二维码生成环节有问题,可尝试调整mpdf/qrcode的参数,比如容错率:

$qrCode = new QrCode($pdfUrl, [
    'errorCorrectionLevel' => \Mpdf\QrCode\QrCode::ERROR_CORRECTION_H
]);

4. 对齐mPDF的DPI配置

确保mPDF的图像DPI和二维码生成的DPI一致,避免缩放异常:

$mpdf = new \Mpdf\Mpdf([
    'img_dpi' => 300, // 和二维码生成时的300DPI匹配
]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:16:01