:::: MENU ::::

Generar PDF con PHP y MySQL

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 explicábamos como obtener datos de base de datos MySQL. Para la generación de PDF utilizaremos la clase R&OS: pdf class de la cual ya hemos comentado en Generar PDF con PHP.

pdf-php-mysql.gif

Crear el documento PDF
Lo primero es crear una instancia para la creación del documento PDF, para ello incluimos la librería class.ezpdf.php, luego creamos una variable del tipo Cezpdf en donde definimos el tipo de papel A4, luego definimos la fuente y los margenes.

require_once('class.ezpdf.php');
$pdf =& new Cezpdf('a4');
$pdf->selectFont('../fonts/courier.afm');
$pdf->ezSetCmMargins(1,1,1.5,1.5);

Obtenemos los registros desde MySQL
Ahora procedemos a extraer los registros de nuestra base de datos, en este caso solo obtenemos el nombre, dirección y telefono de la tabla empresa de nuestra base de datos.

$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);

Creando el array de datos, títulos y opciones
A continuación procedemos a crear matrices que luego utilizaremos en la creación 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 orientación y el ancho de la tabla.

$ixx = 0;
while($datatmp = mysql_fetch_assoc($resEmp)) { 
	$ixx = $ixx+1;
	$data[] = array_merge($datatmp, array('num'=>$ixx));
}
$titles = array(
				'num'=>'<b>Num</b>',
				'nombre'=>'<b>Empresa</b>',
				'direccion'=>'<b>Direccion</b>',
				'telefono'=>'<b>Telefono</b>'
			);
$options = array(
				'shadeCol'=>array(0.9,0.9,0.9),
				'xOrientation'=>'center',
				'width'=>500
			);

Imprimiendo los Resultados
Una vez que tenemos todos los datos preparados procedemos a generar el PDF con toda la información que deseamos. Iniciamos esto creando un titulo y subtitulo de texto, luego escribimos los resultados de la consulta con la función ezTable a la cual se pasamos los datos, títulos y opciones. Finalmente al final del documento agregamos la fecha y hora de la generación del documento.

$txttit = "<b>BLOG.UNIJIMPE.NET</b>\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("<b>Fecha:</b> ".date("d/m/Y"), 10);
$pdf->ezText("<b>Hora:</b> ".date("H:i:s")."\n\n", 10);
$pdf->ezStream();

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.


