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
Referências Adicionais
Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.
Avalie esta dica
Opinião dos Leitores
09 Mar 2009, 10:36
Funcionou direitinho, obrigada pessoal!
19 Ago 2008, 23:49
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);
}
19 Ago 2008, 18:47
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..!!












