2012-03-01 58 views
10

有没有办法有一个文档中的第1页对于第2页不同的页眉标识和不同?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

回答

7

奇怪。我遇到了同样的问题,但是这在我早期版本的TCPDF版本中工作:4.8.009,当我升级到5.9.149时,我注意到了这个问题。

我比较了2并分离问题向header()函数。

我可以强制它允许我更改标题并运行以下操作接受它: $ pdf-> setHeaderTemplateAutoreset(true);

+0

非常好,这正是我之前的想法 – bububaba 2012-03-13 11:21:48

1

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

一对夫妇的“如何合并?”结果:

+0

我对项目使用Zend Framework,所以合并很容易做到'Zend_Pdf'。我将发布相关代码作为单独的答案。谢谢你的帮助! – bububaba 2012-03-01 09:35:17

+0

对不起,我拿了一些声望,另一种解决方案正是我一直在寻找的。 – bububaba 2012-03-13 11:20:16

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); 
+0

此外,性能方面,这似乎比用一个库生成一个文档要慢很多,所以要小心。 – bububaba 2012-03-01 10:33:01

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

享受!

+0

问题是如何在标题中添加不同的徽标,而不是将标题全部删除。 – 2013-01-21 10:50:44

+0

你是对的汤姆,我误解了。抱歉。 – WebOnLife 2013-01-22 10:19:34

+0

Joaquin建议覆盖Header()和Footer()方法的正确解决方案。 – WebOnLife 2013-01-22 10:20:36

3

我用:

$pdf->resetHeaderTemplate(); 

应该重写模板头,并根据需要指定新的一个。它为我工作。

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()返回的元素都可以用这种方式更新。