问题描述
我正在处理一个 PHP 项目。我需要在我的应用程序中使用 FPDF 库 http://www.fpdf.org/ 生成 PDF。但是我在将徽标图像嵌入到每个页面的标题中时遇到了问题。
这是我的代码:
$fontFamily = "Helvetica";
$pdf = new Fpdi();
$pdf->SetFont($fontFamily,'',8);
$pdf->AliasNbPages();
$pdf->AddPage();
//logo at the top of the page.
$pdf->Image('img/logo.png',125,10,73,15);
//loop through the array and render the list
for($i=1;$i<=100;$i++)
$pdf->Cell(0,5,'Printing line number '.$i,1);
$pdf->Output();
正如您在我的代码中看到的,我按照文档中的示例在标题中呈现徽标。这会在 PDF 的开头添加徽标。但有一个问题。如您所见,我正在遍历数组并在 PDF 中呈现列表。我不知道要多久,因为数据将是动态的。
但如果需要,它会自动为列表创建新页面。但问题是新创建的页面(第二个)页面顶部没有标题徽标。如何在每个页面的页眉中嵌入徽标,并为新页面自动添加徽标?
解决方法
您需要定义一个 Header()
方法,该方法将在每次添加新页面时由 FPDF 自动运行(使用 AddPage() 手动或自动)。
为此,您需要子类化 FPDF 类,并使用适当的 Header()
方法创建另一个类:
class WaiYanHeinPDF extends FPDF {
public function Header() {
parent::Header();
// Add the logo here.
}
}
我开发了这样一个子类,它允许在运行时指定头函数。我忘记了香草 FPDF 没有 setHeader() 函数:为此道歉。这就是我所做的:
class MyPDF extends FPDF {
private $onHeader;
public function setHeader(Callable $func) {
$this->onHeader = $func;
return $this;
}
public function Header() {
parent::Header();
if ($this->onHeader) {
call_user_func($this->onHeader,$this);
}
}
}
只有那时我才能做(因此我以前的错误答案):
$MyPdf->setHeader(function($pdf) {
...
});
无需为我需要的每个不同的 PDF 创建一个新类。我只是创建了 MyPDF() 的不同实例。