2010-03-12 419 views
9

Estoy usando PHP y FPDF para generar un PDF con una lista de elementos. Mi problema es que si la lista de elementos pasa a una segunda o tercera página, quiero mantener juntos el Nombre del artículo, la Cantidad y la Descripción. En este momento, irá a una segunda página, pero puede dividir todos los detalles de un artículo en particular. ¡POR FAVOR AYUDA!FPDF Salto de página Pregunta

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

?> 

Respuesta

10

bmb está en el camino correcto. Aquí hay una solución un poco más detallada.

Existen varias formas diferentes de hacerlo, pero deberá tomar algunas decisiones según lo que desee. Si tiene filas que pueden ocupar la mitad de la página, probablemente esto no sea lo mejor para usted, pero si sus filas son típicamente de 2 a 5 líneas, entonces este es un buen método.

Como mi primera celda en la fila es una celda forrada múltiple (MultiCell en lenguaje FPDF) en mi tabla, las filas son de altura dinámica basadas en esta primera celda. Así que descubro qué tan alta será la fila en función del ancho de la cuerda y el ancho de la celda y luego la comparo con la habitación que queda en la página, según la posición Y actual, la altura de la página y el margen inferior:

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

Parece que tiene algunas opciones.

Puede realizar un seguimiento de dónde se encuentra en la página a medida que avanza por el ciclo y emitir su propio salto de página cuando se agota el espacio. Esto requiere que use SetAutoPageBreak() para desactivar los saltos automáticos de página.

Otro método es anular el método AcceptPageBreak(). Ese método se llama automáticamente cuando se agregará un salto de página. Te gustaría devolver FALSE si deseas apretar otra línea en la página actual, por lo que tendrías que hacer un seguimiento de los detalles que estás imprimiendo actualmente.

-2

¿Qué le parece la propiedad "page-break-inside"? Lo intenté dentro de una mesa y me ayudó.

Codifiqué la propiedad css en línea "salto de página" en mi fila y esta fila ya no se rompía cuando se enviaba a páginas de impresión, extendiéndose en dos páginas. Se presionó completamente a la página nueva o a la izquierda en la página anterior. Tal vez no sea una solución dinámica (desde el lado de fPDF), pero aún así resuelve el problema.

+0

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación - siempre puede comentar sus propias publicaciones, y una vez que tenga la reputación suficiente, podrá comentar cualquier publicación. – Ghost

+0

Realmente proporcionó la solución en mi caso. Agregar la propiedad css en línea "page-break-inside" a la fila, o tabla, evita que esta fila/tabla se rompa cuando se envía a las páginas de la impresora y se extiende por las dos páginas. Es al menos un arreglo codificado, si no dinámico desde el lado de fPDF. –

Cuestiones relacionadas