2011-11-30 61 views
6

Estoy tratando de crear un archivo PDF con una tabla de datos .. Pero cuando se cumple un salto de página, salta a una nueva página cada vez que se agrega una nueva multicélula a la página en el romper nivel de punto ..!?TCPDF/FPDF - Salto de página problema

he tratado de hacer exactamente lo mismo con TCPDF, pero sigue siendo el mismo problema con un salto de página cada vez que una nueva célula he añadido alrededor del nivel de punto de salto de página ...

ejemplo:

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(); 
+0

¿Podría dar un ejemplo de código * short *? Solo tome 10 minutos para simplificar su código de modo que llene una página, elimine todas las propiedades del objeto y más personas intenten responderle. –

Respuesta

19

el problema es que en el Cell() método (que se llama en MultiCell()) FPDF añade Allways una nueva página si el la corriente posición Y + la altura de la nueva célula es mayor que la allowe d altura de la página.

La altura de página predeterminada parece ser 297, con SetAutoPageBreak() resta de 150. Por lo tanto, cuando Y + cell_height tiene una graduación superior a 147, siempre obtendrá una nueva página cuando llame a su cnstr_cell().

Para evitar esto, necesita llamar al AddPage() por su cuenta. Añadir este cheque en su método de 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. También tuve que generar un PDF dinámico recientemente, terminé usando wkhtmltopdf, era mucho más fácil de usar y personalizar que todas las bibliotecas de PHP. Sugiero echarle un vistazo.

+0

muchas gracias ..! :) – clarkk

+1

Solo un FYi, mientras leía esta respuesta hoy, noté que el enlace a 'wkhtmltopdf' está roto. –

+1

@TimLewis gracias, arreglé el enlace! – Jona

Cuestiones relacionadas