Tablas en FPDF

  • Por
  • 29 de julio de 2010
  • Valoración:
  • 6 Comentarios
  • PHP
Vemos cónstruir tablas para nuestros documentos en pdf con FPDF.
Siguiendo con nuestro manual sobre FPDF vamos a ver como construir una tabla para el documento pdf.

Vamos a ver dos ejemplos de construcción de tablas, uno más sencillo que el otro, pero ambos igual de interesantes.

La primera tabla es muy sencillita, tan solo 2 lineas y la cabecera. Para ello vamos a pasarle un array con los nombres de cada celda, y después vamos a ir rellenando las columnas y las filas con la función CELL.

La función seria la siguiente:

functionTablaBasica($header)
   {
    //Cabecera
    foreach($header as $col)
    $this->Cell(40,7,$col,1);
    $this->Ln();
   
      $this->Cell(40,5,"hola",1);
      $this->Cell(40,5,"hola2",1);
      $this->Cell(40,5,"hola3",1);
      $this->Cell(40,5,"hola4",1);
      $this->Ln();
      $this->Cell(40,5,"linea ",1);
      $this->Cell(40,5,"linea 2",1);
      $this->Cell(40,5,"linea 3",1);
      $this->Cell(40,5,"linea 4",1);
   }

y la llamada a la función seria la siguiente:

//Creación del objeto de la clase heredada
$pdf=new PDF();
//Títulos de las columnas
$header=array('Columna 1','Columna 2','Columna 3','Columna 4');
$pdf->AliasNbPages();
//Primera página
$pdf->AddPage();
$pdf->SetY(65);
//$pdf->AddPage();
$pdf->Tabla Basica($header);

El siguiente ejemplo de tabla es algo más complicado ya que le vamos a dar colores a las filas y vamos a quitar los bordes inferiores de cala linea.

La función sería la siguiente:

function TablaColores($header)
{
//Colores, ancho de línea y fuente en negrita
$this->SetFillColor(255,0,0);
$this->SetTextColor(255);
$this->SetDrawColor(128,0,0);
$this->SetLineWidth(.3);
$this->SetFont('','B');
//Cabecera

for($i=0;$i<count($header);$i++)
$this->Cell(40,7,$header[$i],1,0,'C',1);
$this->Ln();
//Restauración de colores y fuentes
$this->SetFillColor(224,235,255);
$this->SetTextColor(0);
$this->SetFont('');
//Datos
$fill=false;

$this->Cell(40,6,"hola",'LR',0,'L',$fill);
$this->Cell(40,6,"hola2",'LR',0,'L',$fill);
$this->Cell(40,6,"hola3",'LR',0,'R',$fill);
$this->Cell(40,6,"hola4",'LR',0,'R',$fill);
$this->Ln();
$fill=true;
$this->Cell(40,6,"col",'LR',0,'L',$fill);
$this->Cell(40,6,"col2",'LR',0,'L',$fill);
$this->Cell(40,6,"col3",'LR',0,'R',$fill);
$this->Cell(40,6,"col4",'LR',0,'R',$fill);
$fill=!$fill;
$this->Ln();
$this->Cell(160,0,'','T');
}

Todas las funciones que vemos ya están explicadas en otros artículos del manual de FPDF por lo que no entraremos en detalles.
Hemos establecido el color de relleno de las celdas, el color del texto, el grosor de los bordes y el tipo de letra. A continuación hemos creado la primera linea en rojo y la letra en negrita. Después asignamos otros colores para el relleno y la letra y vamos rellenando el resto de filas. Vamos colocando los bordes donde necesitamos y diciendo si la celda va rellena o no de color con la variable $fill.
Al final tenemos que añadir el borde de abajo del todo, para ello utilizamos la linea:

$this->Cell(160,0,'','T');

Que nos dice que la linea tiene que ser 160 de ancho, 0 de alto y mostrando solo el borde superior.

Os pongo el ejemplo completo con las dos tablas:

<?
require('fpdf.php');

class PDF extends FPDF
{
//Cabecera de página
   function Header()
   {
    //Logo
    $this->Image("leon.jpg" , 10 ,8, 35 , 38 , "JPG" ,"http://www.mipagina.com");
    //Arial bold 15
    $this->SetFont('Arial','B',15);
    //Movernos a la derecha
    $this->Cell(80);
    //Título
    $this->Cell(60,10,'Titulo del archivo',1,0,'C');
    //Salto de línea
    $this->Ln(20);
      
   }
   
   //Pie de página
   function Footer()
   {
    //Posición: a 1,5 cm del final
    $this->SetY(-15);
    //Arial italic 8
    $this->SetFont('Arial','I',8);
    //Número de página
    $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
   }
   //Tabla simple
   function TablaSimple($header)
   {
    //Cabecera
    foreach($header as $col)
    $this->Cell(40,7,$col,1);
    $this->Ln();
   
      $this->Cell(40,5,"hola",1);
      $this->Cell(40,5,"hola2",1);
      $this->Cell(40,5,"hola3",1);
      $this->Cell(40,5,"hola4",1);
      $this->Ln();
      $this->Cell(40,5,"linea ",1);
      $this->Cell(40,5,"linea 2",1);
      $this->Cell(40,5,"linea 3",1);
      $this->Cell(40,5,"linea 4",1);
   }
   
