Page break with fpdf php

Asked

Viewed 1,211 times

0

I am generating a report with fpdf using php. I read a csv file and print 3 columns. For each column, I created a loop that prints the data. That way I have a loop for each column. When I use $pdf->SetAutoPageBreak my code prints a column on each page. This occurs when the ulpras column passes the page limit. I have already tried to disable the $pdf->SetAutoPageBreak using false, but then prints beyond the margin. Someone can give me a help?

 <?php
session_start();
require_once('tcpdf/tcpdf.php');
require_once ('fpdf/fpdf.php');
require('Header.php');
require('PageBreak.php');



//print($csvFile);
$fileName= '/Applications/XAMPP/xamppfiles/htdocs/CreateReport/CLINICAL PLACEMENT REQUEST SURVEY  - Individual Attempts (2).csv';

ob_start();

function readCsv($fileName){
    $handle = fopen($fileName, "r");
    $data=array();
    while ($col = fgetcsv($handle, 10000, ",")) {   
        $data[] = [ 
            'Section' => $col[0],   
            'Q #' => $col [1],
            'Q Type' => $col[2],
            'Q Title' => $col[3],
            'Q Text' => $col[4],
            'Bonus' => $col [5],
            'Difficulty' => $col[6],
            'Answer' => $col[7],
            'Answer Match' => $col[8],
            'Responses'=> $col[9], 
        ];       
    }
    fclose($handle);


    return $data;
}

ob_end_flush();



function countLines($arr, $startLine){ //count blank lines btw sections   
$count=0;
$length= count($arr);

for($r=$startLine; $r<=$length; $r++){
        if((empty($arr[$r]['Section']))){
            $count+=1;
        }else{
            break;
        }
    }

    return $count;
}




function cmp($a, $b) { 
  //  return $a['Answer Match'] > $b['Answer Match'] ; 
   return  strcmp($a['Answer Match'], $b['Answer Match']) ;

}


function countNumberOfElements( $column){
    $arrData= Array();
    $arrData= readCsv('/Applications/XAMPP/xamppfiles/htdocs/CreateReport/CLINICAL PLACEMENT REQUEST SURVEY  - Individual Attempts (2).csv');
    $count=0;
    $length=count($arrData);
    for ($k=1; $k < $length; $k++) {
        if(!empty($arrData[$k][$column])){
            $count++;
        }   
    }
    return $count;
}


$page=

 "<html>

    <body>



    <h1> hello </h1>   
<br>   
    </body>   
</html>

    ";




// Converts file to pdf

