Sei sulla pagina 1di 13

Generar PDF con PHP y MySQL

13 agosto 2007 | 448 comentarios | Sin categora

Tags: box.net, MySQL, pdf, PHP, PNG

El presente ejemplo explica como generar un reporte en PDF extrayendo datos de MySQL
utilizando PHP. Este ejemplo lo hacemos aprovechando el post anterior en el cual
explicbamos como obtener datos de base de datos MySQL. Para la generacin de PDF
utilizaremos la clase R&OS: pdf class de la cual ya hemos comentado en Generar PDF con
PHP.

Crear el documento PDF


Lo primero es crear una instancia para la creacin del documento PDF, para ello incluimos la
libreraclass.ezpdf.php, luego creamos una variable del tipo Cezpdf en donde definimos el
tipo de papel A4, luego definimos la fuente y los margenes.
[php]
require_once(class.ezpdf.php);
$pdf =& new Cezpdf(a4);
$pdf->selectFont(../fonts/courier.afm);
$pdf->ezSetCmMargins(1,1,1.5,1.5);
[/php]
Obtenemos los registros desde MySQL
Ahora procedemos a extraer los registros de nuestra base de datos, en este caso solo
obtenemos el nombre, direccin y telefono de la tabla empresa de nuestra base de datos.
[php]
$conexion = mysql_connect(localhost, usuario, clave);
mysql_select_db(demo, $conexion);
$queEmp = SELECT nombre, direccion, telefono FROM empresa;

$resEmp = mysql_query($queEmp, $conexion) or die(mysql_error());


$totEmp = mysql_num_rows($resEmp);
[/php]
Creando el array de datos, ttulos y opciones
A continuacin procedemos a crear matrices que luego utilizaremos en la creacin de nuestro
PDF, en el caso que deseemos incluir una tabla con con datos debemos crear una matriz con
estos datos, en nuestro caso asignamos los resultados de la consulta y le agregamos un
campo adicional con un numero correlativo. Lo siguiente es crear la matriz con los nombres
de la tabla, en este caso llamamos a esta matriz $titles en donde a cada campo agregado a
la matriz de datos le hacemos corresponder un nombre que aparecer como titulo de la fila.
La tercera matriz indica los colores de las celdas, la orientacin y el ancho de la tabla.
[php]
$ixx = 0;
while($datatmp = mysql_fetch_assoc($resEmp)) {
$ixx = $ixx+1;
$data[] = array_merge($datatmp, array(num=>$ixx));
}
$titles = array(
num=>Num,
nombre=>Empresa,
direccion=>Direccion,
telefono=>Telefono
);
$options = array(
shadeCol=>array(0.9,0.9,0.9),
xOrientation=>center,
width=>500
);
[/php]
Imprimiendo los Resultados
Una vez que tenemos todos los datos preparados procedemos a generar el PDF con toda la
informacin que deseamos. Iniciamos esto creando un titulo y subtitulo de texto, luego
escribimos los resultados de la consulta con la funcin ezTable a la cual se pasamos los
datos, ttulos y opciones. Finalmente al final del documento agregamos la fecha y hora de la
generacin del documento.
[php]
$txttit = BLOG.UNIJIMPE.NET\n;
$txttit.= Ejemplo de PDF con PHP y MYSQL \n;
$pdf->ezText($txttit, 12);
$pdf->ezTable($data, $titles, , $options);
$pdf->ezText(\n\n\n, 10);
$pdf->ezText(Fecha: .date(d/m/Y), 10);
$pdf->ezText(Hora: .date(H:i:s).\n\n, 10);

$pdf->ezStream();
[/php]
Unimos todos estos bloques y tenemos listo nuestro script para generar reportes en PDF,
pueden ver el ejemplo funcionando en php-mysql.php. Para finalizar les dejo los archivos del
ejemplo para que lo prueben y modifiquen a sus necesidades.

Posts Relacionados

