10

PHPとFPDFを使用して、アイテムのリストを含むPDFを生成しています。私の問題は、アイテムリストが2ページ目または3ページ目にある場合、アイテム名、数量、説明を一緒に保持したいということです。現在、2ページ目に移動しますが、特定のアイテムのすべての詳細が分割される場合があります。助けてください!

<?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()を使用して自動ページ分割をオフにする必要があります。

もう1つのメソッドは、AcceptPageBreak()メソッドをオーバーライドすることです。このメソッドは、ページ分割が追加されるときに自動的に呼び出されます。現在のページに別の行を絞り込みたい場合はFALSEを返したいので、現在印刷している詳細を追跡する必要があります。

于 2010-03-12T02:05:43.710 に答える
-2

「page-break-inside」プロパティはどうですか?私はそれをテーブルの中で試しました、そしてそれは助けになります。

「page-break-inside」インラインcssプロパティを行にハードコーディングしましたが、この行が印刷ページに送信されたときに、2ページにまたがって分割されなくなりました。完全に新しいページにプッシュされるか、前のページに残されました。おそらくそれは動的な修正ではありませんが(fPDF側から)、それでも問題は解決します。

于 2014-12-29T07:19:45.003 に答える