Cargando



Crear Reportes pdf desde PHP y la librería FPDF

Muchas veces los desarrolladores web necesitamos realizar informes o reportes online desde php. Para ello una librería muy utilizada Fpdf que es una biblioteca escrita en lenguaje de programación PHP que permite crear archivos en formato PDF.


jul 11 2013 18:58
ago 26 2014 17:10
Comenzamos descargando la librería desde www.fpdf.org, una vez descargado descomprimimos y copiamos el directorio fpdf dentro del directorio de nuestra aplicación.

Un ejemplo sencillo:

<?php
require('fpdf17/fpdf.php');
$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial', 'B', 16);
$pdf->Cell(80, 10, 'Esto es una celda de 40 x 10', 1);
$pdf->Cell(50, 10, 'Celda de 50 x 10', 1);
$pdf->Ln(10);
$pdf->SetFont('Arial', 'I', 12);
$pdf->Cell(80, 10, 'Esto es una celda de 40 x 10', 0);
$pdf->Cell(50, 10, 'Celda de 50 x 10', 0);
$pdf->Output();
?>

Llamamos la librería desde el directorio de fpdf, creamos un objeto y añadimos una pagina con AddPage(), seteamos el tipo de letras estilo y tamaño. Luego creamos una celda para contener datos con la siguiente estructura

$pdf->Cell(ancho, alto, contenido, borde , alineación); //Alineación L Izquierda, C Centrado, R Derecha


FPDF_desde_PHP_3.jpg


El resultado del código anterior en pdf sera:
La función Output es quien muestra el pdf si le ponemos el parámetro I enviara el fichero al navegador, si le ponemos el parámetro D mostrar la ventana de descarga, por lo tanto si en el código anterior escribimos

$pdf->Output('mipdf.pdf','d');

Como resultado aparecerá la ventana de descarga para guardar el pdf.

También podemos hacer documentos mas complejos como por ejemplo facturas, presupuestos o reportes comerciales, utilizar bases de datos como mysql.

En el siguiente ejemplo veremos como crear un presupuesto con una imagen de cabecera


FPDF_desde_PHP_2.jpg



<?php

require('fpdf16/fpdf.php');
$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial', 'B', 16);
//inserto la cabecera poniendo una imagen dentro de una celda
$pdf->Cell(700,85,$pdf->Image('./images/logo-factura.jpg',30,12,160),0,0,'C');
$pdf->Cell(100,12,"Presupuesto: ". $campodb['nropresuputao']);
$pdf->Cell(100,12,"Fecha: ". date('d/m/Y'));
$pdf->Line(35,40,190,40);
$pdf->Ln(7);
$pdf->Cell(100,12,"Nombre : ".$campodb['nombre']));
$pdf->Cell(90,12,"Nif: ".$rowcli['nif']);
$pdf->Line(35,48,190,48);
$pdf->Ln(7);
$pdf->Cell(100,12,"Domicilio: ". $campodb['direccion']);
$pdf->Line(35,56,190,56);
$pdf->Ln(7);
$pdf->Cell(90,12,acentos("Teléfono: ".$campodb['telefono']));
$pdf->Line(35,62,190,62);
$pdf->Ln(7);
$pdf->Cell(100,12,"Equipo: ".$campodb['ordenador']);
$pdf->Line(35,68,190,68);
$pdf->Ln(9);
$pdf->SetFont('Arial','B',10);

$pdf->Cell(60,12,'PRESUPUESTO');

$pdf->Ln(2);

$pdf->SetFont('Arial','',8);
?>

Luego mediante una consulta a la base de datos mas un ciclo while genero las demás celdas y calculo los importes.

<? while ($i<count($conultadb)) {

[indent=1]$pdf->Ln(7);[/indent]

[indent=1]$pdf->Cell(139,7,acentos($campodb['concepto']),1,0,'1'); [/indent]

[indent=1]$pdf->Cell(15,7,chr(128)." ".number_format($campodb['precio'],2,'.',''),1,0,'R'); [/indent]
[indent=1]//calculo el total[/indent]

$precio=$precio+$campodb['precio'];

} ?>

Luego creamos las celdas restantes para los totales, iva, e impuestos según corresponda

<? $pdf->Ln(7);

$pdf->Cell(110,7);

$pdf->Cell(29,8,"TOTAL",1,0,'R');

$pdf->Cell(15,8,chr(128)." ".number_format($precioconiva,2,'.',''),1,0,'R');
$pdf->Ln(20);

