【问题标题】:TCPDF set different headers for different pages in one documentTCPDF 为一个文档中的不同页面设置不同的标题
【发布时间】:2012-03-19 18:24:07
【问题描述】:

有没有办法让文档的第一页有不同的标题标志,而第二页有不同的标题标志?

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

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

【问题讨论】:

    标签: php pdf pdf-generation tcpdf


    【解决方案1】:

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

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

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

    $pdf->setHeaderTemplateAutoreset(true);
    

    【讨论】:

    • 太好了,这正是我所追求的
    • 它不适用于 TCPDF 版本:6.0.084。你知道吗?
    【解决方案2】:

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

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

    【讨论】:

    • 能否请您详细说明您的答案,例如与现有答案相比有什么新的?
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我用过:

      $pdf->resetHeaderTemplate();
      

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

      【讨论】:

      • 如何为该标题添加新内容?
      【解决方案5】:

      如果您希望有一个没有页眉和页脚的封面页以及带有它们的内部页面,有一种更简单的方法来处理它。 只需通过 '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");
      

      享受吧!

      【讨论】:

      • 问题是如何在标题中添加不同的徽标,而不是完全摆脱标题。
      • 正确的解决方案是 Joaquin 建议的,覆盖 Header() 和 Footer() 方法。
      • 我投了反对票,因为它在封面页显示页脚。请在创建第二个页面后启用页脚和页眉,即在 $pdf-&gt;AddPage() 之后
      【解决方案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   
              }
          }
      }
      

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • 另外,在性能方面,这似乎比使用一个库生成一个文档要慢很多,所以要小心。
        【解决方案8】:

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

        几个“如何合并?”结果:

        【讨论】:

        • 我在项目中使用 Zend 框架,所以使用 Zend_Pdf 很容易合并。我将发布相关代码作为单独的答案。感谢您的帮助!
        • 抱歉带走了一些声誉,另一种解决方案正是我想要的。
        猜你喜欢
        • 1970-01-01
        • 2015-04-15
        • 1970-01-01
        • 2019-10-26
        • 2014-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多