   //Tabla coloreada
function TablaColores($header)
{
//Colores, ancho de línea y fuente en negrita
$this->SetFillColor(255,0,0);
$this->SetTextColor(255);
$this->SetDrawColor(128,0,0);
$this->SetLineWidth(.3);
$this->SetFont('','B');
//Cabecera

for($i=0;$i<count($header);$i++)
$this->Cell(40,7,$header[$i],1,0,'C',1);
$this->Ln();
//Restauración de colores y fuentes
$this->SetFillColor(224,235,255);
$this->SetTextColor(0);
$this->SetFont('');
//Datos
   $fill=false;
$this->Cell(40,6,"hola",'LR',0,'L',$fill);
$this->Cell(40,6,"hola2",'LR',0,'L',$fill);
$this->Cell(40,6,"hola3",'LR',0,'R',$fill);
$this->Cell(40,6,"hola4",'LR',0,'R',$fill);
$this->Ln();
      $fill=!$fill;
      $this->Cell(40,6,"col",'LR',0,'L',$fill);
$this->Cell(40,6,"col2",'LR',0,'L',$fill);
$this->Cell(40,6,"col3",'LR',0,'R',$fill);
$this->Cell(40,6,"col4",'LR',0,'R',$fill);
$fill=true;
   $this->Ln();
   $this->Cell(160,0,'','T');
}

   
   
}

$pdf=new PDF();
//Títulos de las columnas
$header=array('Columna 1','Columna 2','Columna 3','Columna 4');
$pdf->AliasNbPages();
//Primera página
$pdf->AddPage();
$pdf->SetY(65);
//$pdf->AddPage();
$pdf->TablaSimple($header);
//Segunda página
$pdf->AddPage();
$pdf->SetY(65);
$pdf->TablaColores($header);
$pdf->Output();
?>

Podéis ver el ejemplo funcionando en el siguiente enlace.

Autor

Sara Alvarez

Equipo DesarrolloWeb.com

Comentarios

Alfonso

31/8/2011
Arreglo de celdas
Hola que tal...

Me gustaria saber como se podria hacer un arreglo o sea quiero hacer algo parecido a esto:
____________________________________________________________________
|_____________ANEXO____________|______________DESCRIPCION_________| | | | | IMAGEN 1 | DESCRIPCION 1 | |_______________________________|___________________________________|| | | | IMAGEN 2 | DESCRIPCION 2 | |_______________________________|___________________________________|| | | | IMAGEN 3 | DESCRIPCION 3 | |_______________________________|___________________________________|

Y ya cuando sean por ejemplo 4 imagenes, cuando llegue a esta 3er imagen de un salto de pagina y se imprima en el pdf en una nueva hoja la imagen 4 y la descripcion 4 y que ya no cree mas celdas porque ya no se requieren

Si me pueden ayudar se los agradeceria mucho

gustavo

22/5/2012
codigo
muy buena ayuda

eduardo

27/5/2012
ayuda
me sirvio de mucho los ejemplos

pero tengo uan duda... como podria reemplazar el "hola o hola2" con informacion extraida del mysql?

seria genial si respondieran ya que e buscado y no logro dar con la respuesta

php_gerza

29/1/2013
Se me perdio un registro...
Tengo un par de tablas como esta:
$pdf->Cell(41,5,"FECHA",1,0);
$pdf->Cell(41,5,"HORAS",1,1);
$cons = "SELECT * FROM horas_extras WHERE RFC='$RFC' order by fecha desc";
$res = mysql_query($cons,$Cxn) or die (mysql_error());
$fil =mysql_fetch_array($res);
while ($fil = mysql_fetch_array ($res))
{



$pdf->Cell(41,5,$fil['fecha'],1,0);
$pdf->Cell(41,5,$fil['horas'],1,1);


} mysql_free_result($res);



y al parecer funciona pero siempre que hago una consulta me falta un registro.... si existen 5 resultados solo me muestra 4.... si existen 11 solo me muestra 10 y así consecutivamente.... alguien me podrá dar un tip??? no encuentro mi error...

Jesus

10/2/2013
re Falta una fila
El problema radica en <br />
$fil=mysql_fetch_array($result);<br />
while($fil=mysql_fetch_array($result){<br />
<br />
}<br />
al hacer el primer mysql_fetch_array coges la primera línea<br />
<br />
al hacer el while ya tenías la primera línea y por tanto empieza el while en la segunda. Siempre se te saltará la primera línea de tu consulta.<br />
Soluc¡on: deja sólo el while

Marcos

21/2/2013
respuesta
es porque estas contando mal la cadena... si son 4 y te muestra tres es porque comienzas desde el 1<br />
<br />
4 = 0, 1, 2, 3<br />
<br />
no asi ... 4 = 1, 2, 3 , 4

Compartir