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

如何在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方法,不需要落地存储:

  1. 生成PNG二进制数据:调用QrCode时指定格式为png,并传入第二个参数true,让方法返回原始二进制数据而不是直接输出。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:06:17