$pdf->Multicell(400,4, "Nota: ".$rowrepar['notapresu']);
?>

Añadimos también un Multicell, que cumple la función de varias celdas en una sirve para grandes bloques de texto como una nota al pie de pagina

Finalmente le damos un nombre a nuestro fichero, al que podemos ponerle un id que los vaya enumerando según una base de datos y le definimos la opción descargar.

<? $fichero='presupuesto-00.pdf';

$pdfdoc = $pdf->Output($fichero, "D");
?>

Otra aplicación interesante es combinar fpdf con clases para generar códigos de barra con I25, EAN 39, 128, etc. En la web de fpdf hay algunos ejemplos y otros script aportados por la comunidad para testear. Aquí un ejemplo de un talón de pago que los clientes se descargan desde una web.

FPDF_desde_PHP_3.jpg


Un problema muy común que suele dar esta librería es no respetar los acentos, eso lo podemos solucionar con una función para luego revisar cada texto del contenido.

<? function acentos($cadena) {
$buscar = explode(",","á,é,í,ó,ú,ñ,Á,É,Í,Ó,Ú,Ñ,á,é,í,Ã&sup3;,ú,ñ,Ãá,Ãé,Ãí,ÃÃ&sup3;,Ãú,Ãñ");
$cambiar = explode(",","á,é,í,ó,ú,ñ,Á,É,Í,Ó,Ú,Ñ,á,é,í,ó,ú,ñ,Á,É,Í,Ó,Ú,Ñ");
$textocorregido= str_replace($buscar $cambiar, $cadena);
return $textocorregido;
} ?>

De esta manera salvaremos el problema de FPDF y los acentos.

¿Te ayudó este Tutorial?


11 Comentarios


Johann Dasse
ago 27 2013 18:09
Saludos, no estan los ejemplos para descargar, en mi caso quiero hacer el ejemplo de presupuesto.
Saludos

Roberto Gomez
sep 04 2013 20:08
Aquí tienes el enlace para descargar FPDF
http://www.fpdf.org/

Luego pulsa en descargas y ves las versiones.
Para los ejemplos puedes copiar el código que expuse en el Tutorial.

Salu2
ya genere el pdf pero ese archivo quiero mandarlo a una base de datos mysql para despues poder descargarlo como le hago?

Roberto Gomez
jul 01 2014 18:25

ya genere el pdf pero ese archivo quiero mandarlo a una base de datos mysql para despues poder descargarlo como le hago?


Mmm puede que sepa algo de eso, pero mejor realiza una pregunta en Portada y así te ayudamos entre muchos ;)
La funcion acentos no corre:
acentos("á")--> á

Sergio Martinez Garcia
ago 21 2014 11:39

La funcion acentos no corre:
acentos("á")--> á


mmm a mi si que me iba esa funcion, algo raro es..
Mejor utiliza la función utf8_decode(string)

lauvillarroel1426
ago 25 2014 16:12
Hola me intereza el codigo exactamente es lo que necesito. Pero no entiendo como esta estructurado deberias explicarlo un poco mejor .Tambien quisiera descargarlo pero como no colocastes el enlace. No entiendo todo el codigo va en solo archivo o pagina? eso es lo q no entiendo...

lauvillarroel1426
ago 25 2014 16:25
Hola Roberto quisiera saber el orden de tu codigo ... no entiendo todo va en una pagina php? como llamarla index? AddPage es una pagina que debo crear ?
xcelente tutorial:
Una pregunta:

En tu caso para mostrar la info en cada celda de cada campo lo haces así:
$pdf->Cell(100,12,"Presupuesto: ". $campodb['nropresuputao']);
$pdf->Cell(100,12,"Fecha: ". date('d/m/Y'));

En mi caso es lo mismo, solo que la información que necesito toda esta almacenada en un solo campo.
$q = "select r.response as respuesta1
from mdl_questionnaire_response_text as r, mdl_questionnaire_attempts as t, mdl_questionnaire_response as q
where r.response_id=t.rid
and q.id=r.response_id
and q.username='$usuario'";

¿Cómo le puedo hacer para ordenar los datos en el pdf, ya que me los muestra en una sola columna o celda y quiero ordenar los valores en celdas?

Imagen enviada
De antemano muchas gracias por tu respuesta.

ATTE.
Yonatan Eric

Dario Ortega
mar 23 2016 14:20

A mi me ha dado la vidaaaaa este tutorial. Mil gracias.

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X