TCPDF / FPDF – проблема разрыва страницы

Я пытаюсь создать PDF-файл с таблицей данных. Но когда разрыв страницы выполняется, он переходит на новую страницу каждый раз, когда новая страница добавляется на страницу на уровне точки останова ..!?

Я попытался сделать то же самое с TCPDF, но все тот же вопрос с разрывом страницы каждый раз, когда новая ячейка я добавил вокруг уровня точки разрыва страницы …

пример:

Http: //www.online-økonomi.dk/_tst_fpdf.php

require_once '../class/download/fpdf/fpdf.php'; class File_PDF { private $pdf; private $col_product = 25; private $col_unit = 12; private $col_price = 20; private $col_count = 14; private $col_discount = 12; private $col_vat = 12; private $col_sum = 22; private $width = 200; private $line_height = 4.2; private $margin_top = 30; public function generate(){ $this->pdf = new FPDF(); $this->pdf->AddPage(); $this->pdf->SetDisplayMode('real'); $this->pdf->SetAutoPageBreak(true, 150); if($this->products){ $i = 0; $this->color_light(); foreach($this->products as $product){ $this->add_product($product, $i % 2 ? true:false); $i++; } } $this->pdf->Output(); } private function add_product($product, $fill){ $this->txt(); $x = $this->width; $y = $this->pdf->GetY(); $this->cell_sum($this->col_sum, $x, $y, $product['sum'] / 100, 'R', $fill); $this->cell_vat($this->col_vat, $x, $y, $product['vat_percent'], 'R', $fill); $this->cell_discount($this->col_discount, $x, $y, $product['discount_percent'] / 100, 'R', $fill); $this->cell_count($this->col_count, $x, $y, $product['count'] / 100, 'R', $fill); $this->cell_price($this->col_price, $x, $y, $product['price'] / 100, 'R', $fill); $this->cell_unit($this->col_unit, $x, $y, $product['unit_name'], 'L', $fill); $this->cell_name(0, $x, $y, $product['name'], 'L', $fill); $this->cell_product($this->col_product, $x, $y, $product['product_id_'], 'L', $fill); } private function cell_sum($width, &$x, $y, $str, $align, $fill=false){ $this->cnstr_cell($width, $x, $y, $str, $align, $fill); } private function cell_vat($width, &$x, $y, $str, $align, $fill=false){ $this->cnstr_cell($width, $x, $y, $str, $align, $fill); } private function cell_discount($width, &$x, $y, $str, $align, $fill=false){ $this->cnstr_cell($width, $x, $y, $str, $align, $fill); } private function cell_count($width, &$x, $y, $str, $align, $fill=false){ $this->cnstr_cell($width, $x, $y, $str, $align, $fill); } private function cell_price($width, &$x, $y, $str, $align, $fill=false){ $this->cnstr_cell($width, $x, $y, $str, $align, $fill); } private function cell_unit($width, &$x, $y, $str, $align, $fill=false){ $this->cnstr_cell($width, $x, $y, $str, $align, $fill); } private function cell_name($width, &$x, $y, $str, $align, $fill=false){ $this->pdf->SetXY($this->col_product + 10, $y); $this->pdf->MultiCell($x - $this->col_product - 10, $this->line_height, $str, 0, $align, $fill); } private function cell_product($width, &$x, $y, $str, $align, $fill=false){ $this->pdf->SetXY(10, $y); $this->pdf->MultiCell($this->col_product, $this->line_height, $str, 0, $align, $fill); } private function cnstr_cell($width, &$x, $y, $str, $align='L', $fill=false){ $x -= $width; $this->pdf->SetXY($x, $y); $this->pdf->MultiCell($width, $this->line_height, $str, 0, $align, $fill); } private function color_light(){ $this->pdf->SetFillColor(200, 200, 200); } private function txt(){ $this->pdf->SetFont('Arial', '', 8.5); } private function txt_marked(){ $this->pdf->SetFont('Arial', 'B', 8.5); } private $products = array( array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ), array( 'product_id_' => 'ADS1550', 'name' => 'name', 'unit_name' => 'pcs', 'price' => 182450000, 'count' => 310000, 'discount_percent' => 19900, 'vat_percent' => 0, 'sum' => 1587057200 ) ); } $PDF = new File_PDF(); $PDF->generate(); 

Проблема заключается в том, что в методе Cell() (который вызывается в MultiCell() ) FPDF всегда добавляет новую страницу, если текущая позиция Y + высота новой ячейки больше разрешенной высоты страницы.

По умолчанию высота страницы составляет 297, а SetAutoPageBreak() вы извлекаете 150 из нее. Поэтому, когда Y + cell_height является более чем 147, вы всегда получаете новую страницу при вызове cnstr_cell() .

Чтобы предотвратить это, вам нужно вызвать AddPage() самостоятельно. Добавьте эту проверку в свой add_product() :

 $x = $this->width; $y = $this->pdf->GetY(); if (($y + $this->line_height) >= 147) { $this->pdf->AddPage(); $y = 0; // should be your top margin } 

Btw. Я также должен был создать динамический PDF недавно, я закончил использовать wkhtmltopdf , это было намного проще в использовании и настройке, чем все библиотеки PHP. Я предлагаю взглянуть на это.