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)
看来你有几个选择。
您可以在循环时跟踪您在页面上的位置,并在空间不足时发出自己的分页符。这需要您使用 SetAutoPageBreak() 来关闭自动分页符。
另一种方法是重写 AcceptPageBreak() 方法。添加分页符时会自动调用该方法。如果您想将另一行挤到当前页面上,则需要返回 FALSE,因此您必须跟踪当前正在打印的详细信息。