如何在FPDF中使用生成的二维码且无需存储文件
问题描述
我用Simple QR Code库结合FPDF开发时,控制器里这段代码无法渲染二维码,反而输出SVG的XML代码:
$this->fpdf->SetFont('Arial','B',14); $this->fpdf->Cell(80 ,5,'This Is Header',0,0); $this->fpdf->Cell(80 ,5,QrCode::generate('this is should generate QR'),1,1); $this->fpdf->Cell(30 ,5,$title,0,1, 'R'); $this->fpdf->Cell(190 ,2,'',0,1);
输出的内容是截断的SVG代码:
<?xml version="1 <svg xmlns="http://www.w3.org/2000/svg" height="100" viewBox="0 0 100 100">< height="100" fill="#ffffff" transform="translate(0,0)"><path fill-rule="eve 3L9 3L9 4L10 4L10 5L11 5L11 4L12 4L12 7L11 7L 6L8 8L4 8L4 10L1 10L1 9L3 9L3 8L0 8L0 10L1 13L8 13L8 17L9 17L9 18L8 18L8 21L9 21L9 19L11 1 17L12 16L13 16L13 17L14 17L14 18L16 18L1 16L17 16L17 15L18 15L18 13L17 13L17 12L1
我知道可以存成PNG文件再调用,但想实现不存储文件直接渲染二维码,该怎么做?
解决方案
核心思路是让Simple QR Code生成PNG格式的二进制数据,再直接传给FPDF的Image方法,不需要落地存储:
- 生成PNG二进制数据:调用
QrCode时指定格式为png,并传入第二个参数true,让方法返回原始二进制数据而不是直接输出。 - FPDF直接加载二进制数据:FPDF的
Image方法支持通过@前缀加载二进制流,不需要文件路径。
修改后的控制器代码示例:
$this->fpdf->SetFont('Arial','B',14); $this->fpdf->Cell(80 ,5,'This Is Header',0,0); // 生成QR的PNG二进制数据,size可按需调整尺寸 $qrPngData = QrCode::format('png')->size(50)->generate('this is should generate QR', true); // 直接将二进制数据传入Image方法,@表示加载二进制流 $this->fpdf->Image('@' . $qrPngData, $this->fpdf->GetX(), $this->fpdf->GetY(), 20); // 用空Cell占位,避免后续内容与二维码重叠 $this->fpdf->Cell(80 ,20,'',1,1); $this->fpdf->Cell(30 ,5,$title,0,1, 'R'); $this->fpdf->Cell(190 ,2,'',0,1);
关键说明
format('png'):指定生成PNG格式,替代默认的SVG输出。size(50):设置二维码的像素尺寸,可根据PDF布局需求调整。generate(..., true):第二个参数true让方法返回二进制数据,而非直接输出到浏览器。Image('@' . $qrPngData, ...):@前缀是FPDF的特殊标记,告诉它传入的是二进制流而非文件路径,直接解析渲染。
内容的提问来源于stack exchange,提问作者owf
相关产品推荐
相关产品推荐