function printPDF($page, $arrCVS)
{ 

    $marginLeft=25;
    $marginRight=25;
    $marginTop=30;

    $pdf = new PDF();

    $pdf->AliasNbPages();
    $pdf->AddPage('L');

    $pdf->SetMargins($marginLeft, $marginTop,  $marginRight, true);

    $fileOutput= "Report.pdf";
   $pdf->SetAutoPageBreak(true,$marginTop );



    $pdf->SetFont('helvetica','',  10);
    $lineX=12; //space btw answers
    $lineY=5;
    $lenght=count($arrCVS); //array lenght

 for ($k=2; $k < $lenght; $k++) {

     if ($arrCVS[$k]['Answer']=="Health Science 5 (HSC)"){
         $arrCVS[$k]['Answer']="HSC";
     }else if ($arrCVS[$k]['Answer']=="St. Boniface (STB)"){
                 $arrCVS[$k]['Answer']="STB";
             } else 
                 if ($arrCVS[$k]['Answer']=="Grays Hospital (GRH)"){
                     $arrCVS[$k]['Answer']="GRH";
                 } else 
                     if ($arrCVS[$k]['Answer']=="Concordia (CON)"){
                         $arrCVS[$k]['Answer']="CON";
                    } 
                 else 
                     if ($arrCVS[$k]['Answer']=="Seven Oaks (SEO)"){
                         $arrCVS[$k]['Answer']="SEO";
                     }
                     else 
                         if ($arrCVS[$k]['Answer']=="Health Science 3 (HSA)"){
                             $arrCVS[$k]['Answer']="HSA";
                         }
                         else 
                             if ($arrCVS[$k]['Answer']=="Health Science 4 (HSB)"){
                                 $arrCVS[$k]['Answer']="HSB";
                             }          

            }

for ($x=2; $x < $lenght; $x++) {

    switch ($arrCVS[$x]['Answer']) {
        case "Personal (PE)":
        $arrCVS[$x]['Answer']=" PE ";
        break;

        case "Bison athlete (BA)":
            $arrCVS[$x]['Answer']=" BA  ";
            break;

        case "Work in Facility (WF)":
            $arrCVS[$x]['Answer']=" WF ";
            break;

        case "Live out of town (LT)":
            $arrCVS[$x]['Answer']=" LT ";
            break;
    }
}




//Display student name
$positionXname=$marginLeft;
$positionYname=$marginTop + ($marginTop*0.5);


$pdf->SetXY($positionXname, $positionYname);
$countStudents=0;

$countLines=0;

unset($arrCVS[0]); //skip line 1, header


for ($s=0; $s < $lenght; $s++) {
    if(!empty($arrCVS[$s]['Section']) OR $arrCVS[$s]['Section'] =! "Section #" ){
        $pdf->SetX($positionXname);
        $countStudents++;
        $countLines++;
        $pdf->Cell($lineX-5,$lineY,$countStudents,0,0,'L');
        $pdf->Cell($lineX,$lineY,$arrCVS[$s]['Section'],0,1,'L');

    }

    if($countLines>24){
     //    $pdf->AddPage('L');
        $positionXname=25;
        $positionYname=30;
        $countLines=0;
    }

}






$lineXSites=12; //space btw answers
$lineYSites=5;
$marginLeftSites=25;
$marginRight=25;
$marginTopSites=30;

//Sites ranking
$positionXsites=$marginLeftSites + ($marginLeftSites*2);
$positionYsites=$marginTopSites + ($marginTopSites*0.5);
$positionXname=25;
$positionYname=30;

$pdf->SetXY($positionXsites, $positionYsites);
$lenght=count($arrCVS);
$numberOfStudents= countNumberOfElements('Section'); //ok
$startPoint=2;//2;

$perRowSites = 1;
for($student=0; $student< $numberOfStudents; $student++){
    $arr_Rank=(array_slice($arrCVS,  $startPoint,47)); //new array
    usort($arr_Rank, 'cmp');
    //Print 1 student
    for ($j=2; $j <47; $j++) {



        if(($arr_Rank[$j]['Q Type'])=="MAT" AND ($arr_Rank[$j]['Responses'])==1){
            $pdf->Cell($lineXSites,$lineYSites,$arr_Rank[$j]['Answer'],0,0,'L');
            $perRowSites++;

        }


        if(($perRowSites>6) OR ($arr_Rank[$j]['Answer Match'])=="UnChecked"){   //print 6 sites per row
            $pdf->Ln();
            $perRowSites=1;

            $pdf->SetX($positionXsites);
            break;

        }

    }
    $startPoint=$startPoint+47;

}//end $students


$lineXCon=12; //space btw answers
$lineYCon=5;
$marginLeft=25;
$marginRight=25;
$marginTop=30;


//Special considerations
$positionXcon=$marginLeft + ($marginLeft*6);
$positionYcon=$marginTop + ($marginTop*0.5);
$pdf->SetXY($positionXcon, $positionYcon);


unset($arrCVS[0]); //skip line 1, header
$perRow = 1;
$countLines=0;

for ($l=0; $l < $lenght; $l++) {



    if (($arrCVS[$l]['Answer Match'])=="UnChecked") {
        $perRow++;



        if(($arrCVS[$l]['Responses'])==1){
        $pdf->Cell($lineXCon,$lineYCon,$arrCVS[$l]['Answer'],0,0,'L'); 

        }

        if($perRow>4 ){
            $pdf->Ln();
            $perRow=1;
            $pdf->SetX($positionXcon);

        }



    }

} 

$pdf->Output('reports/'.$fileOutput, 'F');
}





printPDF($page,readCsv($fileName) );
session_destroy();

?>

My header.php class

<?php


   require_once ('fpdf/fpdf.php');

class PDF extends FPDF
{


