Cargando

Ir a contenido


 


Diseño de reportes en pdf con FPDF y PHP

Muchas aplicaciones web requieren emitir informes o documentación en formato pdf para que el usuario pueda leer o descargar. Para emitir información en formato PDF podemos utilizar distintas librerías como dompdf, pdflib y FPDF. No os perdáis este tutorial.


Escrito por el mar 11 2015 17:47 fpdf php pdf


FPDF es una librería, más precisamente un conjunto de clases escritas en PHP que permite generar archivos PDF facilitando el trabajo desde PHP, anteriormente se utilizaba la librería PDFlib.

FPDF permite configurar muchos parámetros para dar forma al documento que queramos generar, entre ellas incluyen, el tipo y tamaño de letra, configurar formato y los márgenes de la página. Gestionar el encabezado y pie de página, números de página y muchos parámetros más.

Cómo instalar la librería FPDF en un sitio web


La librería es una clase, para funcionar es necesario PHP 4 como minimo, la mayoria de los servidores ya soportan php 5.3 o 5.4, podemos descargar la librería desde el siguiente enlace: http://www.fpdf.org/

Una vez descargado el archivo zip, lo descomprimimos y pondremos en nuestro servidor, ya sea en local o en el servidor final. Creamos un directorio denominado pdf y alli subimos los archivos de la librería, luego lo incluiremos ya sea desde el backend o desde el frontend.

La instalación no requiere ningún otro requisito, por lo que comprobaremos que resulta bastante sencilla.

Comenzamos con FPDF desde PHP.

Veamos un ejemplo sencillo de como funciona la librería. Crearemos un archivo index.php y dentro podremos el código para mostrar un archivo PDF con un titulo y un texto el código sera el siguiente:
<?php

require('pdf/fpdf.php');

$pdf=new FPDF();
$pdf->AddPage();

$pdf->SetFont('Arial','B',16);
$pdf->Cell(50,10,'Probando FPDF',1,1,'L');

$pdf->Cell(50,5,'salto de linea',1,1);

$pdf->SetFont('Arial','B',10);
$pdf->MultiCell(190,5,'Lorem Ipsum es simplemente el texto de relleno de las imprentas y archivos de texto. Lorem Ipsum ha sido el texto de relleno estándar de las industrias desde el año 1500, cuando un impresor (N. del T. persona que se dedica a la imprenta) desconocido usó una galería de textos y los mezcló de tal manera que logró hacer un libro de textos especimen. No sólo sobrevivió 500 años, sino que tambien ingresó como texto de relleno en documentos electrónicos, quedando esencialmente igual al original. Fue popularizado en los 60s con la creación de las hojas "Letraset", las cuales contenian pasajes de Lorem Ipsum, y más recientemente con software de autoedición, como por ejemplo Aldus PageMaker, el cual incluye versiones de Lorem Ipsum.');

$pdf->Output();

?>


Veamos detalladamente la propiedad Cell, los parámetros son los siguientes
$pdf->Cell(50,10,'Probando FPDF',1,1,'L');
Cell(ancho, Alto, texto, borde, salto de linea, alineacion de texto)

Aclaramos que borde puede tomar los valores 1: con border y 0 sin borde.
Salto de linea 1 saltar linea y 0: no saltar linea. En este caso para que sea comprensible hemos identificado el salto de linea, pero debería ir sin texto y sin borde.

Ahora el mismo codigo pero quitamos los bordes cambiando 1 por cero, y convertimos el tesxto en utf8 para solucionar el problema de tildes y ñ.
$pdf->Cell(50,10,'Probando FPDF',0,1,'L');

$pdf->Cell(50,5,'',0,1);

$pdf->SetFont('Arial','B',10);

//convertimos el texto a utf8
$texto = utf8_decode('Lorem Ipsum …...');

$pdf->MultiCell(190,5,$texto);
El resultado es el siguiente:


Cuando utilizar Cell o Multicell


CELL
Sirve para crear una celda, debemos conocer exactamente la longitud del contenido ya que su tamaño no varía por si solo por lo tanto si el contenido es mas ancho saldrá fuera de la celda.


MULTI CELL
Sirve cuando tenemos párrafos de texto que no sabemos cuanto espacio ocupa. Así que en lugar de configurar una altura de la celda, estableceremos el ancho y la celda se ajustara a la altura para el texto que se mostrará dentro, variando el tamaño de texto se ajusta la celda Multicell.


Podemos utilizar tanto las funciones Cell y MultiCell, en cualquier parte, solo debemos definir qué tipo de letra utilizaremos antes de invocar cada función.

