TCPDF为一个文档中的不同页面设置不同的页眉


TCPDF set different headers for different pages in one document

是否有一种方法可以在文档的第一页使用不同的页眉徽标,在第二页使用不同徽标?

我认为在添加页面之间更改标题数据可能会奏效,但在我的测试中,在添加第一个页面后设置标题似乎没有效果:

/* other stuff
$pdf->setHeaderFont(array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
$pdf->setFooterFont(array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
$pdf->AliasNbPages();
*/
$pdf->SetHeaderData("logo_1.png", PDF_HEADER_LOGO_WIDTH, '', '');
$pdf->AddPage();
$pdf->writeHTML($htmlContent, true, 0, true, true);
$pdf->SetHeaderData("logo_2.png", PDF_HEADER_LOGO_WIDTH, '', '');
$pdf->AddPage();
$pdf->writeHTML($htmlContent2, true, 0, true, true);

上面生成了一个有两页的文档,两页的标题都有logo_1.png

我需要自定义TCPDF本身吗?有人这样做过吗?我使用的是5.9.144版本。

奇怪。我也有同样的问题,但这在我的旧版本TCPDF版本4.8.009中有效,当我升级到5.9.149时我注意到了这个问题。

我比较了2,并将问题隔离到Header()函数。

我可以通过运行以下命令来强制它允许我更改标题并接受它:

$pdf->setHeaderTemplateAutoreset(true);

以下对我有效,

class MYPDF extends TCPDF{
    function header1(){
        //print whatever the header 1 is
    }
    function Header2(){         
        if($this->page==1){
            //print header 1 and whatever the header 2 is
        }else{
            //print just header 2   
        }
    }
}

我使用过:

$pdf->resetHeaderTemplate();

它应该覆盖模板标题,并根据需要分配新的标题。它对我有效。

怎么样。。。让TCPDF生成具有不同标题的页面作为单独的文档,然后使用某种东西将所有中间PDF合并在一起,形成最终文档的页面(也许甚至TCPDF本身也可以合并,我不知道)?

几个"如何合并?"结果:

  • 将PDF文件与PHP合并
  • 使用PHP/linux将文件合并为单个PDF

如果您希望有一个没有页眉和页脚的封面以及带有页眉和页脚和页脚的内部页面,有一种更简单的方法可以处理它。只需通过"setPrintHeader"answers"setPrintFooter"关闭页眉和页脚打印,如下所示:

$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->AddPage();
$pdf->SetFont("freesans", "B", 20);
$pdf->Cell(0,10,"COVER TEXT",1,1,'C');
$pdf->setPrintHeader(true);
$pdf->setPrintFooter(true);
$pdf->setHeaderFont(array("freesans", "", 9));
$pdf->SetHeaderData('', '', 'Document Title', 'Document Header Text');
$pdf->AddPage();
$pdf->SetFont("freesans", "B", 20);
$pdf->Cell(0,10,"Internal text",1,1,'C');
$pdf->Output("HappyCover.pdf", "I");

享受吧!

仅供记录,如果有人将来也有同样的问题,可以使用Zend_Pdf:

// $filename is the final filename with path to save the generated PDF
$dir = dirname($filename);
$base = basename($filename);
$page1 = $dir . DIRECTORY_SEPARATOR . "tmp_1_" . $base;
$page2 = $dir . DIRECTORY_SEPARATOR . "tmp_2_" . $base;
//creates 1st page with TCPDF and saves to filesystem with filename $page1
$this->generateInvoicePage1($html_1, $page1);
//creates 2nd page with TCPDF and saves to filesystem with filename $page2
$this->generateInvoicePage2($html_2, $page2);
$pdf1 = Zend_Pdf::load($page1);
$pdf2 = Zend_Pdf::load($page2);
foreach ($pdf2->pages as $page) {
    $pdf1->pages[] = clone($page);
}
$pdf1->save($filename);
unlink($page1);
unlink($page2);

我发现这是触摸最轻的解决方案:

class MYPDF extends TCPDF {
    //Page header
    public function AddNewHeader($newTitle) {
        $this->header_xobj_autoreset = true;
        $this->header_title = $newTitle;
    }
}

请确保首先调用TCPDF::setHeaderData()。接下来,在每次AddPage()事件之前调用此函数,或者,如果您正在循环数据并依赖tcpdf添加页面,则在每次添加元素之后调用它。它打破了页眉的缓存,但允许用户在每个页面上放置一个新的自定义页眉。TCPDF::getHeaderData()返回的所有元素都可以通过这种方式更新。

我的解决方案,只有一个条件

 function Header(){
    if($this->page==1){
       $html = '<div><img src="./outils/img1.png" alt=""></div>';
        $this->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true);
    }else{
        $html = '<div><img src="./outils/img2.png" alt=""></div>';
        $this->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true); 
    }
}