Acesso direto ao conteúdo
Logotipo Dicas-L, por Ricardo Burile

Busca

Visite também: Segurança Linux ·  UnderLinux ·  VivaOLinux ·  LinuxSecurity ·  NoticiasLinux ·  BR-Linux ·  SoftwareLivre.org ·  [mais]   
 

Você está aqui: Home  → Arquivo Dicas-L

 

Assine a Lista Dicas-L

Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.

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

Formato PDF
Newsfeed RSS
Formato para impressão
PDF RSS Imprimir

Referências Adicionais

Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.

Avalie esta dica

  • Currently 3.00/5
  • 1
  • 2
  • 3
  • 4
  • 5

Avaliação: 3.0 /5 (1292 votos)

Opinião dos Leitores

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
Lan University

Submarino.com.br

Encontre imóveis, apartamentos e casas a venda no Imobilien
Saiba mais

 

 

Procure pela casa ou apartamento ideal à venda ou para aluguel na busca inteligente do Imohoo
Buscar imóveis