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