A continuación vamos a crear una cabecera y un pie de página para nuestro documento pdf. Para ello utilizaremos los métodos de FPDF Header() y Footer(), estos métodos son heredados y se ejecutarán automáticamente si están presentes, al crearse la página con AddPage() detecta si los métodos están presentes, sino no los ejecuta. Cada vez que se cree una nueva página los métodos Header y Footer se volverán a ejecutar.

Veamos un ejemplo generando un listado sencillo de venta de productos e importes, además veremos como definir una constante para utilizar como símbolo de moneda.
<?php

require('pdf/fpdf.php');

//Creamos la nueva clase pdf que hereda de fpdf

class PDF extends FPDF
{

// utilizamos la funcion Header() y la personalizamos para que muestre la cabecera de página
function Header()

{
   

       // seteamos el tipo de letra Arial Negrita 16
    $this->SetFont('Arial','B',16);

    // ponemos una celda sin contenido para centrar el titulo o la celda del titulo a la derecha
    $this->Cell(50);

    // definimos la celda el titulo
    $this->Cell(100,10,'Encabezado Reporte de Ventas',1,0,'C');

    // Salto de línea salta 20 lineas
    $this->Ln(20);

}

// utilizamos la funcion Footer() y la personalizamos para que muestre el pie de página
function Footer()

{
    // Seteamos la posicion de la proxima celda en forma fija a 1,5 cm del final de la pagina

    $this->SetY(-15);
    // Seteamos el tipo de letra Arial italica 10

    $this->SetFont('Arial','I',10);
    // Número de página

    $this->Cell(0,10,'Pagina '.$this->PageNo().'/{nb}',0,0,'C');
}

}
El número de página se establece mediante la función:
$this->PageNo()


Vamos a crear un listado de productos en pdf, vamos a tomar los productos desde una base de datos en mysql y mediante php consultamos la base de datos y generaremos el listado en forma dinámica.

Creamos una base de datos Mercado y dentro la tabla productos, no añadiremos la tablas auxiliares de categorías y rubros.
--
-- Base de datos: `mercado`

--
-- Estructura de tabla para la tabla `productos`

--

CREATE TABLE IF NOT EXISTS `productos` (
  `id_publicacion` int(11) NOT NULL AUTO_INCREMENT,

  `idrubro` int(11) DEFAULT NULL,
  `idcategoria` int(11) DEFAULT NULL,

  `idsubcategoria` int(11) DEFAULT NULL,
  `imagen1` varchar(255) DEFAULT NULL,

  `imagen2` varchar(255) DEFAULT NULL,
  `imagen3` varchar(255) DEFAULT NULL,

  `imagen4` varchar(255) DEFAULT NULL,
  `imagen5` varchar(255) DEFAULT NULL,

  `imagen6` varchar(255) DEFAULT NULL,
  `precio` decimal(10,2) DEFAULT NULL,

  `activo` varchar(3) DEFAULT NULL,
  `comentario` text,

  `titulo` varchar(255) DEFAULT NULL,
   `stock` int(11) DEFAULT NULL,

  PRIMARY KEY (`id_publicacion`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Luego nos conectamos mediante php a la base de datos, consultamos todos los productos y generamos el listado pdf:
<?php error_reporting(0);

require('pdf/fpdf.php');

//Conecto a la base de datos
$enlace = mysql_connect("localhost", "root");

mysql_select_db("mercado", $enlace);
//Consulta la tabla productos solicitando todos los productos

$resultado = mysql_query("SELECT * FROM productos", $link);

//Instaciamos la clase para genrear el documento pdf
$pdf=new FPDF();

//Agregamos la primera pagina al documento pdf
$pdf->AddPage();

//Seteamos el inicio del margen superior en 25 pixeles

$y_axis_initial = 25;

//Seteamos el tiupo de letra y creamos el titulo de la pagina. No es un encabezado no se repetira
$pdf->SetFont('Arial','B',12);

$pdf->Cell(40,6,'',0,0,'C');
$pdf->Cell(100,6,'LISTA DE PRODUCTOS',1,0,'C');

$pdf->Ln(10);

//Creamos las celdas para los titulo de cada columna y le asignamos un fondo gris y el tipo de letra
$pdf->SetFillColor(232,232,232);

$pdf->SetFont('Arial','B',10);
$pdf->Cell(125,6,'Titulo',1,0,'C',1);

$pdf->Cell(30,6,'Precio',1,0,'C',1);
$pdf->Cell(30,6,'Foto',1,0,'C',1);

$pdf->Ln(10);

//Comienzo a crear las fiulas de productos según la consulta mysql

while($fila = mysql_fetch_array($resultado))
{

    $titulo = $fila['titulo'];

    $precio = $fila['precio'];
    $imagen="fotos/".$row['imagen1'];

   
    $pdf->Cell(125,15,$titulo,1,0,'L',0);

       $pdf->Cell(30,15,$precio,1,0,'R',1);
//Muestro la iamgen dentro de la celda GetX y GetY dan las coordenadas actuales de la fila

     $pdf->Cell( 30, 15, $pdf->Image($imagen, $pdf->GetX()+5, $pdf->GetY()+3, 20), 1, 0, 'C', false );

$pdf->Ln(15);

}

mysql_close($enlace);

//Mostramos el documento pdf
$pdf->Output();

?>

¿Te ha gustado y ayudado este Tutorial?
Puedes premiar al autor pulsando este botón para darle un punto positivo
  • -
  • 0
10
VOTA
5
100%
4
0%
3
0%
2
0%
1
0%

  Información

  •   Publicado mar 11 2015 17:47
  •   Visitas 29.1K
  •   Nivel
    Intermedio



Tutoriales Relacionados


3 Comentarios


Ramón Alejandro Landázuri Sosa
sep 15 2016 00:14

Buenas tardes Sergio, tengo un pequeño problema con la libreria al momento de generar los PDF, y es muy raro no se a que se deba que en algunos equipos de computo solo me respeta las imagenes y no me aparecen nada de las lineas generadas ni texto, pero si lo veo en otro equipo si sale todo correctamente, he tratado tambien verlas al descargar y pasa lo mismo es un error algo aleatorio pero no tengo idea a que se deba, alguna vez te ha pasado?

 

Saludos y gracias por tu apoyo


Jaime Alberto Escobar
dic 13 2017 07:58

Hola de antemano muchas gracias y buen tutorial

 

me sale este error 

Error de FPDF: algunos datos ya se han emitido, no se puede enviar un archivo PDF

 

y este es el código porque lo quiere hacer con mysqli............

 

<?php 

require'fpdf/fpdf.php';
 require('conexion.php');
//Conecto a la base de datos
//$enlace = mysql_connect("localhost", "root");
 
//mysql_select_db("mercado", $enlace);
//Consulta la tabla productos solicitando todos los productos
 
//$resultado = mysql_query("SELECT * FROM productos", $link);
$query=("SELECT * FROM productos");
 
$resultados=mysqli_query($conexion, $query); 
//Instaciamos la clase para genrear el documento pdf
$pdf=new FPDF();
 
//Agregamos la primera pagina al documento pdf
$pdf->AddPage();
 
//Seteamos el inicio del margen superior en 25 pixeles
 
$y_axis_initial = 25;
 
//Seteamos el tiupo de letra y creamos el titulo de la pagina. No es un encabezado no se repetira
$pdf->SetFont('Arial','B',12);
 
$pdf->Cell(40,6,'',0,0,'C');
$pdf->Cell(100,6,'LISTA DE PRODUCTOS',1,0,'C');
 
$pdf->Ln(10);
 
//Creamos las celdas para los titulo de cada columna y le asignamos un fondo gris y el tipo de letra
$pdf->SetFillColor(232,232,232);
 
$pdf->SetFont('Arial','B',10);
$pdf->Cell(125,6,'Titulo',1,0,'C',1);
 
$pdf->Cell(30,6,'Precio',1,0,'C',1);
$pdf->Cell(30,6,'Foto',1,0,'C',1);
 
$pdf->Ln(10);
 
//Comienzo a crear las fiulas de productos según la consulta mysql
 
while($fila = mysqli_fetch_assoc($resultados))
{
 
$titulo = $fila['titulo'];
 
$precio = $fila['precio'];
$imagen="fotos/".$fila['imagen1'];
 
 
$pdf->Cell(125,15,$titulo,1,0,'L',0);
 
 $pdf->Cell(30,15,$precio,1,0,'R',1);
//Muestro la iamgen dentro de la celda GetX y GetY dan las coordenadas actuales de la fila
 
// $pdf->Cell( 30, 15, $pdf->Image($imagen, $pdf->GetX()+5, $pdf->GetY()+3, 20), 1, 0, 'C', false );
 
$pdf->Ln(15);
 
 
 
mysqli_close($conexion);
 
//Mostramos el documento pdf
$pdf->Output();
}
?>
 
 
espero me puedas contestar a que se debe..... muchas gracias

hermansolvetic
dic 19 2017 06:52

Estimado Jaime Alberto Escobar, si el error que te sale es como este:

Fatal error: Uncaught Exception: FPDF error: Some data has already been output, can't send PDF file in 

 

este es un error muy comun con fpdf, para solucionarlo solo debes ir al archivo fpdf.php y buscar

esta función: 

function Output($dest='', $name='', $isUTF8=false){ }

 

y dentro de ella poner en la primera linea:

 

ob_clean(); 

 

Con esta simple linea se debería corregir el error, espero que te haya sido de ayuda.

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!
Demuestra que eres experto!
  ESCRIBIR TUTORIAL
Suscribirse