在CodeIgniter控制器中调用FPDF Header和Footer的替代方法
解决FPDF在CodeIgniter控制器中自定义页眉页脚的问题
首先,你遇到的Cannot redeclare header()错误,是因为在控制器里直接定义function Header()会和PHP内置的header()函数冲突(PHP函数名大小写不敏感)。而且FPDF的页眉页脚机制不是通过$pdf->header->xxx这种属性调用的,而是需要继承FPDF类并重写特定方法来实现。
下面给你两种可行的解决方案,都能在控制器里完成需求(推荐第一种更规范的方式):
方案一:修改自定义的myfpdf库(推荐)
既然你已经在加载myfpdf库,那直接在这个自定义库里继承FPDF并重写Header()和Footer()方法是最稳妥的:
- 打开
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'); } }
- 然后在控制器里直接使用这个自定义类即可,不需要再写额外的方法:
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




