简体   繁体   中英

MySQL / FPDF: How to limit the data by each page in PDF

I currently create a system that can generate a report from MySQL to PDF. I uses FPDF library. Now I want to display the data by a limit in on each page. For example, If I have 100 rows of data, I want to display like this:

1) First PDF Page will only display 8 data 2) And the other pages will display 10 data

Can Anyone help me?

  <?php

  require('mem_image.php');
  require_once "../../config/config.php";
  require_once "../../config/check.php";

  $email = $_SESSION['login_user'];
  $team = $_SESSION['team'];

  $pdf = new PDF_MemImage();
  $pdf->AddPage();

  $pdf->Cell(10,7,'',0,1);

  $pdf->SetFont('Arial','B',12);
  $pdf->Cell(0,10,'Project Team Overtime Report',1,1,"C");

  $pdf->SetFont('Arial','',10);
  $pdf->Cell(20,10,'Team:',1,0);

  $pdf->SetFont('Arial','B',11);
  $user2 = mysqli_query($conn, "SELECT * FROM users WHERE email = '$email'");
  while ($row = mysqli_fetch_array($user2)){
    $pdf->Cell(170,10,$row['fullname'],1,1); 
  }

  $pdf->SetFont('Arial','',10);
  $pdf->Cell(0,10,'Workers Name:',1,1,"C");
  $pdf->SetFont('Arial','B',10);
  $pdf->Cell(20,7,'Badge ID',1,0);
  $pdf->Cell(170,7,'Fullname',1,1);

  $pdf->SetFont('Arial','',10);
  $user = mysqli_query($conn, "SELECT * FROM users INNER JOIN team on users.team_id = team.team_id WHERE users.team_id = '$team' AND (users.roles_id = 3 OR users.roles_id = 4)");
    while ($row = mysqli_fetch_array($user)){
        $pdf->Cell(20,7,$row['badgeid'],1,0);
        $pdf->Cell(170,7,$row['fullname'],1,1); 
    }

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

  $user3 = mysqli_query($conn, "SELECT * FROM report LEFT JOIN users ON report.badgeid = users.badgeid LEFT JOIN team ON team.team_id = users.team_id 
  WHERE team.team_id = '$team' AND report_date BETWEEN '".$_GET["from"]."' AND '".$_GET["to"]."' ORDER BY report.report_date DESC");

      while ($row = mysqli_fetch_array($user3)){
          $pdf->Cell(20,7,'Date:',1,0);
          $pdf->Cell(75,7,date('d-m-Y',strtotime($row['report_date'])),1,0);
          $pdf->Cell(20,7,'Time:',1,0);
          $pdf->Cell(38,7,"From: ".date('H:i',strtotime($row['ot_start'])),1,0);
          $pdf->Cell(37,7,"To: ".date('H:i',strtotime($row['ot_end'])),1,1); 
          $pdf->Cell(95,7,'Before',1,0,'C');
          $pdf->Cell(95,7,'After',1,1, 'C');


          $logo = file_get_contents('../../images/faces/noimage.png');
          // Output it

          if(!isset($row['photo_before']) || empty($row['photo_before'])) {
            $pdf->Cell(95, 50, $pdf->MemImage($logo, $pdf->GetX()+25, $pdf->GetY()+2, 45,45,), 1, 0, 'C');
          }else{ 
            $pdf->Cell(95, 50, $pdf->MemImage(base64_decode($row['photo_before']), $pdf->GetX()+2, $pdf->GetY()+2, 90,45,), 1, 0, 'C');
          }

          if(!isset($row['photo_after']) || empty($row['photo_after'])) {
            $pdf->Cell(95, 50, $pdf->MemImage($logo, $pdf->GetX()+25, $pdf->GetY()+2, 45,45,), 1, 1, 'C');
          }else{ 
            $pdf->Cell(95, 50, $pdf->MemImage(base64_decode($row['photo_after']), $pdf->GetX()+2, $pdf->GetY()+2, 90,45,), 1, 1, 'C');
          }


          if ($row['time_photo_before'] == '0000-00-00 00:00:00'){
            $pdf->Cell(95,7,'-',1,1, 'C');
          }else{
            $pdf->Cell(95,7,$row['time_photo_before'],1,0, 'C');
          }

          if ($row['time_photo_after'] == '0000-00-00 00:00:00'){
            $pdf->Cell(95,7,'-',1,1, 'C');
          }else{
            $pdf->Cell(95,7,$row['time_photo_after'],1,1, 'C');
          }

          $pdf->SetFillColor(216,214,214);
          $pdf->Cell(0,5,'',1,1,"C", true);
      }

  $pdf->Output();
  ?>

You need to use a counter in the while loop, so it works like this:

$count = 0;
while ($row = mysqli_fetch_array($user3)){
    /* put your row rendering code here */
    /* ... */

    if ((($count - 8) % 10) === 0) {
        $pdf->AddPage();
        /* put any page headers or footers here */
    }
    $count++;
}

This way you will have a new page after 8, 18, 28 rows and so on.

I think you have some data (like header) that needs to be repeated on every page (full name, badge ID) - is that right? Please remember you need to render that header again every time you add a new page. Ideally you would extract the page header code into a separate function.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM