Вопрос о разрыве страницы FPDF

Я использую PHP и FPDF для генерации PDF со списком объектов. Моя проблема состоит в том, если список объекта переходит к второй или третьей странице, я хочу сохранить Название товара, Количество и Описание вместе. Прямо сейчас это перейдет к второй странице, но это может разделить все детали для конкретного объекта. ПОМОГИТЕ!

<?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
задан Michael 12 March 2010 в 02:02
поделиться

2 ответа

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

}
10
ответ дан 4 December 2019 в 00:23
поделиться

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

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

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

4
ответ дан 4 December 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: