Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP FPDF page break not working

Tags:

php

fpdf

I am comong to the end of my collage project and I am now trying to write a script that produces a PDF file using FPDF.

The script should query the data tables and return job data from one table and job comments from another table. all this works.

I then output each job in rows with a maximun of 25 rows per page (landscape). Again, all this works. after all the jobs have been output I then need to output the comments data below the job data.

This works but the comments data will not page break before the bottom of the page. Can any one see where I have gone wrong. I have marked the script below with //***** at the point where I think its wrong. I know the script is long but I thought it may explain my issue better.

$pdf = new PDF();
$pdf->AliasNbPages();
$pdf->SetAutoPageBreak(false);
$pdf->AddPage(L);

$y_axis_initial = 40;

//initialize counter
$i = 0;

//Set maximum rows per page
$max = 25;
$y_axis = 40;

//Set Row Height
$row_height = 6;

$y_axis = $y_axis + $row_height;

$pdf->SetFillColor(232,232,232);
$pdf->SetFont('Arial','B',9);
$pdf->SetY(40);
$pdf->SetX(10);
$pdf->Cell(13,6,'SeqID',1,0,'L',1);
$pdf->SetX(23);
$pdf->Cell(150,6,'Sequence',1,0,'L',1);
$pdf->SetX(150);
$pdf->Cell(110,6,'Item',1,0,'L',1);
$pdf->SetX(255);
$pdf->Cell(25,6,'Status',1,0,'L',1);

$column_seqid = "";
$column_headerid = "";
$column_seq = "";
$column_status = "";


//For each row, add the field to the corresponding column
while ($row_Audits = mysql_fetch_assoc($Audits))
{

    if ($i == $max)
    {
    $pdf->AddPage('L');
    $newY = $pdf->GetY();
    $y_axis = 40;
    $pdf->SetFillColor(232,232,232);
    //print column titles for the current page
    $pdf->SetFont('Arial','B',9);
    $pdf->SetY(40);
    $pdf->SetX(10);
    $pdf->Cell(13,6,'SeqID',1,0,'L',1);
    $pdf->SetX(23);
    $pdf->Cell(150,6,'Sequence',1,0,'L',1);
    $pdf->SetX(150);
    $pdf->Cell(110,6,'Item',1,0,'L',1);
    $pdf->SetX(255);
    $pdf->Cell(25,6,'Status',1,0,'L',1);


    //Go to next row
    $y_axis = $y_axis + $row_height;

    //Set $i variable to 0 (first row)
    $i = 0;
    }

    if(strlen($row_Audits['SeqNo']) <4)
    {
        $SeqID = "0".$row_Audits['SeqNo'];
    } else {
        $SeqID = $row_Audits['SeqNo'];
    }

    $column_seqid = $SeqID;
    $column_headerid  = $row_Audits['SeqHeader'];

    if($row_Audits['SeqNo'] =="1306")
    {
        $Seq = $row_Audits['SeqText'] . " " . $row_Audits['WaterHot'];
    }elseif($row_Audits['SeqNo'] =="1307")
    {
        $Seq = $row_Audits['SeqText'] . " " . $row_Audits['WaterCold'];
    } else {
        $Seq = $row_Audits['SeqText'];
    }

    $column_seq = $Seq;


    if($row_Audits['Status'] == "")
{
        $Status = "Pass";
    }elseif($row_Audits['Status'] == "1")
{
        $Status = "Fail";
    }elseif($row_Audits['RepairCode'] == "4") 
{
        $Status = "Repaired";
    }elseif($row_Audits['Status'] == "3") 
{
        $Status = "Fixed";
    }elseif($row_Audits['Status'] === "") 
{
        $Status = "Required";
    }

    $column_status = $Status;

    $pdf->SetFont('Arial','',8);
    $pdf->SetY($y_axis);
    $pdf->SetX(10);
    $pdf->Cell(13,6,$column_seqid,1);
    $pdf->SetX(23);
    $pdf->Cell(127,6,$column_headerid,1,'L');
    $pdf->SetX(150);
    $pdf->Cell(105,6,$column_seq,1,'L');
    $pdf->SetX(255);
    $pdf->Cell(25,6,$column_status,1,'L');

    $y_axis = $y_axis + $row_height;
    $i = $i + 1;
}
//*******************************************************************
// Up to this point the output is corrent in it's format. I then need to display the data concerning any comments.
// But when the PDF is displayed the comments data will not break at the botton of the page

