【问题标题】:FPDF: Decide when to set header/footer dataFPDF:决定​​何时设置页眉/页脚数据
【发布时间】:2012-02-26 15:44:39
【问题描述】:

我已经为页眉和页脚数据苦苦挣扎了很长一段时间,并认为是时候在论坛上提问了。

我要做的是决定是否添加页眉/页脚是否应添加。所以在代码方面我想在添加页面时将页眉/页脚设置为打开或关闭。

我试图通过设置一个额外的参数 $setFooterHeader 来操纵函数 AddPage,该参数默认设置为 true。然后尝试将此参数设置为 false 每当我执行 addPage('','',false);但由于某种原因它忽略了它,我不知道为什么。

如果我在函数本身中将参数的默认值设置为 false,它就像一个魅力,但是当我尝试在我的脚本中执行它并将其设置为参数时,它会完全忽略它。

这是fpdf.php文件的代码sn-p(函数addPage)

function AddPage($orientation='', $size='', $setHeaderFooter=true) 
{ 
     // Start a new page 
     if($this->state==0) 
     $this->Open(); 
     $family = $this->FontFamily; 
     $style = $this->FontStyle.($this->underline ? 'U' : ''); 
     $fontsize = $this->FontSizePt; 
     $lw = $this->LineWidth; 
     $dc = $this->DrawColor; 
     $fc = $this->FillColor; 
     $tc = $this->TextColor; 
     $cf = $this->ColorFlag; 
     if($this->page>0) 
     { 
         // Page footer 
         if ($setHeaderFooter == true) 
         { 
             $this->InFooter = true; 
             $this->Footer(); 
             $this->InFooter = false; 
             // Close page 
             $this->_endpage(); 
         } 
      } 
     // Start new page 
     $this->_beginpage($orientation,$size,$setHeaderFooter); 
     // Set line cap style to square 
     $this->_out('2 J'); 
     // Set line width 
     $this->LineWidth = $lw; 
     $this->_out(sprintf('%.2F w',$lw*$this->k)); 
     // Set font 
     if($family) 
     $this->SetFont($family,$style,$fontsize); 
     // Set colors 
     $this->DrawColor = $dc; 
     if($dc!='0 G') 
     $this->_out($dc); 
     $this->FillColor = $fc; 
     if($fc!='0 g') 
     $this->_out($fc); 
     $this->TextColor = $tc; 
     $this->ColorFlag = $cf; 
     // Page header 
     if ($setHeaderFooter == true) 
     { 
         $this->InHeader = true; 
         $this->Header(); 
         $this->InHeader = false; 
     } 
     // Restore line width 
     if($this->LineWidth!=$lw) 
     { 
         $this->LineWidth = $lw; 
         $this->_out(sprintf('%.2F w',$lw*$this->k)); 
     } 
     // Restore font 
     if($family) 
     $this->SetFont($family,$style,$fontsize); 
     // Restore colors 
     if($this->DrawColor!=$dc) 
     { 
         $this->DrawColor = $dc; 
         $this->_out($dc); 
     } 
     if($this->FillColor!=$fc) 
     { 
         $this->FillColor = $fc; 
         $this->_out($fc); 
     } 
     $this->TextColor = $tc; 
     $this->ColorFlag = $cf; 
} 

下面是我使用 FPDF 的 PHP 脚本的代码 sn-p

/** PHP FPDF */ 
require_once 'classes/FPDF/fpdf.php'; 
require_once 'classes/FPDI/fpdi.php'; 

class PDF extends FPDI 
{ 
     function Header() 
     { 
         $this->SetFont( 'Arial', 'B', 18 ); //set font to Arial, Bold, and 16 Size 

         //create heading with params 
         //0 - 100% width 
         //9 height 
         //"Page Heading" - With this text 
         //1 - border around it, and center aligned 
         //1 - Move pionter to new line after writing this heading 
         //'C' - center aligned 
         $this->Cell( 0, 9, 'Page Heading', 1, 1, 'C' ); 

         $this->ln( 5 ); 
     } 

     function Footer() 
     { 
         //move pionter at the bottom of the page 
         $this->SetY( -15 ); 

         //set font to Arial, Bold, size 10 
         $this->SetFont( 'Arial', 'B', 10 ); 

         //set font color to blue 
         $this->SetTextColor( 52, 98, 185 ); 

         $this->Cell( 0, 10, 'Footer Text', 0, 0, 'L' ); 

         //set font color to gray 
         $this->SetTextColor( 150, 150, 150 ); 

         //write Page No 
         $this->Cell( 0, 10, 'Page No: ' . $this->PageNo(), 0, 0, 'R' ); 
     } 
 } 

// Create new PDF object 
$pdf = new PDF('P','mm','A4'); 
$pdf->addPage('','',false); 

// Output pdf file 
$pdf->Output('test.pdf','D'); 

非常感谢您的帮助!!

