2010-03-12 11 views
9

J'utilise PHP et FPDF pour générer un PDF avec une liste d'éléments. Mon problème est que si la liste des éléments passe à une deuxième ou troisième page, je veux garder le nom de l'article, la quantité et la description ensemble. À l'heure actuelle, il ira à une deuxième page, mais il peut diviser tous les détails pour un élément particulier. S'IL VOUS PLAÎT AIDE!FPDF Saut de page Question

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

?> 

Répondre

10

bmb est sur la bonne voie. Voici une solution un peu plus détaillée.

Il y a plusieurs façons de le faire, mais vous devrez prendre certaines décisions en fonction de ce que vous voulez. Si vous avez des lignes qui peuvent occuper la moitié de la page, alors cela ne fonctionnera probablement pas le mieux pour vous, mais si vos lignes sont généralement de 2 à 5 lignes, c'est une bonne méthode. Comme ma première cellule de la rangée est une cellule à plusieurs lignes (MultiCell en langage FPDF) dans ma table, les lignes sont de hauteur dynamique en fonction de cette première cellule. Je détermine donc la hauteur de la ligne en fonction de la largeur et de la largeur de la cellule, puis compare-la avec la pièce restante sur la page, en fonction de la position Y actuelle, de la hauteur de la page et de la marge inférieure:

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

Il semble que vous ayez quelques options.

Vous pouvez garder une trace de l'endroit où vous vous trouvez sur la page pendant que vous parcourez votre boucle et émettre votre propre saut de page lorsque vous manquez d'espace. Cela nécessite que vous utilisez SetAutoPageBreak() pour désactiver les sauts de page automatiques.

Une autre méthode consiste à remplacer la méthode AcceptPageBreak(). Cette méthode est appelée automatiquement lorsqu'un saut de page sera ajouté. Vous voudriez retourner FALSE si vous voulez presser une autre ligne sur la page actuelle, donc vous devrez garder une trace des détails que vous imprimez actuellement.

-2

Qu'en est-il de la propriété "page-break-inside"? Je l'ai essayé à l'intérieur d'une table et ça aide. J'ai cédé en dur la propriété css en ligne "page-break-inside" à ma ligne et cette ligne ne s'est plus brisée lorsqu'elle a été envoyée à des pages d'impression, s'étendant sur deux pages. Il a été poussé soit complètement à la nouvelle page ou à gauche sur le précédent. Peut-être que ce n'est pas une solution dynamique (du côté de fPDF des choses), mais il résout toujours le problème.

+0

Ceci ne fournit pas de réponse à la question. Pour critiquer ou demander des précisions d'un auteur, laisser un commentaire au-dessous de leur poste - vous pouvez toujours commenter sur vos propres messages, et une fois que vous avez une réputation suffisante, vous serez en mesure de commenter sur n'importe quel poste. – Ghost

+0

En fait, il a fourni la solution dans mon cas. L'ajout de la propriété css en ligne "page-break-inside" à la ligne ou à la table empêche cette ligne/table de se rompre lorsqu'elle est envoyée aux pages de l'imprimante et s'étend sur les deux pages. C'est au moins un correctif codé en dur, sinon dynamique du côté de fPDF. –