10

我正在使用 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');

?>
4

3 回答 3

11

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
  // ...

}
于 2010-04-22T21:32:00.917 回答
4

看起来你有几个选择。

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

另一种方法是覆盖 AcceptPageBreak() 方法。添加分页符时会自动调用该方法。如果你想在当前页面上挤另一行,你会想返回 FALSE,所以你必须跟踪你当前正在打印的细节。

于 2010-03-12T02:05:43.710 回答
-2

那么“page-break-inside”属性呢?我在桌子里试了一下,很有帮助。

我将“page-break-inside”内联 css 属性硬编码到我的行,当它被发送到打印页面时,这一行不再中断,分布在两页上。它要么完全推送到新页面,要么留在上一页。也许它不是一个动态修复(从 fPDF 方面),但它仍然解决了这个问题。

于 2014-12-29T07:19:45.003 回答