PDFs con fondo utilizando PHP

Crear PDF con Imagenes en PHP

PHP and MySQL by Example

Convertir HTML a PDF con PHP

Generar PDF con PHP

Comentarios

Total 448 comentarios

Lorenin
Publicado: 13/04/2012 11:37 am

COMO INSERTAR UNA IMAGEN EN EL ENCABEZADO DEL REPORTE , me aparece el espacio d la


imagen pero no la imagen
por fa !!!
alguien q tenga conocimiento de hacer esto gracias !!!

Juan
Publicado: 13/04/2012 9:49 pm

Hola disculpa tengo un problema a la hora de correrlo lo descargue y si me corre excelente


pero le hice unas modificaciones y me sale muchos errores no se que hacer ya le he colocado
y quitado varias cosas pero no se.. este es mi correo juancgarciaf@gmail.com por favor
cualquier ayuda me llegara de buena ayuda gracias!

Paola Cardenas Cruz


Publicado: 18/04/2012 12:56 pm

Muy buen tutorial, toda la informacin es muy buena y fcil

daniel alejandro mejia sabogal


Publicado: 29/04/2012 7:10 pm

Crear una tabla que contenga el id, nombre, sexo, fecha de nacimiento, ciudad de nacimiento
y ciudad de residencia de varias personas.

luis
Publicado: 09/05/2012 3:48 pm

para que pueda imprimir el pdf debo tener un juego de registro me imagino, y para que de la
opcion algun boton para imprimir no?,pues no se si el codigo para imprimir va en la pagina
donde tengo mi juego de registro

Enmanuel
Publicado: 09/05/2012 9:18 pm

me sale crea el pdf pero me sale la tabla sin los registros: mi codigo es este, soy muy novato,
por fa me podrian ayudar
selectFont(../fonts/courier.afm);
$pdf->ezSetCmMargins(1,1,1.5,1.5);
$conexion = mysql_connect(localhost,root,);
mysql_select_db(agem2, $conexion);
$queEmp = SELECT codigo, descripcion, sig FROM obras;
$resEmp = mysql_query($queEmp, $conexion) or die(mysql_error());
$totEmp = mysql_num_rows($resEmp);
$ixx = 0;
while($datatmp = mysql_fetch_assoc($resEmp)) {
$ixx = $ixx+1;
$data[] = array_merge($datatmp, array(num=>$ixx));
}
$titles = array(
num=>Num,
codigo=>CODIGO,
descripcion=>Descripcion,
sig=>Signatura
);
$options = array(

shadeCol=>array(0.9,0.9,0.9),
xOrientation=>center,
width=>600
);
$txttit = Espacio\n;
$txttit = .\n;
$txttit.= Reporte de Contrato de obras\n;
$pdf->ezText($txttit, 12);
$pdf->ezTable($data, $titles, , $options);
$pdf->ezText(\n\n\n, 10);
$pdf->ezText(Fecha: .date(d/m/Y), 10);
$pdf->ezText(Hora: .date(H:i:s).\n\n, 10);
$pdf->ezStream();
?>

Roberto
Publicado: 11/05/2012 11:02 am

Hola, exelente la explicacin, muchas gracias. Necesitara que me ayuden con algo.
Si lo que quiero es imprimir solo 1 conjunto de datos de un solo registro filtrado por un ID,
como debo crear la query?.
Por ej: Inserto datos en nuevo registro en mi pagina PHP, menos ID que es automtico y
antes o despus de guardar los datos en mi base mysql, al presionar el botn imprimir me
crear un informe en pdf con los campos cargados en ese momento junto al campo ID.
Esto se puede hacer?
Muchas gracias.

Roberto
Publicado: 11/05/2012 5:01 pm

Hola nuevamente, ya lo solucion:


