Generar PDF en PHP

por

Hoy le toca el turno a la generación de PDF con vistas a la generación de informes. La idea es obtener los datos que queramos mostrar desde una Base de datos y luego mostrarlos en forma de tabla. Para ello, nos valdremos de una librería PHP llamada ezpdf que nos permitirá generarlos. Hay varias librerías que permitan realizar las tareas de crear PDFs aunque nosotros hemos elegido esta aunque por nada en particular.

Para poder ver el código de ejemplo debmos saber que tenemos una base de datos en nuestra máquina local llamada "sergio" y una tabla llamada usuario. Sabiendo esto ya estamos listos para poder entender el ejemplo.


require_once('./lib/PDF/class.ezpdf.php');

$pdf =& new Cezpdf('a4');
$pdf->selectFont('./lib/PDF/fonts/Courier.afm');
$pdf->ezSetCmMargins(1,1,1.5,1.5); 

Para empezar incluimos la librería descargada. Definimos el tamaño del documento(A4), el tipo de fuente y el tamaño de los márgenes exteriores.


$conexion=mysql_connect("localhost","sergio","sergio") or die(mysql_error());
mysql_select_db("proyecto",$conexion) or die(mysql_error());

Realizamos la conexión con la base de datos alojada en nuestra máquina local.


$resEmp= "";
$titles= "";
$txttit="";
	
$resEmp = mysql_query("SELECT * FROM usuario") or die(mysql_error());
$txttit = "Informe de todos los usuarios\n";
$titles = array(
						
'id'=>'ID',
'nombre'=>'Nombre',
'apellidos'=>'Apellidos',
'telefono'=>'Teléfono',
'direccion'=>'Dirección',
'CP'=>'Código Postal',
'ciudad'=>'Ciudad',
'provincia'=>'Provincia',
'fecha_nacimiento'=>'Fecha de Nacimiento',
'mail'=>'Email',
'login'=>'Login'
					
);

Realizamos la consulta a la base de datos obteniendo todos los campos de la tabla de usuario. Establecemos el título del documento y generamos un array que contiene tanto el nombre de las columnas de la tabla a generar en PDF como las correspondencias con los datos obtenidos desde la base de datos.


$totEmp = mysql_num_rows($resEmp); 

$ixx = 0;

while($datatmp = mysql_fetch_assoc($resEmp)) { 
$ixx = $ixx+1;
$data[] = array_merge($datatmp, array('num'=>$ixx));
}

$options = array(
'shadeCol'=>array(0.9,0.9,0.9),
'xOrientation'=>'center',
'width'=>500
); 

Generamos el array necesario y con el formato necesario a partir de los datos obtenidos en la consulta a la base de datos. Fijamos un espaciado de columnas, una alineación de la tabla y su ancho.


$pdf->ezText($txttit, 9);
$pdf->ezTable($data, $titles, '', $options);
$pdf->ezText("\n\n\n", 7);
$pdf->ezText("Fecha: ".date("d/m/Y"), 7);
$pdf->ezText("Hora: ".date("H:i:s")."\n\n", 7);
$pdf->ezStream(); 

Y por último, generamos el PDF con los datos generados anteriormente y, además, hacemos que se muestre la fecha y la hora de su creación en la propia hoja PDF.

A continuación os dejo el código completo para que podais utilizarlo mejor:


<?php

require_once('./lib/PDF/class.ezpdf.php');

$pdf =& new Cezpdf('a4');
$pdf->selectFont('./lib/PDF/fonts/Courier.afm');
$pdf->ezSetCmMargins(1,1,1.5,1.5); 

	
$conexion=mysql_connect("localhost","sergio","sergio") or die(mysql_error());
mysql_select_db("proyecto",$conexion) or die(mysql_error());
		
$resEmp= "";
$titles= "";
$txttit="";
	
$resEmp = mysql_query("SELECT * FROM usuario") or die(mysql_error());
$txttit = "Informe de todos los usuarios\n";
$titles = array(
						
'id'=>'ID',
'nombre'=>'Nombre',
'apellidos'=>'Apellidos',
'telefono'=>'Teléfono',
'direccion'=>'Dirección',
'CP'=>'Código Postal',
'ciudad'=>'Ciudad',
'provincia'=>'Provincia',
'fecha_nacimiento'=>'Fecha de Nacimiento',
'mail'=>'Email',
'login'=>'Login'
					
);

