você está aqui: Home  → Arquivo de Mensagens

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

 

 

Opinião dos Leitores

Cleidson dos Santos
09 Dez 2015, 10:56
Para alterar alinhamento ou retirar e colocar borda, é preciso editar a classe.
No meu caso editei a função (function Row($data)).
Neuton Júnior
09 Dez 2015, 10:49
Obrigado Diego, era isso mesmo que estava procurando. Entretanto tem como tirar as bordas das células como fazer com a função Cell?
Rodrigo Henrique
10 Set 2015, 15:59
Muito obrigado pela iniciativa me deu uma nova perspectiva.
Paulo
03 Ago 2015, 16:04
Valew, funcionou perfeitamente, a dúvida é que tenho que deixar alguns campos centralizados e outros alinhados à direita, como faço?
Cleidson dos Santos
18 Fev 2015, 17:40
Parabéns pelo post, Excelente trabalho!!!
Thomas
24 Jul 2014, 15:45
Obrigado pelo código... funcionou certinho!!!
Vanessa
10 Jun 2014, 10:27
Ótimo!! Obrigada!!! Ganhei o dia...
alexandre
06 Dez 2013, 09:53
Parabens pelo post show, mesmo 7 anos depois, muito util, não deu muito certo mas pelos comentarios creio que esqueci de alguma coisa
Marcio Xavier Neto
05 Dez 2013, 10:36
Parabéns! Excelente trabalho, já estava enlouquecendo para montar uma tabela com o fpdf.
Alex Botelho
27 Nov 2013, 09:25
Pqp I Love You Cara.

By Header Sholders

Vlw!!!
Joaz Soares
08 Nov 2012, 10:44
Muito bom!
Parabéns pelo excelente trabalho!
bruno
12 Mar 2012, 11:09
Cara... Fiquei teu fã!!! Valeu.
LUCIANO
09 Ago 2011, 15:18
copiei o arquivo na integra e mesmo assim não conseguiu fazer funcionar.

retorna mensg:

FPDF error: Some data has already been output, can't send PDF file

se puder ajudar.
Heverton
04 Ago 2011, 22:56
Muito Obrigado, funcionou corretamente.
Manoel
26 Jun 2011, 13:49
Cara! Que maravilha de classe! Quebrou meu galho legal. Vem cá, onde mudo a margem do topo? Se uso o SetMargins ele dá margem apenas para a primeira linha. Preciso colocar um imagem em cada folha também. Isso é possível? Abraço
Rodrigo Prata
17 Mai 2011, 15:46
Salvou minha vida tbm, valeu! Apanhei um pouco pq demorei pra perceber que tinha que colocar a função $pdf->Row() dentro do loop que extrai os valores do banco. Novamente, parabéns!
Breno Dias Piheiro
02 Mai 2011, 14:53
Só funciona quando o usuário aperta enter, não dá automatico quando termina a linha e sobrescreve
Luiz Quintão
13 Mar 2011, 19:19
Muito bom! Muito obrigado! Salvou minha vida!
James
03 Mar 2011, 14:04
Belo post, a tabela fica muito boa, igual a tabela html mesmo!!!

Parabens
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script