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

如何在CodeIgniter中修改TCPDF生成PDF的动态头部(从数据库取值)

解决TCPDF动态头部(从数据库获取内容)的方案

嘿,我懂你不想用tcpdf_config.php里的静态常量来固定PDF头部,想要从数据库动态拉取标题和头部内容的需求!其实不用修改全局配置,TCPDF本身就支持通过重写Header()方法实现完全自定义的动态头部,这才是更灵活的做法。

下面结合你提供的example_005.php场景,给你一步步的实现方案:

步骤1:从数据库获取头部数据

先从数据库查询出你需要的标题、头部描述(比如公司名称、标语这类信息),这里用PDO举个示例,你可以换成自己常用的数据库操作方式:

// 数据库连接(根据你的实际配置修改)
$db = new PDO('mysql:host=localhost;dbname=your_database', 'username', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 查询头部配置(假设你有个settings表存储这类信息)
$stmt = $db->prepare("SELECT header_title, header_string FROM settings WHERE id = 1");
$stmt->execute();
$headerData = $stmt->fetch(PDO::FETCH_ASSOC);

// 提取动态变量
$dynamicHeaderTitle = $headerData['header_title'];
$dynamicHeaderString = $headerData['header_string'];

步骤2:自定义TCPDF类并重写Header()方法

不要直接用原生TCPDF类,我们创建一个继承它的子类,重写Header()方法,在里面使用从数据库拿到的动态数据:

require_once('tcpdf/tcpdf.php');

class CustomInvoicePDF extends TCPDF {
    // 定义属性存储动态头部数据
    public $headerTitle;
    public $headerString;

    // 重写Header方法,完全自定义头部内容
    public function Header() {
        // 设置标题字体
        $this->SetFont('helvetica', 'B', 14);
        // 输出动态标题(居中显示)
        $this->Cell(0, 10, $this->headerTitle, 0, false, 'C', 0, '', 0, false, 'M', 'M');
        
        // 换行后输出头部描述
        $this->Ln(6);
        $this->SetFont('helvetica', '', 10);
        $this->Cell(0, 8, $this->headerString, 0, false, 'C', 0, '', 0, false, 'M', 'M');
        
        // 如果需要动态Logo,也可以从数据库取路径后输出
        // $this->Image($dynamicLogoPath, 15, 10, 30, '', 'PNG', '', 'T', false, 300, '', false, false, 0, false, false, false);
        
        // 再换行,留出头部和正文的间距
        $this->Ln(12);
    }
}

步骤3:使用自定义类生成PDF

接下来用这个自定义类生成你的发票PDF,把数据库拿到的动态数据赋值给类的属性即可:

// 创建自定义PDF实例
$pdf = new CustomInvoicePDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

// 设置PDF基础配置(按需调整)
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('你的名称/公司');
$pdf->SetSubject('客户发票');

// 把动态头部数据传给自定义类
$pdf->headerTitle = $dynamicHeaderTitle;
$pdf->headerString = $dynamicHeaderString;

// 下面就是你原来example_005里的业务逻辑,比如添加页面、输出发票内容
$pdf->AddPage();

$pdf->SetFont('times', '', 12);

// 示例发票内容(替换成你从数据库拿到的订单、商品列表等)
$invoiceContent = "这是你的发票正文内容\n\n";
$invoiceContent .= "可以在这里添加商品明细、金额、客户信息等动态数据,TCPDF的MultiCell会自动处理换行";
$pdf->MultiCell(0, 0, $invoiceContent, 0, 'J', false, 1, '', '', true, 0, false, true, 0, 'T', false);

// 输出PDF(I表示在浏览器打开,D表示下载,F表示保存到服务器)
$pdf->Output('customer_invoice.pdf', 'I');

为什么不直接改tcpdf_config.php?

  • 全局配置是所有PDF共用的,如果你需要生成不同头部的PDF(比如不同客户的专属发票),改全局配置就完全不灵活了。
  • 重写Header()是TCPDF官方推荐的自定义头部/尾部的方式,能完全控制头部的布局、字体、内容,完美适配动态数据的需求。

这样你就能轻松实现从数据库获取动态内容的PDF发票啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:15:31