FPDF分页问题

Mic*_*ael 10 pdf page-break fpdf while-loop

我正在使用PHP和FPDF生成带有项目列表的PDF.我的问题是如果项目列表进入第二或第三页,我想将项目名称,数量和描述保持在一起.现在,它将转到第二页,但它可能会分割特定项目的所有细节.请帮忙!

<?php
require_once('auth.php');      
require_once('config.php');   
require_once('connect.php');  

$sqlitems="SELECT * FROM $tbl_items WHERE username = '" . $_SESSION['SESS_LOGIN'] . "'";
$resultitems=mysql_query($sqlitems);

require_once('pdf/fpdf.php');
require_once('pdf/fpdi.php');


$pdf =& new FPDI();
$pdf->AddPage('P', 'Letter');    
$pdf->setSourceFile('pdf/files/healthform/meds.pdf'); 
$tplIdx = $pdf->importPage(1);
$pdf->useTemplate($tplIdx);

$pdf->SetAutoPageBreak(on, 30);

$pdf->SetTextColor(0,0,0);
$pdf->Ln(10);

while($rowsitems=mysql_fetch_array($resultitems)){

$pdf->SetFont('Arial','B',10);
$pdf->Cell(50,4,'Item Name:',0,0,'L');
$pdf->SetFont('');
$pdf->Cell(100,4,$rowsitems['itemname'],0,0,'L');  

$pdf->SetFont('Arial','B',10);
$pdf->Cell(50,4,'Quantity:',0,0,'L');
$pdf->SetFont('');
$pdf->Cell(140,4,$rowsitems['itemqty'],0,1,'L');

$pdf->SetFont('Arial','B');
$pdf->Cell(50,4,'Description:',0,0,'L');
$pdf->SetFont('');
$pdf->Cell(140,4,$rowsitems['itemdesc'],0,1,'L');
}

$pdf->Output('Items.pdf', 'I');

?>
Run Code Online (Sandbox Code Playgroud)

Jos*_*ter 10

bmb是在正确的轨道上.这是一个更详细的解决方案.

有很多不同的方法可以做到这一点,但你必须根据你的需要做出一些决定.如果你的行可能占用了一半的页面,那么这可能不适合你,但如果你的行通常大约2-5行,那么这是一个很好的方法.

因为我的表中的第一个单元格是多行单元格(FPDF中的MultiCell说话),所以行的动态高度基于第一个单元格.所以我根据字符串的宽度和单元格的宽度计算出行的高度,然后根据当前的Y位置,页面高度和底部边距将其与页面左侧的房间进行比较:

while ($row = mysql_fetch_array($result)) {

  // multicell content
  $description = $row['desciption'];

  // get column width from a column widths array
  $column_width = $column_widths['description'];

  $number_of_lines = ceil( $pdf->GetStringWidth($description) / ($column_width - 1) );
  // I subtracted one from column width as a kind of cell padding

  // height of resulting cell
  $cell_height = 5 + 1; // I have my cells at a height of five so set to six for a padding
  $height_of_cell = ceil( $number_of_lines * $cell_height ); 

  // set page constants
  $page_height = 279.4; // mm (portrait letter)
  $bottom_margin = 20; // mm

  // mm until end of page (less bottom margin of 20mm)
  $space_left = $page_height - $pdf.GetY(); // space left on page
  $space_left -= $bottom_margin; // less the bottom margin

  // test if height of cell is greater than space left
  if ( $height_of_cell >= $space_left) {
     $pdf->Ln();                        

     $pdf->AddPage(); // page break.
     $pdf->Cell(100,5,'','B',2); // this creates a blank row for formatting reasons
  }

  // ...
  // actual creation of pdf stuff
  // ...

}
Run Code Online (Sandbox Code Playgroud)


bmb*_*bmb 5

看来你有几个选择。

您可以在循环时跟踪您在页面上的位置,并在空间不足时发出自己的分页符。这需要您使用 SetAutoPageBreak() 来关闭自动分页符。

另一种方法是重写 AcceptPageBreak() 方法。添加分页符时会自动调用该方法。如果您想将另一行挤到当前页面上,则需要返回 FALSE,因此您必须跟踪当前正在打印的详细信息。