Logotipo Dicas-L, por Ricardo Burile

Busca

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

Aprenda inglês em casa

Baixe gratuitamente as duas primeiras aulas


 

Aprenda inglês em casa

Baixe gratuitamente as duas primeiras aulas

English for Reading and Listening

Receba por email, diariamente, mensagens contendo materiais para leitura e audição, incluindo arquivos no formato MP3 gravados por falantes nativos.

Saiba mais e faça sua inscrição

Red Bug

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

 

Tempo Real Eventos - Mão na Massa XEN

Assine a Lista Dicas-L

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

Publicar em del.icio.us

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

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 (349 votos)

Recomende este site
Recomendar este artigo


Versão para impressão


Opinião dos Leitores

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


Powered by Scriptsmill Comments Script

Tempo Real Eventos - VOIP - Palestra na Íntegra
Utilizando Asterisk para diagnóstico de redes
Saiba mais

Biblioteca

Hardware PC: Guia de Aprendizagem Rápida
Por Carlos E. Morimoto

Sistemas de Banco de Dados
Por Ramez E. Elmasri e Shamkant Navathe

Redes de Computadores: Curso Completo
Por Gabriel Torres

UML: uma Abordagem Prática
Por Gilleanes T. A. Guedes

MySQL - Guia do Programador
Por André Milani

Marley e Eu: a Vida e o Amor ao Lado do Pior Cão do Mundo
Por John Grogan

Redes de Computadores
Por Andrew S. Tanembaum

SQL: Curso Prático
Por Celso H. Poderoso de Oliveira

Google Hacking
Por JOHNNY LONG

Criptografia em Software e Hardware
Por Edward David Moreno, Fabio Dacencio Pereira e Rodolfo Barros Chiaramonte

Use a Cabeça!: JSP & Servlets
Por Brian Bashan, Kathy Sierra, Bert Bates

Harry Potter e as Relíquias da Morte
Por J.K. Rowling

Manual Completo do Linux: Guia do Administrador
Por Evi Nemeth, Trent R. Hein, Garth Snyder

Elite da Tropa
Por Luis Eduardo Soares, Andre Batista e Rodrigo Pimentel

Marley e Eu: a Vida e o Amor ao Lado do Pior Cão do Mundo
Por John Grogan

UML: Guia do Usuário
Por Grady Booch, James Rumbaugh e Ivar Jacobson

Deus, um delírio
Por Richard Dawkins

OpenGL: uma Abordagem Prática e Objetiva
Por Marcelo Cohen, Isabel Harb Manssour

Engenharia de Software
Por Roger S. Pressman

Upgrade e Manutenção de Hardware
Por Carlos E. Morimoto