You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在CodeIgniter控制器中调用FPDF Header和Footer的替代方法

解决FPDF在CodeIgniter控制器中自定义页眉页脚的问题

首先,你遇到的Cannot redeclare header()错误,是因为在控制器里直接定义function Header()会和PHP内置的header()函数冲突(PHP函数名大小写不敏感)。而且FPDF的页眉页脚机制不是通过$pdf->header->xxx这种属性调用的,而是需要继承FPDF类并重写特定方法来实现。

下面给你两种可行的解决方案,都能在控制器里完成需求(推荐第一种更规范的方式):

方案一:修改自定义的myfpdf库(推荐)

既然你已经在加载myfpdf库,那直接在这个自定义库里继承FPDF并重写Header()Footer()方法是最稳妥的:

  1. 打开application/libraries/Myfpdf.php(CI要求库文件名首字母大写,需和类名对应),修改成下面的代码:
<?php
// 引入原始FPDF文件,路径根据你的实际情况调整
require_once(APPPATH . 'libraries/fpdf/fpdf.php');

class Myfpdf extends FPDF {
    // 自定义页眉
    public function Header() {
        $this->SetFont('Arial','B',15);
        $this->Cell(80);
        $this->Cell(30,10,'Title',1,0,'C');
        $this->Ln(20);
    }

    // 自定义页脚
    public function Footer() {
        $this->SetY(-15);
        $this->SetFont('Arial','I',8);
        $this->Cell(0,10,'Page ' . $this->PageNo() . '/{nb}',0,0,'C');
    }
}
  1. 然后在控制器里直接使用这个自定义类即可,不需要再写额外的方法:
public function tutorial2() {
    $this->load->library('myfpdf');
    $pdf = new Myfpdf();
    $pdf->AliasNbPages(); // 启用总页数占位符{nb}
    $pdf->AddPage();
    $pdf->SetFont('Times','',12);

    for($i=1;$i<=40;$i++) {
        $pdf->Cell(0,10,'Printing line number '.$i,0,1);
    }

    $pdf->Output();
}

方案二:在控制器里动态创建子类(临时需求用)

如果不想修改库文件,也可以在控制器里临时定义一个继承自FPDF的子类,注意类名唯一,方法名首字母大写:

public function tutorial2() {
    $this->load->library('myfpdf'); // 先加载基础FPDF库

    // 定义自定义FPDF子类,注意类名不要重复
    class CustomPDF extends FPDF {
        public function Header() {
            $this->SetFont('Arial','B',15);
            $this->Cell(80);
            $this->Cell(30,10,'Title',1,0,'C');
            $this->Ln(20);
        }

        public function Footer() {
            $this->SetY(-15);
            $this->SetFont('Arial','I',8);
            $this->Cell(0,10,'Page ' . $this->PageNo() . '/{nb}',0,0,'C');
        }
    }

    $pdf = new CustomPDF();
    $pdf->AliasNbPages();
    $pdf->AddPage();
    $pdf->SetFont('Times','',12);
    
    for($i=1;$i<=40;$i++) {
        $pdf->Cell(0,10,'Printing line number '.$i,0,1);
    }
    
    $pdf->Output();
}

为什么你之前的写法不行?

FPDF并没有把页眉页脚设计成可直接调用的对象属性(比如$pdf->header),而是通过类方法重写的机制:当FPDF生成页面时,会自动调用你重写的Header()Footer()方法,所以必须通过继承来实现自定义,而不是直接调用属性。

另外要注意:

  • 方法名必须是Header()Footer()(首字母大写),否则FPDF不会识别调用。
  • 方案二如果被多次调用可能会报类重复定义的错误,所以方案一更适合长期使用。

内容的提问来源于stack exchange,提问作者Qing Fei De Yi

火山引擎 最新活动