if($totalRows_Comments > 0)
{
$column_comments = "";
$column_seq_comments = "";

while ($row_Comments = mysql_fetch_assoc($Comments)) {
    $SeqComments  = substr($row_Comments['SeqID'], 5);
    $CommentsText  = $row_Comments['Comments'];

$column_seq_comments    = $column_seq_comments.$SeqComments."\n";
    $column_comments = $column_comments.$CommentsText."\n";
}


//Create lines (boxes) for each ROW (Product)
//If you don't use the following code, you don't create the lines separating each row


$pdf->SetFont('Arial','B',10);
$newY = $pdf->GetY();
$y_axis = $newY + 28;

$pdf->Ln(10);
$pdf->SetFont('Arial','',8);
$pdf->SetY($y_axis - 10);
$pdf->SetX(10);
$pdf->Cell(64,6,'Auditors comments',0,0,'L',0);

$pdf->SetY($y_axis);
$pdf->SetX(10);
$pdf->MultiCell(10,6,$column_seq_comments,1);
$pdf->SetY($y_axis);
$pdf->SetX(20);
$pdf->MultiCell(260,6,$column_comments,1);


while ($i < $totalRows_Comments)
{
$pdf->SetX(10);
$pdf->MultiCell(194,6,'',1);
$i = $i +1;
}
}

$pdf->Ln();

$newY = $pdf->GetY();
$y_axis = $newY + 5;

$pdf->SetFont('Arial','B',10);
$pdf->SetX(10);
$pdf->MultiCell(81,6,'Engineers comments:',0);
$newY = $pdf->GetY();
$y_axis = $newY + 5;
$pdf->SetY($y_axis);
$pdf->SetX(10);
$pdf->MultiCell(81,6,'Engineer:....................................',0);
$newY = $pdf->GetY();
$y_axis = $newY + 5;
$pdf->SetY($y_axis);
$pdf->SetX(10);
$pdf->Cell(81,6,'Repair date:....................................',0);

$pdf->Output();

Any help on this would be great and I thank you for your time in advance.

ADDITIONAL CODE

if($totalRows_Comments > 0) {

$column_comments = "";
$column_seq_comments = "";

$max_comments_per_page_ = 25;

$pdf->SetFont('Arial','B',10);
$newY = $pdf->GetY();


$pdf->Ln(10);
$pdf->SetFont('Arial','',8);
$pdf->SetY($newY + 10);
$pdf->SetX(10);
$pdf->Cell(64,6,'Auditors comments',0,0,'L',0);

while ($row_Comments = mysql_fetch_assoc($Comments)) {


if ($j == $max_comments_per_page) {
    $j = 1;
    $pdf->AddPage('L');
    $pdf->Ln(10);
    $pdf->SetFont('Arial','',8);
    $pdf->SetY(50);
    $pdf->SetX(10);
    $pdf->Cell(64,6,'Auditors comments',0,0,'L',0);


}

$SeqID = preg_replace("/[^0-9,.]/", "", $row_Comments['SeqID']);

if(strlen($SeqID) <4) {
    $SeqComments        = "0".$SeqID;
} else {
        $SeqComments        = $SeqID;
}
$CommentsText           = $row_Comments['Comments']; 

$column_seq_comments    = $column_seq_comments.$SeqComments."\n";
$column_comments        = $column_comments.$CommentsText."\n";

//$pdf->SetY($y_axis);
$pdf->SetX(10);
$pdf->MultiCell(10,6,$column_seq_comments,1);
//$pdf->SetY($y_axis);
$pdf->SetX(20);
$pdf->MultiCell(260,6,$column_comments,1);

$j++;
}

enter image description here

}

ADDITIONAL CODE

The $_row_comments array contains. Example:

Array ( [UniqueID] => NXLHR01071474538755 [SeqID] => SeqID110 [Comments] => Chipped - Scratched - Stained - Needs Paint ) Array ( [UniqueID] => NXLHR01071474538755 [SeqID] => SeqID203 [Comments] => Room Door Handle/Strike plate - Not Secure/Not Working Security Door Chain - Not Working Room Door Dead Lock - Not operating Correctly ) Array ( [UniqueID] => NXLHR01071474538755 [SeqID] => SeqID304 [Comments] => Unit - Noisy - Not Working ) Array ( [UniqueID] => NXLHR01071474538755 [SeqID] => SeqID404 [Comments] => Door Hinges - Squeaks/Sticks - Requires Oil/Repair ) Array ( [UniqueID] => NXLHR01071474538755 [SeqID] => SeqID502 [Comments] => Door Handle/Strike plate - Not secure/Not Working ) Array ( [UniqueID] => NXLHR01071474538755 [SeqID] => SeqID1411 [Comments] => Taps - Not Secure/Leaking - Repair Pop Up Stoppers or Plug - Requires Adjustment Cloths Line - Damaged/Broken - Repair Bath Panel - Damaged - Repair Poor Cracked Grouting/Sealant/Silicon/Strip - Repair Shower head - Aerator de-Scaled ) Array ( [UniqueID] => NXLHR01071474538755 [SeqID] => SeqID1305 [Comments] => Stained / Discoloured / Limescale Visible/ Tarnished - Repair )

like image 782
DCJones Avatar asked Oct 19 '22 02:10

DCJones


2 Answers

To Enables or disables the automatic page breaking mode we can use SetAutoPageBreak() method.

SetAutoPageBreak(boolean auto [, float margin])

Here the second parameter is the distance from the bottom of the page that defines the triggering limit. By default, the mode is on and the margin is 2 cm.

You have set $pdf->SetAutoPageBreak(false); So you can not get Page break in your page.

Please remove this line from the script and you will get line break;

Please check more information here

http://www.fpdf.org/en/doc/

Edit

Please try below code for comment section

require('fpdf.php');
ini_set('display_errors',1);
$pdf = new FPDF();
$pdf->AddPage('L');
$y_axis_initial = 40;
//initialize counter
$i = 0;
//Set maximum rows per page
$max = 25;
$y_axis = 40;
//Set Row Height
$row_height = 6;
$y_axis = $y_axis + $row_height;
$column_seqid = "";
$column_headerid = "";
$column_seq = "";
$column_status = "";

$Comments = array(
     Array ( 'UniqueID' => ' NXLHR01071474538755 ', 'SeqID' => ' SeqID110', 'Comments' => ' Chipped - Scratched - Stained - Needs Paint' ),
     Array ( 'UniqueID' => ' NXLHR01071474538755 ', 'SeqID' => ' SeqID203', 'Comments' => ' Room Door Handle/Strike plate - Not Secure/Not Working Security Door Chain - Not Working Room Door Dead Lock - Not operating Correctly' ),
     Array ( 'UniqueID' => ' NXLHR01071474538755 ', 'SeqID' => ' SeqID304', 'Comments' => ' Unit - Noisy - Not Working' ), 
     Array ( 'UniqueID' => ' NXLHR01071474538755 ', 'SeqID' => ' SeqID404', 'Comments' => ' Door Hinges - Squeaks/Sticks - Requires Oil/Repair' ),
     Array ( 'UniqueID' => ' NXLHR01071474538755 ', 'SeqID' => ' SeqID502', 'Comments' => ' Door Handle/Strike plate - Not secure/Not Working' ),
     Array ( 'UniqueID' => ' NXLHR01071474538755 ', 'SeqID' => ' SeqID1411', 'Comments' => ' Taps - Not Secure/Leaking - Repair Pop Up Stoppers or Plug - Requires Adjustment Cloths Line - Damaged/Broken - Repair Bath Panel - Damaged - Repair Poor Cracked Grouting/Sealant/Silicon/Strip - Repair Shower head - Aerator de-Scaled' ),   
     //Please uncomment this line to check multiple pages
     Array ( 'UniqueID' => ' NXLHR01071474538755 ', 'SeqID' => ' SeqID1305', 'Comments' => ' Stained / Discoloured / Limescale Visible/ Tarnished - RepairTaps - Not Secure/Leaking - Repair Pop Up Stoppers or Plug - Requires Adjustment Cloths Line - Damaged/Broken - Repair Bath Panel - Damaged - Repair Poor Cracked Grouting/Sealant/Silicon/Strip - Repair Shower head - Aerator de-ScaledTaps - Not Secure/Leaking - Repair Pop Up Stoppers or Plug - Requires Adjustment Cloths Line - Damaged/Broken - Repair Bath Panel - Damaged - Repair Poor Cracked Grouting/Sealant/Silicon/Strip - Repair Shower head - Aerator de-ScaledTaps - Not Secure/Leaking - Repair Pop Up Stoppers or Plug - Requires Adjustment Cloths Line - Damaged/Broken - Repair Bath Panel - Damaged - Repair Poor Cracked Grouting/Sealant/Silicon/Strip - Repair Shower head - Aerator de-ScaledTaps - Not Secure/Leaking - Repair Pop Up Stoppers or Plug - Requires Adjustment Cloths Line - Damaged/Broken - Repair Bath Panel - Damaged - Repair Poor Cracked Grouting/Sealant/Silicon/Strip - Repair Shower head - Aerator de-Scaled' ),   
     Array ( 'UniqueID' => ' NXLHR01071474538755 ', 'SeqID' => ' SeqID1305', 'Comments' => ' Stained / Discoloured / Limescale Visible/ Tarnished - Repair' )
    );