$rst_ordenes = SELECT * FROM nuevao WHERE orqu=.$_REQUEST[cod].;;
$fila_orden = mysql_query($rst_ordenes,$conexion) or die(mysql_error());
while($datatmp = mysql_fetch_assoc($fila_orden)) {
$data[] = array_merge($datatmp);

Aclaro, la variable cod es un campo que traigo desde otro marco. Esa me da el numero de
registro que quiero ver y automaticamente me genera solo los datos de ese registro en el
PDF. Gracias de todas formas.

Reinaldo
Publicado: 16/05/2012 10:14 pm

Hola tengo un gran problema yo realice varios reportes con la clase ezpdf y funcionas super
bien cuando estoy en un localhost pero al subirlo al servido donde monte mi aplicacin los
pdfs dejaron de funcionar me dice q ocurri un error en la raz si puede ayudarme se lo
agradezco muchsimo

miguek
Publicado: 24/05/2012 6:18 pm

nesesito contar la cantidad de df que me generan y ademas que me imprima ese valor en el
pdf algo asi como un auto resolutorio gracias de antemano por leeer esta inquietud

miguel avellaneda
Publicado: 24/05/2012 6:22 pm

hola oye mira tengo una aplicacion que me genera un pdf pero nescesito que me genere
ademas del pdf me cuante cuantos pdf han salido y ese numero me lo imprima en una parte
de el documento pdf (bueno eso es lo sencillo ) pero el numero de pdf generados tiene que
ser un consecutovo espero que me puedan ayudar .. desde Colombia miguel gracias
gracias gracias

Enrique Ardavin
Publicado: 28/05/2012 8:46 am

no me llena la tabla, sale todo desconfigurado.

Enrique Ardavin
Publicado: 28/05/2012 8:49 am

ademas estaba aciendo prueba con solo lineas de texto, pero me sobrepone cada linea una
encima de otra

Juan Reinoso
Publicado: 11/06/2012 2:52 am

Que tal unijimpe muy buen post, me ha servido de mucho para generar los archivos pdf con
la funcion indicada, tengo un problema estoy colocando imagenes para emcabezado y pie de
pagina, pero al colocar los datos dinamicos que superen la hoja me envia la imagen a una
segunda hoja. mi pregunta, Existe alguna forma de dejar una imagen fija(pie de pag) que por
mas que envie datos no se me reacomode dinamicamente.
Gracias por tu ayuda, en espera de tus cometarios.

yahiri
Publicado: 15/06/2012 3:21 pm

muy buen aporte y adems muy bien explicado exlente!!!

ORIENTAL
Publicado: 03/07/2012 1:19 am

NECESITO GENERAR UN DOCUMENTO PDF, DESPUES DE CONSULTAR LA BASE DE DATO PARA


LUEGO IMPRIMIR EL MISMO ESTE ES MI CDIGO PARA CONSULTA DE LA BASE DE DATO
ir a inicio</h3
regresar</h3
function imprimir() {
if ((navigator.appName == Netscape)) { window.print() ;
}
else {
var WebBrowser = ;
document.body.insertAdjacentHTML(beforeEnd, WebBrowser); WebBrowser1.ExecWB(6, -1);
WebBrowser1.outerHTML = ;
}
}

Imprimir

Karina
Publicado: 16/07/2012 10:07 am

El codigo me funciona perfecto el problema es que imprime en el pdf el doble de los registros
que en realidad tengo en la BD, es decir si tengo solo dos registros en el pdf se muestran 4 y
con el NUM 1,2,3,4, pareciera que contara 4 vecces, alguien me puede ayduar solo tengo dos
registros en la tabla.

Evi
Publicado: 24/07/2012 2:15 am

El problema es q no me imprime el primer campo de la consulta SQL


Codigo:
selectFont(./fonts/Helvetica.afm);
$pdf->ezSetMargins(50,70,50,50);
$pdf->ezSetCmMargins(1,1,1.5,1.5);
$pdf->ezText(Hello World!,10);
// $ide = $_GET[ide];
// @$idp = $_GET[idp];
$idp=4;
$sqlo=SELECT * FROM obj WHERE IdPer = $idp;
$consul = mysql_query ($sqlo, $conexion) or die(mysql_error());
$rs = mysql_fetch_array($consul);
$filas = mysql_num_rows($consul);
$cantobj=0;
while($datatmp = mysql_fetch_assoc($consul)){
$cantobj = $cantobj+1;
$data[] = array_merge($datatmp, array(IdObj=>$cantobj));
}
$titles = array(
IdObj=>ID,
Descrip=>Descripcin,
Pond=>Ponderacin,
PMed=>Parametro medicin,
Obj=>Objetivo,

PBase=>Periodo Base,
Result=>Resultado,
PCump=>Porcentaje cumpliento,
NPrest=>Nivel prestacion,
Punt=>Puntaje
);
$options = array(
shadeCol=>array(0.9,0.9,0.9),
xOrientation=>center,
width=>750
);
$txttit = BLOG.UNIJIMPE.NET\n;
$txttit.= Ejemplo de PDF con PHP y MYSQL \n;
$pdf->ezText($txttit, 20);
$pdf->ezTable($data, $titles, , $options);
$pdf->ezText(\n\n\n, 10);
$pdf->ezText(Fecha: .date(d/m/Y), 10);
$pdf->ezText(Hora: .date(H:i:s).\n\n, 10);
$pdf->ezStream();
?>
Gracias!

Oscar
Publicado: 24/08/2012 6:21 pm

A mi no me muestra nada cuando quiero imprimir los resultados que traigo de una base de
datos ORACLE

eduardo
Publicado: 16/09/2012 10:33 pm

bien unijimpe andaba sufriendo con esta chunche e probado un monton


y tu ejemplo esta facil de entender, gracias

Dyana
Publicado: 15/10/2012 4:37 pm

por favor me puede ayudar como hago para q la imagen que puse en el pdf me salga en la
parte superior como logo tipo a me sale abajo ayude pleasess

Leumanclar
Publicado: 17/10/2012 11:12 am

Hola:
Sinceramente me has ayudado mucho con tus posts, pero ahora me detuve por lo siguiente:
Como puedo poner datos filtrados de una tabla?.
Normalmente he puesto todos los datos de una tabla, pero ahora estoy en un trabajo que
tengo que imprimir en PDF solo los datos de un determiado usuario.
Ojala pudieras ayudarme con alguna idea.
Saludos y gracias.

miguel
Publicado: 31/10/2012 9:59 am

HOLA AYUDA POR FAVOR CON LOS LINKS DE DESCARGA, NO FUNCIONAN DIRIGEN A UNA
PAGINA DONDE SALEN OTRAS COSAS NADA QEU VER CON EL MATERIAL GRACIAS POR LAS
RESPUESTAS

erika
Publicado: 02/11/2012 9:21 am

hola buen dia queria saber si me pueden ayudar tengo que hacer reportes con la libreria
mpdf desde una base de dato posgrets para ver si me puedes dar un pequeo ejemplo
para guiarme

wilmer gutierrez
Publicado: 20/11/2012 7:50 am

hola muy bueno el articulo, pero tengo un problema cuando existen mas de 30 registros en la
tabla ya no me genera el pdf me sale el mensaje de archivo corrupto, por fa me puedes
enviar a mi correo la solucion a ese problema

romero
Publicado: 28/11/2012 4:59 pm

hay una manera de mandar a impresora con ezpdf

Luis
Publicado: 03/12/2012 9:54 pm

Alguien tiene un cdigo para imitar un header, body y footer con esta clase para hacer pdf?

Sergio A
Publicado: 18/01/2013 7:26 pm

Hola, me podran ayudar, quisiera saber como puedo visualizar el reporte por medio de un
botn. O si hay otra forma, porque para ver lo tengo que ejecutarlo desde el phpmyadmin.!!
espero y me puedan ayudar. Gracias

edwinsg
Publicado: 21/01/2013 9:12 am

Buen da, tengo un problema al generar reportes con fpdf y ocurre cuando la consulta que
tengo excede cierta cantidad de registros que hacen que el resultado deba utilizar ms de
una pgina, stos se descuadran automticamente, me explico: si una consulta que realizo
lleva 20 registros estos los mostrar en una sla pgina y saldr perfecta la tabla; pero
cuando exceden y hace que deba ocupar ms pginas todo el reporte se daa, me muestra
en pantalla los resultados pero totalmente descuadrados los resultados. Si me pueden ayudar
con este problema se los agradeceria pues llevo ya mucho tiempo consultando en la red y no
he podido encontrar solucin a este problema. de atenmano agradezco la colaboracin que
me puedan brindar.

puma
Publicado: 13/02/2013 4:56 pm

hla a todos kisiera k me digeran como centro el titutlo de la tabla que se genera

Alejandro Cascante
Publicado: 14/02/2013 11:27 pm

Hola unijimpe: sabes cmo poder asignarle un nombre al archivo PDF que estamos
generando? Ya que por default ahora sale file.pdf.
Gracias es un excelente tutorial y muy til!!!

edgar
Publicado: 24/03/2013 12:38 pm

Es cierto que tiene errores pero no son grabes so es por la conexin y el nombre de la tabla
pero eso es fcil de corregir y por eso menciono la palabra editar gracias por el ejemplo me
servir de mucho y si funciona bueno amenos a mi si me funciono.
aqu esta lo nico que correg ya que lo estoy probando con xampp
la tabla en mysql la tengo con el nombre demo por eso en el select db tengo demo.
$conexion = mysql_connect(localhost, root, );
mysql_select_db(demo, $conexion);
$queEmp = SELECT nombre, direccion, telefono FROM empresa ORDER BY nombre ASC;
$resEmp = mysql_query($queEmp, $conexion) or die(mysql_error());
$totEmp = mysql_num_rows($resEmp);

Martin Muoz
Publicado: 24/04/2013 10:50 am

La solucin al problema de acentos la tiene Oscar y ami me funciono de inmediato cambiaron


esos caracteres por los acentos.
Gracias a ti y a Hector por la solucin

les pongo su comentario de Oscar por si alguien no lo encuentra.


Ok ahora les comento la solucion a los problemas con los acentos. En el archivo class.pdf.php
hay que agregar el codigo:
$text = utf8_decode($text);
Pero antes de hacer eso se cambian los permisos del archivo para que permita escritura,
porque por default viene con solo lectura, despues nos vamos a la linea 2156, donde
encontramos el codigo siguiente:
function addText($x,$y,$size,$text,$angle=0,$wordSpaceAdjust=0){
if (!$this->numFonts){$this->selectFont(./fonts/Helvetica);}
agregamos la linea que ya les mencione, quedando asi:
function addText($x,$y,$size,$text,$angle=0,$wordSpaceAdjust=0){
$text = utf8_decode($text);
if (!$this->numFonts){$this->selectFont(./fonts/Helvetica);}
guardamos y eso es todo, los acentos se mostraran de forma correcta. Los creditos son para
un cuate llamado Hector en un post que lei por el internet. Saludos a todos.

Silvia
Publicado: 08/05/2013 6:44 pm

Muy buen aporte, tengo un problema espero y me puedan ayudar, la descarga de mis
reportes estubo trabajando bien dentro de un servidor local, pero al momento de migrarlo a
otro me dice que mi archivo es corrupto o invalido a que se debe, agradeceria si me ayudan
a solucionarlo

Mauro
Publicado: 19/05/2013 5:19 pm

Hola, me funciona a la perfeccin! pero como puedo hacer para levantar datos de dferentes
tablas? Gracias

Potrebbero piacerti anche