FPDF:决定​​何时设置页眉/页脚数据

时间:2012-02-26 15:44:40

标签: php fpdf

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

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

我试图通过设置额外参数$ setFooterHeader来操作AddPage函数,默认设置为true。然后在我执行addPage时尝试将此参数设置为false(''''',false);但由于某种原因它忽略了它,我无法弄清楚原因。

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

这是fpdf.php文件的代码片段(函数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; 
} 

下面是我的PHP脚本的代码片段,它使用FPDF

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

非常感谢您的帮助!!

3 个答案:

答案 0 :(得分:10)

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

修复程序位于页面部分,而不是在addPage函数

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

这是正确的代码(使用FPDF的PHP脚本片段)

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

答案 1 :(得分:6)

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

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

例如,如果你想在第一页上排除页眉和页脚,就像我一样:

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

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

答案 2 :(得分:1)

You can define multiple different types of headers and footers by calling functions outside the class:

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

The trick to footers is that the footer is added when the next page is created, with the last footer being added when the output is closed. Therefore, you have to define the header before the page is added, and the footer afterwards but before the next page.