2010-03-12 3 views
9

Я использую PHP и FPDF для создания PDF-файла со списком элементов. Моя проблема в том, что если список элементов переходит на вторую или третью страницу, я хочу сохранить имя элемента, количество и описание вместе. Сейчас он перейдет на вторую страницу, но может разделить все детали для определенного элемента. ПОЖАЛУЙСТА ПОМОГИ!FPDF Page Break Вопрос

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

?> 

ответ

10

bmb находится на правильном пути. Вот немного более подробное решение.

Существует несколько способов сделать это, но вам нужно будет принять некоторые решения на основе того, что вы хотите. Если у вас есть строки, которые могут занимать половину страницы, то это, вероятно, не будет работать лучше для вас, но если ваши строки обычно имеют длину около 2-5 строк, это хороший метод.

Поскольку моя первая ячейка в строке является многослойной ячейкой (MultiCell в FPDF говорить) в моей таблице, строки имеют динамическую высоту, основанную на этой первой ячейке. Поэтому я выясню, насколько высока строка, основанная на ширине строки и ширине ячейки, а затем сравните ее с оставшейся на странице комнатой на основе текущей позиции 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 
    // ... 

} 
4

Кажется, у вас есть несколько вариантов.

Вы можете отслеживать, где находитесь на странице, когда вы проходите через свой цикл, и выпускать свой собственный разрыв страницы, когда у вас заканчивается пространство. Это требует, чтобы вы использовали SetAutoPageBreak(), чтобы отключить автоматические разрывы страниц.

Другой метод - переопределить метод AcceptPageBreak(). Этот метод вызывается автоматически при добавлении разрыва страницы. Вы хотите вернуть FALSE, если хотите выжать еще одну строку на текущую страницу, поэтому вам нужно будет отслеживать, какие данные вы в настоящее время печатаете.

-2

Что относительно свойства "page-break-inside"? Я попробовал его внутри стола, и это помогает.

Я запрограммировал «встроенное в строку» свойство css для строки, и эта строка больше не ломалась, когда она была отправлена ​​на страницы печати, распространяясь на две страницы. Он был полностью или полностью перенесен на новую страницу или оставлен на предыдущем. Возможно, это не динамическое исправление (со стороны fPDF вещей), но оно все еще устраняет проблему.

+0

Это не дает ответа на вопрос. Чтобы получить возможность уточнить у автора, оставить свой комментарий под своим сообщением - вы всегда можете комментировать свои сообщения, и после того, как у вас достаточно репутации, вы сможете прокомментировать любое сообщение. – Ghost

+0

На самом деле это обеспечило решение в моем случае. Добавление свойства строки «page-break-inside» in-line css в строку или таблицу не позволяет этой строке/таблице разрушаться, когда она отправляется на страницы принтера и распространяется по двум страницам. Это, по крайней мере, жестко закодированное исправление, если не динамическое со стороны fPDF. –