$totEmp = mysql_num_rows($resEmp); 

$ixx = 0;

while($datatmp = mysql_fetch_assoc($resEmp)) { 
$ixx = $ixx+1;
$data[] = array_merge($datatmp, array('num'=>$ixx));
}

$options = array(
'shadeCol'=>array(0.9,0.9,0.9),
'xOrientation'=>'center',
'width'=>500
); 

$pdf->ezText($txttit, 9);
$pdf->ezTable($data, $titles, '', $options);
$pdf->ezText("\n\n\n", 7);
$pdf->ezText("Fecha: ".date("d/m/Y"), 7);
$pdf->ezText("Hora: ".date("H:i:s")."\n\n", 7);
$pdf->ezStream(); 

?>

Para hacer que todo funcion basta con invocar al fichero que implemente este código y automáticamente se generará el PDF. A partir de aquí, solo tenemos que dejar volar nuestra imaginación para generar PDFs por ejemplo para obtener informes de usuarios o cualquier operación que registremos en nuestra base de datos.

Como siempre, espero que os sirva de ayuda.

COMENTARIOS

16-01-2016 20:32:17
Hola, tengo 6 columnas y dos de ellas son precios y quiero alinearlos a la derecha, como podria hacerlo?
25-01-2015 22:17:54
Hola Sorioco, fíjate en el ejemplo. Lee desde la base de datos una tabla llamada usuarios y utiliza los datos obtenidos para pintarlos en la tabla con ezpdf. EN tu caso simplemente leerías de una consulta SQL a través de ese inner join de tablas y los pintarías de la misma manera, lo único diferente es que los datos que tu obtienes serán los provenientes de ese inner join.
24-01-2015 00:47:30
I have been reading out many of your articles and i can claim pretty clever stuff. I will make sure to bookmark your website. ;)
23-01-2015 03:47:09
hola sergio, un buen post y felicitaciones, mira una consulta, como puedo insertar tabla con class.ezpdf.php consultando dos tabla relacionada desde la base de datos con un identificador (id), poniendo alguno campo de ese esas tabla que seleccione con inner join e imprimir en pdf en tabla.
10-01-2015 16:14:44
Puedes descargar el archivo desde este enlace
10-01-2015 00:24:43
No Pude descargar la librería si pudiesen subirlo en otro servidor se lo agradeceria mucho o si me lo pudiesen mandar a mi correo(mc_jc_@hotmail.es) mejor.. de antemano muchas gracias
30-07-2014 22:43:32
Hola @Angel, con tan pocos datos no se sabría decir. Ese fallo no indica nada. Parece ser algún tipo de fallo de decodificación pero no te sabría decir solo con eso :(
29-07-2014 18:58:53
Que tal, cuando despliego el PDF me salen unos caracteres que no son entendibles aqui una parte: 00'00) /Title (Mi archivo PDF) /Subject (alsuper.com) >> endobj 5 0 obj << /Type /Page /Parent 3 0 R /Annots [ 10 0 R ] /Contents [ 6 0 R 8 0 R ] >> endobj 6 0 obj << /Filter /FlateDecode /Length 321 >> stream x��R�N�0��+�X.�k;GTJ�"��M� �@��� ISPR/��ޙ�Lt��(��-j�!�@� F�f���#���H_�.�N�����6�|�4/��>3���p��g����:�����D9�*c�J���a�� �"q��a�Pz{Py�l��B��J����� ����! �:˝�H|{�E��gI�Zgj�0 Ա�� �.�г�^L�-�j��\bTBn�J�O9w� �S��И��Ő����A;M���A�sQM��yO��m[,�M^���KQ�e�e���\�=���4�ϕ7x��;���� No se por que pasa esto.
07-06-2014 17:15:30
Hola @Angel, ¿podrías ser algo mas concreto con tu problema? ¿que te ocurre exactamente?
06-06-2014 18:33:21
Una consulta yo no pueedo visualizar mis datos
19-06-2013 07:36:34
Es excelente Gracias!
09-04-2013 21:24:47
muchas gracias me ha sido de mucha ayuda

DEJA TU COMENTARIO