$totalRows_Comments = count($Comments);

if($totalRows_Comments > 0)
{
    $column_comments = "";
    $column_seq_comments = "";
    $pdf->SetFont('Arial','B',10);
    $newY = $pdf->GetY();
    $y_axis = $newY + 28;

    $pdf->Ln(10);   
    $pdf->SetY($y_axis - 10);
    $pdf->SetX(10);
    $pdf->Cell(64,6,'Auditors comments',0,0,'L',0);
    $pdf->SetFont('Arial','',8);
    $pdf->Line(10,$y_axis-1,280,$y_axis-1);

    //Loop all comments
    foreach( $Comments as $row_Comments) {
        $SeqComments  = substr(trim($row_Comments['SeqID']), 5);
        $CommentsText  = trim($row_Comments['Comments']);
        $column_seq_comments    = $SeqComments."\n";
        $column_comments = $CommentsText."\n";
        $comment_length = strlen($column_comments);
        $length = ceil($comment_length/260);

        if ( $h = $pdf->GetPageHeight() ) {         

            //Check for comment length is not large than available space in page
            if ( $y_axis > floor($h) || ( $h - $y_axis ) < ceil($comment_length / 260 * 8 + 16) ) {

                //Add new page
                $pdf->AddPage('L');

                //Reset Y position
                $y_axis = 40;

                //Add line on comment startup
                $pdf->Line(10,$y_axis,280,$y_axis);
            }
        }

        //Add SeqID
        $pdf->SetY($y_axis);
        $pdf->SetX(10);                     
        $pdf->MultiCell(10,6,$column_seq_comments);     

        //Add Comment
        $pdf->SetY($y_axis);
        $pdf->SetX(20);     
        $pdf->MultiCell(260,6,$column_comments);        

        //Change y value for multiline comments
        if($comment_length > 200) {                     
            $y_axis += 8 * $length - 2;
            $line_height = $y_axis;
        }       

        //Default height        
        $y_axis += 8;

        //Draw line after comment 
        $pdf->Line(10,$y_axis-1,280,$y_axis-1);

    }


    //The  below code will produce blank box in your page if don't want than delete below code

    //Check page height for blank comment box
    if ( ($h - $y_axis) < $totalRows_Comments * 10 ) {
        $pdf->AddPage('L');     
        $y_axis = 40;
        $pdf->SetY($y_axis);
    } else {
        $pdf->Ln(10);       
    }   

    //Create lines (boxes) for each ROW (Product)   
    while ($i < $totalRows_Comments)
    {
        $pdf->SetX(10);
        $pdf->MultiCell(270,6,'',1);
        $i = $i +1;
    }

    //Blank box ended
}

$newY = $pdf->GetY();
$y_axis = $newY + 5;

