Logotipo Dicas-L, por Ricardo Burile

Busca

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

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

 

PHP CONFERENCE

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

Stumble Upon Digg This Del.icio.us Twitter Recomendar este artigo a um amigo Entre em contato Formato PDF
Newsfeed RSS
Formato para impressão
StumbleUpon Digg Del.icio.us Twitter Recomendar Contato 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 (487 votos)

Opinião dos Leitores

Simone
09 Mar 2009, 10:36
Essa dica foi ótima, muito útil para mim, inclusive a alteração das cores passada pelo DOGAO.

Funcionou direitinho, obrigada pessoal!
_DOGAO_
19 Ago 2008, 23:49
------> pronto.. alterando essa funcao vc consegue colocar cor no fundo das linhas sem problemas... abraços



function Row($data)
{
//Calculate the height of the row

$this->SetFillColor(224,235,255);
$this->SetTextColor(0);
$this->SetFont('');

$nb=0;

for($i=0;$i< count($data);$i++){
$nb=max($nb,$guardaLinhas[$i]=$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
$fill = '';
$this->fundo = !$this->fundo;
for($i=0;$i< count($data);$i++)
{

for($b=0;$b<count($guardaLinhas);$b++){
if($teste <$guardaLinhas[$b]){$teste = $guardaLinhas[$b];}
}

$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

$altura = ($teste*5)/$guardaLinhas[$i];

$this->MultiCell($w,$altura,$data[$i],1,$a,!$this->fundo);
//Put the position to the right of the cell
$this->SetXY($x+$w,$y);

}

//Go to the next line


$this->Ln($h);
}
_DOGAO_
19 Ago 2008, 18:47
Cara...muito bom..

so tem um problema quando se que fazer um relatorio mais aprezentavel..com linhas coloridas e talz..
dai tinha que dimencionar as celulas da mesma linha com altura iguais..e facil de ver que isso nao acontece colocando borda nas celulas... e é isso que estou tentado fazer..caso consiga postarei aki o resultado...seria meio que cor sim/cor não...abraços e 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

English for Reading and Listening
Enriqueça o seu vocabulário recebendo diariamente mensagens divertidas em inglês, com áudio em MP3.
Saiba mais

Biblioteca

Desenvolvendo Websites com PHP
Por Juliano Niederauer

O Monge e o Executivo: uma História sobre a Essência da Liderança
Por James C. Hunter

Extreme Programming
Por Vinicius Manhaes Teles

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

O Vendedor de Sonhos
Por Augusto Cury

Segurança de Redes em Ambientes Cooperativos
Por Emilio Tissato Nakamura e Paulo Licio de Geus

O Conhecimento em Rede
Por Carlos Nepomuceno e Marcos Cavalcanti

Utilizando UML e Padrões
Por CRAIG LARMAN

Sistema de Banco de Dados
Por Abraham Silberschatz

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

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

Redes de Computadores e a Internet
Por James F. Kurose e Keith W. Ross

O Segredo
Por Rhonda Byrne

Os Segredos da Mente Milionária
Por T. Harv Eker

Construindo Sites com CSS e (X)HTML
Por Mauricio Samy Silva

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

Expressões Regulares: Uma Abordagem Divertida
Por Aurélio Marinho Jargas

Qualidade de Software
Por Andre Koscianski Michel dos Santos Soares

Descobrindo o Linux: Entenda o Sistema Operacional GNU/Linux
Por Joao Eriberto Mota Filho

Enterprise Javabeans 3.0
Por Bill Burke, Richard Monson