【问题讨论】:

    标签: php fpdf


    【解决方案1】:

    我已经通过在类外设置一个标志并在页眉和页脚函数中使用这个标志解决了这个问题

    修复是在页面部分,而不是在 addPage 函数中

    就在做 $pdf->addPage 之前你设置了标志,因为 addPage 会自动调用页眉和页脚函数。

    这是正确的代码(使用 FPDF 的 PHP 脚本的 sn-p)

    /** PHP FPDF */ 
    require_once 'classes/FPDF/fpdf.php'; 
    require_once 'classes/FPDI/fpdi.php'; 
    
    class PDF extends FPDI 
    { 
         function Header() 
         { 
            if ($this->header == 1)
            {
                $this->SetFont( 'Arial', 'B', 18 ); //set font to Arial, Bold, and 16 Size 
    
                //create heading with params 
                //0 - 100% width 
                //9 height 
                //"Page Heading" - With this text 
                //1 - border around it, and center aligned 
                //1 - Move pionter to new line after writing this heading 
                //'C' - center aligned 
                $this->Cell( 0, 9, 'Page Heading', 1, 1, 'C' ); 
    
                $this->ln( 5 ); 
            }
         } 
    
         function Footer() 
         {
            if ($this->footer == 1)
            {
                 //move pionter at the bottom of the page 
                 $this->SetY( -15 ); 
    
                 //set font to Arial, Bold, size 10 
                 $this->SetFont( 'Arial', 'B', 10 ); 
    
                 //set font color to blue 
                 $this->SetTextColor( 52, 98, 185 ); 
    
                 $this->Cell( 0, 10, 'Footer Text', 0, 0, 'L' ); 
    
                 //set font color to gray 
                 $this->SetTextColor( 150, 150, 150 ); 
    
                 //write Page No 
                 $this->Cell( 0, 10, 'Page No: ' . $this->PageNo(), 0, 0, 'R' ); 
            }
         } 
     } 
    
    // Create new PDF object 
    $pdf = new PDF('P','mm','A4'); 
    
    $pdf->header = 0;
    $pdf->footer = 0;
    $pdf->addPage('','',false); 
    
    // Output pdf file 
    $pdf->Output('test.pdf','D'); 
    

    【讨论】:

    • 我设置了这个,但 FOOTER 不起作用。当它设置为 0 时,它仍然显示页脚。
    • 非常聪明!
    【解决方案2】:

    我知道您已经为自己找到了遮阳篷,但正如其中一位评论者指出的那样,这对我来说不适用于页脚。

    好消息是您可以不设置外部标志。您可以使用 $this->PageNo() 来确定是否包含页眉和页脚。

    例如,如果您想像我一样排除首页的页眉和页脚:

    function Footer() {
        if($this->PageNo() != 1){
              // footer code
        }
    }
    

    如果你想让我们说在几页上排除它们而不是写一个无休止的 if 语句,你应该把要排除的页码放在一个数组中,然后用 in_array() 检查页眉和/或页脚是否应该是包括在内。

    【讨论】:

      【解决方案3】:

      您可以通过调用类外的函数来定义多种不同类型的页眉和页脚:

      class PDF extends FPDF {
          function Header(){
              if(!empty($this->enableheader))
                  call_user_func($this->enableheader,$this);
          }
          function Footer(){
              if(!empty($this->enablefooter))
                  call_user_func($this->enablefooter,$this);
          }
      }
      
      
      $pdf = new PDF('P');
      $pdf->SetTextColor(0);
      $pdf->SetFont('Arial','B',10);
      $pdf->AliasNbPages();
      $pdf->AddPage();
      
      $pdf->Cell(50,6,'Headerless & Footerless page');
      
      
      
      $pdf->enableheader = 'header1';
      $pdf->AddPage();
      $pdf->enablefooter = 'footer1';
      
      $pdf->AddPage();
      $pdf->AddPage();
      
      
      $pdf->enableheader = 'header2';
      $pdf->AddPage();
      $pdf->enablefooter = 'footer2';
      
      $pdf->Output();
      
      
      
      function header1($pdf){
          $pdf->Cell(50,6,'Header type 1',1,0,'L');
      }
      function footer1($pdf){
          $pdf->SetY(280);
          $pdf->Cell(50,6,'Footer type 1',1,0,'L');
          $pdf->Cell(0,6,"Page: {$pdf->PageNo()} of {nb}",1,0,'R');
      }
      function header2($pdf){
          $pdf->Cell(50,6,'Header type 2',1,0,'L');
      }
      function footer2($pdf){
          $pdf->SetY(280);
          $pdf->Cell(50,6,'Footer type 2',1,0,'L');
          $pdf->Cell(0,6,"Page: {$pdf->PageNo()} of {nb}",1,0,'R');
      }
      

      页脚的技巧是在创建下一页时添加页脚,在关闭输出时添加最后一个页脚。 因此,您必须在添加页面之前定义页眉,然后在下一页之前定义页脚。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-11
        • 2019-08-08
        相关资源
        最近更新 更多