você está aqui: Home  → Arquivo de Mensagens Workshop Gratuito: Os Segredos do Shell, com o Prof. Julio Neves

Quebra de linha em uma tabela com a classe fpdf

Colaboração: Diego Rafael

Data de Publicação: 26 de Dezembro de 2007

Para quem desenvolve em php e utiliza a classe fpdf para gerar seus relatórios em pdf já deve ter passado pelo seguinte problema: para gerar a tabela usamos coordenadas fixas com a função Cell(). Caso o usuário aperte um enter em um campo do tipo textarea por exemplo teriamos que usar a função MultiCell(), que infelizmente só traz transtornos quando você necessita que os dados fiquem na mesma coluna, e principalmente se você está utilizando bordas.

A classe abaixo resolverá este problema:

É necessário ter a classe fpdf no mesmo diretório ou passar o caminho através do require.

<?php

 require('fpdf.php');

 class PDF extends FPDF
 {
 var $widths;
 var $aligns;

 function SetWidths($w)
 {
   //Set the array of column widths
   $this->widths=$w;
 }

 function SetAligns($a)
 {
   //Set the array of column alignments
   $this->aligns=$a;
 }

 function Row($data)
 {
   //Calculate the height of the row
   $nb=0;
   for($i=0;$i< count($data);$i++)
       $nb=max($nb,$this->NbLines($this->widths[$i],$data[$i]));
   $h=5*$nb;
   //Issue a page break first if needed
   $this->CheckPageBreak($h);
   //Draw the cells of the row
   for($i=0;$i< count($data);$i++)
   {
       $w=$this->widths[$i];
       $a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';
       //Save the current position
       $x=$this->GetX();
       $y=$this->GetY();
       //Draw the border
       $this->Rect($x,$y,$w,$h);
       //Print the text
       $this->MultiCell($w,5,$data[$i],0,$a);
       //Put the position to the right of the cell
       $this->SetXY($x+$w,$y);
   }
   //Go to the next line
   $this->Ln($h);
 }

 function CheckPageBreak($h)
 {
   //If the height h would cause an overflow, add a new page immediately
   if($this->GetY()+$h>$this->PageBreakTrigger)
       $this->AddPage($this->CurOrientation);
 }

 function NbLines($w,$txt)
 {
   //Computes the number of lines a MultiCell of width w will take
   $cw=&$this->CurrentFont['cw'];
   if($w==0)
       $w=$this->w-$this->rMargin-$this->x;
   $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
   $s=str_replace("\r",'',$txt);
   $nb=strlen($s);
   if($nb>0 and $s[$nb-1]=="\n")
       $nb--;
   $sep=-1;
   $i=0;
   $j=0;
   $l=0;
   $nl=1;
   while($i<$nb)
   {
       $c=$s[$i];
       if($c=="\n")
       {
           $i++;
           $sep=-1;
           $j=$i;
           $l=0;
           $nl++;
           continue;
       }
       if($c==' ')
           $sep=$i;
       $l+=$cw[$c];
       if($l>$wmax)
       {
           if($sep==-1)
           {
               if($i==$j)
                   $i++;
           }
           else
               $i=$sep+1;
           $sep=-1;
           $j=$i;
           $l=0;
           $nl++;
       }
       else
           $i++;
   }
   return $nl;
 }
 }

 ?>

Segue exemplo de utilização abaixo:

<?php
define('FPDF_FONTPATH','font/');
require('pdf.php');

$pdf=new pdf();
$pdf->Open();
$pdf->AddPage();
$pdf->SetFont('Arial','',14);
//Table with 20 rows and 4 columns
$pdf->SetWidths(array(30,50,30,40));//CADA VALOR DESTE ARRAY SERÁ A LARGURA DE CADA COLUNA
srand(microtime()*1000000);
for($i=0;$i<20;$i++)
  $pdf->Row(array("$valor1","$valor2","$valor3","$valor4"));
$pdf->Output();
?>

O resultado do exemplo esta disponivel em http://www.fpdf.org/en/script/ex3.pdf ou em http://www.dicas-l.com.br/download/ex3.pdf.



Veja a relação completa dos artigos de Diego Rafael