    // Page header
    function Header()
{
    if ($this->page == 1)
    {
    $marginLeft=25;
    $marginRight=25;
    $marginTop=30;
    $this->SetFont('helvetica','B',12);
    $this->SetY(15);
    $this->Cell(0,25,'SITES RANKING REPORT',0,0,'C');
    $this->Ln(10);
    $this->SetXY(25, 30);
    $this->Cell(50,15,'STUDENT',0,0,'L',0);
    $this->Cell(65,15,'SITES',0,0,'C',0);
    $this->Cell(130,15,'CONSIDERATIONS',0,0,'C',0);
    $this->line($marginLeft, 45, 300- $marginRight, 45); // 25mm from each edge
    $this->Ln(20);
    $this->SetFont('helvetica','', 9);
    $this->SetXY($marginLeft+($marginLeft*0.25), $marginTop + ($marginTop*0.25));
    $this->Cell(150,10,'   1          2            3            4            5           6',0,0,'C',0);
    $this->SetXY($marginLeft+($marginLeft*5), $marginTop + ($marginTop*0.25));
    $this->Cell(120,10,'LT=Live out of town  WF=Work in facility  BA=Bison athlete  PE=Personal',0,0,'C',0);
    // Line break
    $this->Ln(20);
    }
}

// Page footer
function Footer()
{
    $marginLeft=25;
    $marginRight=25;
    $marginTop=30;
    $this->SetY(-15);
    $this->line($marginLeft,  215-$marginTop, 300- $marginRight,  215-$marginTop); // 30mm from each top bottom
    $this->SetFont('helvetica','', 9);
    $this->SetXY($marginLeft*3, 215-$marginTop);
    $this->Cell(150,10,'HSC=Health Science 5  STB=St. Boniface  CON=Concordia GRH=Grays Hospital  SEO=Seven Oaks  HSA=Health Science 3  HSB=Health Science 4',0,0,'C',0);
    $this->SetFont('helvetica','I',8);
    // Page number
    $this->Cell(0,25,'Page '.$this->PageNo().'/{nb}',0,0,'C');
}



var $col = 0;

function SetCol($col)
{
    // Mudar de coluna
    $this->col = $col;
    $x = 10+$col*65;
    $this->SetLeftMargin($x);
    $this->SetX($x);
}

    function AcceptPageBreak()
    {
        //esquema de 3 colunas
        if($this->col<2)
        {
            // Avança para a próxima coluna
            $this->SetCol($this->col+1);
            $this->SetY(10);
            return false; //Não quebra a página
        }
        else
        {
            // Volta para a primeira coluna e quebra a página
            $this->SetCol(0);
            return true;
        }
    }
}

$pdf = new PDF(); //usa a sua implementação específica
$pdf->AddPage();
$pdf->SetFont('Arial','',12);
for($i=1;$i<=300;$i++)
    $pdf->Cell(0,5,"Line $i",0,1);
    $pdf->Output();


$pdf->AliasNbPages();

1 answer

0


You’ll have to extend the FPDF class

The method Acceptpagebreak() will be called whenever a page break is needed, if you are in the last column you will have to jump to next page otherwise jump to next column and return false.

Source: http://www.fpdf.org/en/doc/acceptpagebreak.htm

class PDF extends FPDF
{
var $col = 0;

function SetCol($col)
{
    // Mudar de coluna
    $this->col = $col;
    $x = 10+$col*65;
    $this->SetLeftMargin($x);
    $this->SetX($x);
}

function AcceptPageBreak()
{
    //esquema de 3 colunas
    if($this->col<2)
    {
        // Avança para a próxima coluna
        $this->SetCol($this->col+1);
        $this->SetY(10);
        return false; //Não quebra a página
    }
    else
    {
        // Volta para a primeira coluna e quebra a página
        $this->SetCol(0);
        return true;
    }
}
}

$pdf = new PDF(); //usa a sua implementação específica
$pdf->AddPage();
$pdf->SetFont('Arial','',12);
for($i=1;$i<=300;$i++)
$pdf->Cell(0,5,"Line $i",0,1);
$pdf->Output();
  • _Jorge Costa : do I have to call the $pdf->Setautopagebreak as true in my main class? What if I use this code within my Header.php class will it work? My Header class extends FPDF. I added this code to my Header.php class and it didn’t work. It didn’t make any changes to my pdf file.

  • _Jorge Costa: I put true in the $pdf->Setautopagebreak and now the third column that marks the page and goes to the second page. In the first and second pages. column now appear at the top of the same page.

  • Publish your code to evaluate

  • _Jorge Costa updated my question with the code of my program.

  • $pdf->Setautopagebreak(true,$marginTop ); is that set wrong the page limit, if you do not put anything will have a default margin of 2 cm

  • $marginTop is 30. I tried using 30, but it did not solve.

  • remove Setautopagebreak and test, but did not realize the result can put a screenshot

  • I commented on Setautopagebreak , and it made no difference. I put the screenshot in the question.

  • Okay, I’ve entered the chat

  • _Jorge Costa, the problem was in the Lopp that printed the columns. I created functions and acted. Thanks!

  • Congratulations on getting

Show 7 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.