2010-03-12 15 views
9

Ich verwende PHP und FPDF, um eine PDF mit einer Liste von Elementen zu generieren. Mein Problem ist, wenn die Artikelliste auf eine zweite oder dritte Seite geht, möchte ich den Artikelnamen, die Menge und die Beschreibung zusammenhalten. Im Moment wird es auf eine zweite Seite gehen, aber es kann alle Details für einen bestimmten Gegenstand aufteilen. Bitte helfen!FPDF Page Break Frage

<?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'); 

?> 

Antwort

10

bmb ist auf dem richtigen Weg. Hier ist eine etwas detailliertere Lösung.

Es gibt eine Reihe von verschiedenen Möglichkeiten, dies zu tun, aber Sie müssen einige Entscheidungen treffen, basierend auf was Sie wollen. Wenn Sie Zeilen haben, die die Hälfte der Seite einnehmen können, wird dies wahrscheinlich nicht die beste Lösung für Sie sein, aber wenn Ihre Zeilen normalerweise etwa 2 - 5 Zeilen lang sind, dann ist dies eine gute Methode.

Da meine erste Zelle in der Zeile eine Zelle mit mehreren Zeilen (MultiCell in FPDF speak) in meiner Tabelle ist, sind die Zeilen basierend auf dieser ersten Zelle von dynamischer Höhe. So finde ich heraus, wie hoch die Zeile basierend auf der Stringbreite und der Breite der Zelle sein wird, und vergleiche sie dann mit dem Raum auf der Seite, basierend auf der aktuellen Y-Position, der Seitenhöhe und dem unteren Rand:

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

} 
4

Es scheint, als ob Sie ein paar Optionen haben.

Sie können verfolgen, wo Sie sich auf der Seite befinden, während Sie Ihre Schleife durchlaufen, und Ihren eigenen Seitenumbruch ausgeben, wenn der Speicherplatz knapp wird. Dazu müssen Sie SetAutoPageBreak() verwenden, um automatische Seitenumbrüche zu deaktivieren.

Eine andere Methode besteht darin, die AcceptPageBreak() - Methode zu überschreiben. Diese Methode wird automatisch aufgerufen, wenn ein Seitenumbruch hinzugefügt wird. Sie möchten FALSE zurückgeben, wenn Sie eine weitere Zeile auf die aktuelle Seite drücken möchten. Sie müssen also verfolgen, welche Details Sie gerade drucken.

-2

Was ist mit der Eigenschaft "Seitenumbruch"? Ich habe es in einem Tisch probiert und es hilft.

Ich habe die "page-break-inside" Inline-CSS-Eigenschaft für meine Zeile festgeschrieben, und diese Zeile brach nicht mehr, wenn sie an Druckseiten gesendet wurde und sich über zwei Seiten erstreckte. Es wurde entweder komplett auf die neue Seite geschoben oder auf der vorherigen Seite verlassen. Vielleicht ist es keine dynamische Korrektur (von der fPDF-Seite der Dinge), aber es behebt das Problem immer noch.

+0

Dies bietet keine Antwort auf die Frage. Um zu kritisieren oder um Klarstellung von einem Autor, hinterlasse einen Kommentar unter ihrem Beitrag - Sie können immer Ihre eigenen Beiträge kommentieren, und sobald Sie genügend Ruf haben Sie in der Lage, jeden Beitrag zu kommentieren. – Ghost

+0

Tatsächlich hat es in meinem Fall die Lösung geliefert. Durch das Hinzufügen der Inline-CSS-Eigenschaft "page-break-inside" zur Zeile oder Tabelle wird verhindert, dass diese Zeile/Tabelle bricht, wenn sie an die Druckerseiten gesendet und über die beiden Seiten verteilt wird. Es ist zumindest ein fest codierter Fix, wenn nicht dynamisch von der fPDF-Seite. –