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

时间:2012-03-01 08:49:09

标签: php pdf pdf-generation tcpdf

是否有办法在文档中为第一页设置不同的标题徽标,为第二页设置不同的标题?

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

/* 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);

上面会生成一个包含2个页面的文档,标题中都有logo_1.png

我是否需要自定义TCPDF?有没有人这样做过?我正在使用版本5.9.144

8 个答案:

答案 0 :(得分:7)

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

我比较了2并将问题与Header()函数隔离开来。

我可以强制它允许我更改标题并通过运行此接受它: $ PDF-> setHeaderTemplateAutoreset(真);

答案 1 :(得分:6)

以下对我有用,

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   
        }
    }
}

答案 2 :(得分:3)

我用过:

$pdf->resetHeaderTemplate();

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

答案 3 :(得分:1)

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

一些“怎么合并?”结果:

答案 4 :(得分:0)

仅供记录,如果某人将来遇到同样的问题,可以使用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);

答案 5 :(得分:0)

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

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()返回的所有元素。

答案 6 :(得分:0)

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

 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); 
    }
}

答案 7 :(得分:-1)

如果您希望有一个没有页眉和页脚的封面以及带有它们的内部页面,则可以更轻松地处理它。 只需通过'setPrintHeader'和'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");

享受!