//Check page height for blank comment box
if ( ($h - $y_axis) < 40 ) {
    $pdf->AddPage('L');     
    $y_axis = 40;
    $pdf->SetY($y_axis);
} else {
    $pdf->Ln(10);       
}

$pdf->SetFont('Arial','B',10);
$pdf->SetX(10);
$pdf->MultiCell(81,6,'Engineers comments:',0);
$newY = $pdf->GetY();
$y_axis = $newY + 5;
$pdf->SetY($y_axis);
$pdf->SetX(10);
$pdf->MultiCell(81,6,'Engineer:....................................',0);
$newY = $pdf->GetY();
$y_axis = $newY + 5;
$pdf->SetY($y_axis);
$pdf->SetX(10);
$pdf->Cell(81,6,'Repair date:....................................',0);


$pdf->Output();

Output enter image description here

Note: If don't want blank boxes than delete code from script.

like image 92
Shailesh Chauhan Avatar answered Nov 03 '22 03:11

Shailesh Chauhan


First of all, your data is faulty, so I have corrected your data and solved your problem (See result):

<?php
require('./fpdf.php');

$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Auditors comments');

$row_Comments = [Array ( "UniqueID" => "NXLHR01071474538755", "SeqID" => "SeqID110", "Comments" => ["Chipped", "Scratched", "Stained", "Needs Paint"]),
                Array ( "UniqueID" => "NXLHR01071474538755", "SeqID" => "SeqID203", "Comments" => ["Room Door Handle/Strike plate", "Not Secure/Not Working Security Door Chain", "Not Working Room Door Dead Lock", "Not operating Correctly"] ),
                Array ( "UniqueID" => "NXLHR01071474538755", "SeqID" => "SeqID304", "Comments" => ["Unit", "Noisy", "Not Working"] ),
                Array ( "UniqueID" => "NXLHR01071474538755", "SeqID" => "SeqID404", "Comments" => ["Door Hinges", "Squeaks/Sticks", "Requires Oil/Repair"] ),
                Array ( "UniqueID" => "NXLHR01071474538755", "SeqID" => "SeqID502", "Comments" => ["Door Handle/Strike plate", "Not secure/Not Working"] ),
                Array ( "UniqueID" => "NXLHR01071474538755", "SeqID" => "SeqID1411", "Comments" => ["Taps", "Not Secure/Leaking", "Repair Pop Up Stoppers or Plug", "Requires Adjustment Cloths Line", "Damaged/Broken", "Repair Bath Panel", "Damaged", "Repair Poor Cracked Grouting/Sealant/Silicon/Strip", "Repair Shower head", "Aerator de-Scaled"] ),
                Array ( "UniqueID" => "NXLHR01071474538755", "SeqID" => "SeqID1305", "Comments" => ["Stained / Discoloured / Limescale Visible/ Tarnished", "Repair"] )];

$max_comments_per_page = 10;

$pdf->SetFont('Arial','',8);

//echo $row_Comments[0]["Comments"];
$j = 1;
foreach($row_Comments as $row_Comment) {
  foreach($row_Comment["Comments"] as $comment) {

    //echo $j;
    if ($j >= $max_comments_per_page) {
        $j = 1;
        $pdf->AddPage();
        $pdf->Ln(10);
        $pdf->SetFont('Arial','B',16);
        $pdf->Cell(40,10,'Auditors comments');
        $pdf->SetFont('Arial','',8);

    }

    $pdf->Ln(10);
    $pdf->Cell(40,10,$comment);
    $j++;

  }
}

$pdf->Output();
?>

You need to use nested loops because your data is nested. Instead of using a while loop you should use nested foreach loops. At first, variable names were confusing but later, I have understand what you are trying to achieve.

Control flow for preventing certain number of comments per page was mostly correct. But there was a typo for declaring and initiating $max_comments_per_page_ = 25; which must be $max_comments_per_page = 25;

I have changed some numbers like from $max_comments_per_page = 25; to $max_comments_per_page = 10; because it was hard to see the correlation. And I have removed the table design(MultiCell), because it was off-topic to this question. So the table design is up to you now.

Eventually, FPDF's basic(aka forced) page break functionality was actually working. The problem was your data and your choice of the loops.

like image 24
mertyildiran Avatar answered Nov 03 '22 03:11

mertyildiran