441 Comentarios

  • Paola Cardenas Cruz |

    Muy buen tutorial, toda la información es muy buena y fácil

  • luis |

    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 |

    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 |

    Hola, exelente la explicación, muchas gracias. Necesitaría 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 automático y antes o después de guardar los datos en mi base mysql, al presionar el botón 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 |

    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 |

    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 aplicación los pdfs dejaron de funcionar me dice q ocurrió un error en la raíz si puede ayudarme se lo agradezco muchísimo

  • miguek |

    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 |

    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 |

    no me llena la tabla, sale todo desconfigurado….

  • Enrique Ardavin |

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

  • Juan Reinoso |

    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.

  • ORIENTAL |

    NECESITO GENERAR UN DOCUMENTO PDF, DESPUES DE CONSULTAR LA BASE DE DATO PARA LUEGO IMPRIMIR EL MISMO… ESTE ES MI CÓDIGO 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 |

    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 |

    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’=>’Descripción‘,
    ‘Pond’=>’Ponderación‘,
    ‘PMed’=>’Parametro medición‘,
    ‘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 |

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

  • eduardo |

    bien unijimpe andaba sufriendo con esta chunche e probado un monton
    y tu ejemplo esta facil de entender, gracias

  • Dyana |

    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 |

    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 |

    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 |

    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 pequeño ejemplo para guiarme

  • wilmer gutierrez |

    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

  • Luis |

    ¿Alguien tiene un código para imitar un header, body y footer con esta clase para hacer pdf?

  • Sergio A |

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

  • edwinsg |

    Buen día, 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 más de una página, éstos se descuadran automáticamente, me explico: si una consulta que realizo lleva 20 registros estos los mostrará en una sóla página y saldrá perfecta la tabla; pero cuando exceden y hace que deba ocupar más páginas todo el reporte se daña, 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 solución a este problema. de atenmano agradezco la colaboración que me puedan brindar.

  • Alejandro Cascante |

    Hola unijimpe: ¿sabes cómo 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 |

    Es cierto que tiene errores pero no son grabes so es por la conexión y el nombre de la tabla pero eso es fácil 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 Muñoz |

    La solución 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 solución

    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 |

    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 |

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

  • Mauro |

    Hola, me funciono bárbaro… pero estoy necesitando que se descargue, no que se muestre en el navegador… como podría ser eso? Gracias

  • FeNyMeR |

    Buenas,

    a la hora de generar el pdf me lo hace todo bien, pero no me introduce ningún dato dentro de ninguna celda. Dejo el código por si alguien me puede ayudar.

    selectFont(‘../fonts/courier.afm’);

    $pdf->ezSetCmMargins(1,1,1.5,1.5);

    $conexion = mysql_connect(“servidor”,”usuario”,”contraseña”);

    mysql_select_db(“db485819995″);

    $queEmp = “SELECT NUMERO_AVISO, ESTADO_AVISO, NUMERO_MAQUINA, AREA, UBICACION, NUMERO_DESPACHO, PERSONA_AVISO, NOMBRE_PC, AVERIA FROM incidencias”;

    $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(‘numero_aviso’=>$ixx));

    }

    $titles = array(

    ‘numero_aviso’=>’NUMERO_AVISO‘,
    ‘estado_aviso’=>’ESTADO_AVISO‘,
    ‘numero_maquina’=>’NUMERO_MAQUINA‘,
    ‘area’=>’AREA‘,
    ‘ubicacion’=>’UBICACION‘,
    ‘numero_despacho’=>’NUMERO_DESPACHO‘,
    ‘persona_aviso’=>’PERSONA_AVISO‘,
    ‘nombre_pc’=>’NOMBRE_PC‘,
    ‘averia’=>’AVERIA‘,

    );

    $options = array(

    ‘shadeCol’=>array(0.9,0.9,0.9),

    ‘xOrientation’=>’center’,

    ‘width’=>500

    );

    $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();

    ?>

    Gracias de antemano,

    Un saludo

  • Yeison |

    hola a todos, me sucede algo curioso, en el localhost de mi equipo me funciona a las mil maravillas la generación del pdf con datos de BD , conexion a mysql y php… lo raro es que en el servidor , que es donde necesito que funcione me sale lo siguiente, (unos jeroglíficos algo extensos; agradezco a unijimpe a alguien que me pueda ayudar , mil gracias….

    %PDF-1.3 %âãÏÓ 1 0 obj <> endobj 2 0 obj <> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font <> /XObject <> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text /ImageC ] endobj 5 0 obj <> endobj 6 0 obj <> endobj 7 0 obj <> stream lœ8l{ÒEz”_p¨èÊ~µwËÂÊØ?ºÒÊtœ¼í ›HD|ÜY‚¨}i•M)Ö2müœžmn®-悜ݻþw]©àþ‰òþM[‡‡ß¥É\˜ ]ÃÒz’ÛÇêçy hjG€pO”m÷‰ Óñ§E™ÝXÝ|)ʦýR;~)#@Åøä(°7òœ¡Dn‰šõIJ³ãÂmrËWaR°¹7 n6ÙHœÚ™™ Ãy±V—bH·\m­4KΕõÁ äào`|ñâçE²qFÙõ8qWfß´¶ÈÒ¾ÿ‚b¤Šgç­[x'Üc…j&âKDèG”?c³ii†1\(ÅoÇÁÛ×@µÓ9<¿üAÿ…®Š*.OE¯©n1”7á¹ÏµWãã’y­87t3Ìåœcó ý~rdn¢ƒ8kWh8*"jâćípðÍé\2=ØO¡Ö2_¤`e Ê;!t¾Nù39‰L_Þ_E¦ÄC.Ãɺû€ ªoçþ~*|(lœ]N¨ÞZüŒî„˜R

  • Marcelo |

    Hola, muy buen tutorial.
    Lo seguí y me funciona correctamente, con varias páginas y varias consultas corriendo en cada una de ellas.
    Sólo tengo un inconveniente: tengo un campo dónde se almacena texto y en el .pdf sólo logro visualizar una parte de los caracteres almacenados: Hay alguna forma de ver la totalidad de los caracteres que contiene el campo?

    Gracias de antemano.

  • Paul_sds |

    esta clase me funciona muy bien cuando tengo pocos datos en mi TABLA, pero si tengo muchos datos sale error (“Este documento PDF podria no mostrarse correctamente”).

    Si me pueden ayudar les agradeceria mucho

  • luis |

    excelente mi amigo sencillo, y bien explicado ya que e buscado hoy todo el dia y ninguno me ayudaba gracias un buen aporte

Publica tu comentario

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.