PHP Fpdf 库:在 PDF 中每个页面的页眉中嵌入徽标图像

问题描述

我正在处理一个 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.
    }
}

参见relevant manual page


我开发了这样一个子类,它允许在运行时指定头函数。我忘记了香草 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() 的不同实例。