Crear PDF desde PHP: Los ingredientes :D 02JUN Una vez explicado el problema a resolver, la explicación aquí……estará en la sgte hoja después de…==00 Doy por hecho de quien lee esto, tiene conocimientos básico-medio de POO en PHP, MySQL, HTML y CSS, además, conocimiento necesario de su software favorito de AMP (Apache-MySQLPHP). El código lo minimicé para dejar lo que interesa del uso de la librería.
AppServe en windows 7. Bajar zip de la librería FPDF del sitio oficial. Descomprimir en el proyecto de trabajo del directorio www y cambiar nombre a la carpeta, por comodidad (yo lo renombré libFPDF).
La estructura de mi directorio de trabajo es el siguiente:
Si quieres este directorio de trabajo, envíame correo a
[email protected] y con gusto te lo comparto
Ahora una explicación del contenido del directorio:
La carpeta css contiene los estilos y libFPDF, la librería. index.php tiene una opción en el menú llamada “Crear PDF”.
_____________________________________________________________________ crear_pdf.php contiene una caja de texto para ingresar la matrícula y unos combobox para elegir una fecha, el contenido es el siguiente:
_____________________________________________________________________ creaPDF.php es el encargado de generar el PDF usando la librería FPDF y es donde comenzaremos a trabajar. _____________________________________________________________________ Finalmente mysql.php es para la manipulación de base de datos y textoFijo.txt es un texto que será usado para ponerlo en el PDF _____________________________________________________________________ Pues bien, teniendo los ingredientes y un panorama más detallado de nuestro proyecto, el itinerario será el siguiente para generar:
1. 2. 3. 4. 5. 6.
Un PDF con una hoja en blanco. El pie de página. El encabezado. Ingresar fecha desde el formulario. Agregar texto fijo en el PDF. La tabla con los datos extraídos de la Base de Datos.
============000000000000000000000000====================================000
Crear PDF desde PHP: Página en blanco 05JUN Comenzaremos creando una página en blanco desde el proyecto PHP. Para esto, se debe crear una clase sin ningún atributo ni métodos que hereda de la super clase FPDF. La clase la nombramos a nuestro gusto en el archivo creaPDF.php y a partir de ésta, iremos creando los demás puntos: 1. 2. 3. 4. 5.
Un PDF con una hoja en blanco. El pie de página. El encabezado. El texto fijo en el PDF. La tabla con los datos extraídos de la Base de Datos.
Una vez escrita la clase, creamos un objeto. Veamos como queda el código para crear una página en blanco:
Se debe crear siempre una clase heredada de FPDF y partir de aqui se irán agregando la cabecera footer, cuerpo, etc */
//Clase en blanco class PDF extends FPDF { } $pdf = new PDF(); //Crea objeto PDF $pdf->AddPage('P', 'Letter'); //Agrega hoja, Vertical, Carta $pdf->Output(); //Salida al navegador ?>
La secuencia en pantallazos de como se genera el PDF:
La salida en Chrome y FireFox:
Bueno, hasta aquí el punto 1. En la próxima entrada mostraré el código para hacer pie de página. Es muy importante que veas los demás parámetros que pueden llevar los métodos y “jugar” con ellos para ver su funcionamiento en la salida.
Output( ) AddPage( ) Recomiendo que veas el manual en fpdf.org
============0000000000000000000000000000000000000
Crear PDF desde PHP: Pie de página 07JUN Sigamos, ahora toca hacer el punto 2:
1. 2. 3. 4. 5.
Un PDF con una hoja en blanco. El pie de página. El encabezado. El texto fijo en el PDF. La tabla con los datos extraídos de la Base de Datos.
El hecho de haber empezado por el pie de página se debe a que es el más sencillo de hacer, a su vez, tiene un método interesante para estudiar, se trata de Cell(). Los parámetros que tiene son variados y obviamente pueden ser usados como mejor nos convenga. Cell() es un método base, ya que sirve para imprimir texto en el PDF, dentro de una celda. Como ya he dicho, es importante “jugar” con los demás parámetros para ver su funcionamiento. Cambien los parámetros de Cell() y SetY() y vean el comportamiento, para ver los demás parámetros: Manual del sitio oficial Para diseñar nuestro pie de página, en la clase en blanco de la entrada anterior (Página en blanco) tenemos que crearle un método que ya está en definido en la librería FPDF que se llama Footer() y agregarle lo necesario para lograr nuestro diseño. Usaremos un celda con el borde superior activo, dentro de ésta habrá un texto y estará 1.5 cm del margen inferior. El código para generar el pie de página es el siguiente: SetY(-15); // Arial italic 8 $this->SetFont('Arial','I',8); /* Cell(ancho, alto, txt, border, ln, alineacion) * ancho=0, extiende el ancho de celda hasta el margen de la derecha * alto=10, altura de la celda a 10 * txt= Texto a ser impreso dentro de la celda * border=T Pone margen en la posición Top (arriba) de la celda * ln=0 Indica dónde sigue el texto después de llamada a Cell(), en este caso con 0, enseguida de nuestro texto * alineación=C Texto alineado al centro */ $this->Cell(0,10,'Este es el pie de página creado con el método Footer() de la clase creada PDF que hereda de FPDF','T',0,'C'); } } $pdf = new PDF(); //Crea objeto PDF $pdf->AddPage('P', 'Letter'); //Vertical, Carta $pdf->Output(); //Salida al navegador ?>
Cabe mencionar que he quitado los comentarios anteriores para despejar el código
.
Siguiente entrada: Encabezado (se abrirá en una pestaña nueva)
=============00000000000000000000000000=============================00000
Crear PDF desde PHP: Encabezado 11JUN Lo siguiente en la lista es el punto 3. 1. 2. 3. 4. 5. 6.
Un PDF con una hoja en blanco. El pie de página. El encabezado. Agregar fecha. El texto fijo en el PDF. La tabla con los datos extraídos de la Base de Datos.
Al inicio cuando tuve que hacer el encabezado como lo expliqué en la primera entrada, pensé en hacer una celda con cell(), poner los bordes de arriba y abajo activos y meter ahí el texto y las imágenes. Pero esta idea no fue la correcta =( Para solucionar esto, encontré entre las funciones del manual una que se llama Line(), la cual dibuja una línea (así de fácil
), de este modo, usé dos líneas paralelas y en seguida 3 celdas contiguas con cell():
En la primera, la imagen de la izquierda En la segunda está el texto y una imagen En la tercera, la imagen de la derecha. Cabe mencionar que los logotipos los edité para evitar cualquier tipo de inconveniente. Al igual que Footer() existe una clase que se llama Header() definida en la librería y en la cual se puede añadir lo que se requiera. Veamos en código lo que expliqué (quité los comentarios pasados para limpiar el código): SetY(-15); $this->SetFont('Arial','I',8); $this->Cell(0,10,'Este es el pie de página creado con el método Footer() de la clase creada PDF que hereda de FPDF','T',0,'C'); } function Header() //Encabezado { //Define tipo de letra a usar, Arial, Negrita, 15 $this->SetFont('Arial','B',9); /* Líneas paralelas * Line(x1,y1,x2,y2) * El origen es la esquina superior izquierda * Cambien los parámetros y chequen las posiciones * */ $this->Line(10,10,206,10); $this->Line(10,35.5,206,35.5); /* * * * * * * *
Explicaré el primer Cell() (Los siguientes son similares) 30 : de ancho 25 : de alto ' ' : sin texto 0 : sin borde 0 : Lo siguiente en el código va a la derecha (en este caso la segunda celda) 'C' : Texto Centrado $this->Image('images/logo.png', 152,12, 19) Método para insertar imagen
* * * * * * */
'images/logo.png' : ruta de la imagen 152 : posición X (recordar que el origen es la esquina superior izquierda) 12 : posición Y 19 : Ancho de la imagen (w) Nota: Al no especificar el alto de la imagen (h), éste se calcula automáticamente
$this->Cell(30,25,'',0,0,'C',$this->Image('images/logo.png', 152,12, 19)); $this->Cell(111,25,'ALGÚN TÍTULO DE ALGÚN LUGAR',0,0,'C', $this>Image('images/logoIzquierda.png',20,12,20)); $this->Cell(40,25,'',0,0,'C',$this->Image('images/logoDerecha.png', 175, 12, 19)); //Se da un salto de línea de 25 $this->Ln(25); } } $pdf = new PDF(); //Crea objeto PDF $pdf->AddPage('P', 'Letter'); //Vertical, Carta $pdf->Output(); //Salida al navegador
Ahora veamos el resultado de aplicar este código:
Encabezado
Vista miniatura de todo el documento Espero que sea de utilidad para sus proyectos. No olviden conocer y “jugar” con los parámetros de las funciones en el sitio oficial de la librería.
================00000000000000000000000000====================0000000
Crear PDF desde PHP: Fecha 12JUN El siguiente punto es el 4. 1. 2. 3. 4. 5. 6.
Un PDF con una hoja en blanco. El pie de página. El encabezado. Agregar fecha. El texto fijo en el PDF. La tabla con los datos extraídos de la Base de Datos.
En mi proyecto, la fecha requería que se estableciera antes de generar el PDF y un mismo documento creado podía tener varias fechas distintas. Para ver el bosquejo del documento que se está generando, vean la entrada donde lo explico. La línea de color naranja en el bosquejo es la fecha. Así que usaré los combobox que están en el HTML del archivo crear_pdf.php para obtener de ahí la fecha, los cuales tienen el atributo name de [dia, mes, anio] y que se recibirán por medio de POST en el archivo creaPDF.php. También algo interesante es que se va escribir texto sin necesidad de usar una clase como se hizo con Footer() y Header(), sino directamente con las funciones que ya se han visto y antes de mandar a llamar OutPut(). Veamos el código (recuerden que he quitado los comentarios de la entrada anterior, Encabezado):
SetY(-15); $this->SetFont('Arial','I',8); $this->Cell(0,10,'Este es el pie de página creado con el método Footer() de la clase creada PDF que hereda de FPDF','T',0,'C'); } function Header() //Encabezado { $this->SetFont('Arial','B',9); $this->Line(10,10,206,10); $this->Line(10,35.5,206,35.5); $this->Cell(30,25,'',0,0,'C',$this->Image('images/logo.png', 152,12, 19)); $this->Cell(111,25,'ALGÚN TÍTULO DE ALGÚN LUGAR

',0,0,'C', $this>Image('images/logoIzquierda.png',20,12,20));
$this->Cell(40,25,'',0,0,'C',$this->Image('images/logoDerecha.png', 175, 12, 19)); $this->Ln(25); } }//fin clase PDF /* En la variable $fecha se crea una cadena con datos * obtenidos de POST, la cual usaremos en un método Cell() **/ $fecha="México D.F. a ".$_POST['dia']." de ". $_POST['mes']. " de ".$_POST['anio']; $pdf = new PDF(); //Crea objeto PDF $pdf->AddPage('P', 'Letter'); //Vertical, Carta $pdf->SetFont('Arial','B',12); //Arial, negrita, 12 puntos /* Explicación: * 0 - La celda se extiende a todo lo ancho de la hoja * 10 - Alto de la celda * $fecha - la cadena a imprimir * 0 - sin borde (cambien a 1 y chequen el cambio) * 1 - Lo que sigue a la celda estará en la siguiente línea * 'R' - Texto alineado a la derecha * */ $pdf->Cell(0,10,$fecha,0,1,'R'); $pdf->Output();
//Salida al navegador
?>
Ahora veamos las capturas de pantalla de cómo queda:
Listo, ya podemos elegir una fecha antes de generar el PDF. Con esto concluye esta entrada. Me despido no si antes pedir de favor que comenten qué tal les ha parecido el mini tuto, ¿he explicado bien los temas?. Gracias Siguiente entrada(se abrirá en una pestaña nueva): Agregar texto fijo
Crear PDF desde PHP: Agregar texto fijo 15JUN Así es como se verá el avance que se explicará en esta entrada usando la librería fpdf y el lenguaje PHP:
PDF generado desde PHP Si has llegado hasta aquí habiendo visto las entradas anteriores, te darás cuenta que estamos en lo más interesante del mini-proyecto. Se ha realizado en los siguientes pasos:
Crear PDF desde PHP Crear PDF desde PHP: Los ingredientes Crear PDF desde PHP: Página en blanco Crear PDF desde PHP: Pie de página Crear PDF desde PHP: Encabezado Crear PDF desde PHP: Fecha Ya sólo falta agregar texto fijo y obtener registros de la base de datos. En esta ocasión explicaré como agregar un texto fijo desde un archivo de texto. Para esto, se creará un método dentro de nuestra clase PDF que llamaré ImprimirTexto. ImprimirTexto($txt), tiene como objetivo configurar el formato que tendrá el texto e imprimirlo dentro del PDF. Sin más, el código es el siguiente (quito los comentarios anteriores para despejar el código):
SetY(-15); $this->SetFont('Arial','I',8); $this->Cell(0,10,'Este es el pie de página creado con el método Footer() de la clase creada PDF que hereda de FPDF','T',0,'C'); } function Header() //Encabezado { $this->SetFont('Arial','B',9); $this->Line(10,10,206,10); $this->Line(10,35.5,206,35.5); $this->Cell(30,25,'',0,0,'C',$this->Image('images/logo.png', 152,12, 19)); $this->Cell(111,25,'ALGÚN TÍTULO DE ALGÚN LUGAR

',0,0,'C', $this>Image('images/logoIzquierda.png',20,12,20)); $this->Cell(40,25,'',0,0,'C',$this->Image('images/logoDerecha.png', 175, 12, 19)); $this->Ln(25); } function ImprimirTexto($file) { // Leemos el archivo de texto $txt = file_get_contents($file); /* * Arial - Fuente * '' - cadena vacía significa imrpimir el texto normal o * se puede poner en Negrita 'B', Italico 'I' o Subrayado 'U' * o una combinación de éstos. * 12 - tamaño de fuente * */ $this->SetFont('Arial','',12); /* * 0 - el ancho se ajusta al margen de la hoja * 5 - alto de la celda * $txt - Texto a imrpimir. * NOTA: Los valores para justificar el texto y celda sin borde * no los pasé, porque son valores por defecto del mismo método * * Pero quedaría así: MutiCell(0, 5, $txt, 0, 'J') * No olviden ver y 'jugar' con los parámetros **/ $this->MultiCell(0,5,$txt); } }//fin clase PDF $fecha="México D.F. a ".$_POST['dia']." de ". $_POST['mes']. " de ".$_POST['anio']; $pdf = new PDF(); //Crea objeto PDF $pdf->AddPage('P', 'Letter'); //Vertical, Carta $pdf->SetFont('Arial','B',12); //Arial, negrita, 12 puntos $pdf->Cell(0,10,$fecha,0,1,'R'); //Agrega la cadena $fecha /* Se hace un salto de línea * y se manda llamar el método de imprimir texto, * envíando como parámetro el nombre del archivo * que contiene el texto. * */ $pdf->Ln(); $pdf->ImprimirTexto('textoFijo.txt'); $pdf->Output(); ?>
//Salida al navegador
No olviden, insisto, “jugar” con los parámetros de los métodos. Alguna duda o comentario más personalizado:
===========================000000000000000000000000000
Crear PDF desde PHP: Agregar datos de la BD 20JUN Acá el final de cómo quedará nuestro PDF generado desde PHP:
PDF final generado desde PHP, con ayuda de la librería FPDF Como dije en un principio, las entradas de estos mini-tutos están enfocados a quienes tienen experiencia básica-media con PHP y la POO. Explico con más detalle la parte del uso de la librería que lo relacionado con la base de datos. Una vez hecha la aclaración, comencemos. El objetivo final del mini-proyecto es obtener datos de la BD e insertarlos en el PDF, dándole un formato de tabla. Para ello, se crearon tres métodos dentro de la clase PDF que hemos estado usando. 1.
Cabecera() : Crea la parte fija de la tabla, es decir, la que tiene los títulos de las columnas. Para ello se le envía como parámetro un array de cadenas (los títulos) y el método se encarga de poner cada elemento del array en una celda hasta terminar con todos sus elementos.
2.
3.
Datos() : Crea la parte dinámica de la tabla, con una llamada a la base de datos y el resultado obtenido con fetch_array_asoc le asigna una celda a cada fila obtenida, en este caso, debe regresar una sola fila (la fila de la matrícula buscada). Tabla() : Integra en un método los 2 métodos anteriores.
Cabe mencionar que los métodos 1. y 2. hacen prácticamente lo mismo pero por razones de claridad, los puse separados y los integré con un tercer método. De este modo es más fácil llamarlos en el código En general, el proyecto trae un solo registro de la base de datos, éste es, el que corresponde a la matrícula ingresada en el formulario. Se debe hacer una condicional para manipular errores de que si existe o no el registro. Por lo tanto, la condición que usé es:
Si la consulta con la matrícula buscada no obtiene ningún registro, regresará al index.php. En otro caso se genera el PDF con las instrucciones que se han planteado anteriormente.
La parte que está „enmarcada‟ con las líneas de asteriscos, es la llamada a la base de datos y la llamada a los métodos antes mencionados que generan la tabla. No comenté esta parte ya que sería repetitivo. A mi parecer queda bien definido lo que hace esa parte, pero sino, comenta tus dudas SetY(-15); $this->SetFont('Arial','I',8); $this->Cell(0,10,'Este es el pie de página creado con el método Footer() de la clase creada PDF que hereda de FPDF','T',0,'C'); } function Header() //Encabezado { $this->SetFont('Arial','B',9); $this->Line(10,10,206,10); $this->Line(10,35.5,206,35.5); $this->Cell(30,25,'',0,0,'C',$this->Image('images/logo.png', 152,12, 19)); $this->Cell(111,25,'ALGÚN TÍTULO DE ALGÚN LUGAR

',0,0,'C', $this>Image('images/logoIzquierda.png',20,12,20)); $this->Cell(40,25,'',0,0,'C',$this->Image('images/logoDerecha.png', 175, 12, 19)); $this->Ln(25); } function ImprimirTexto($file) { $txt = file_get_contents($file); $this->SetFont('Arial','',12); $this->MultiCell(0,5,$txt); } function cabecera($cabecera) { /* Se configura la primera celda * , en este caso, la celda que contiene "Nombre", * a la posición indicada (y de ahí para abajo * seguirán las demás celdas), no olvidar que el origen es la * esquina superior izquierda. * Así mismo la fuente, estilo y tamaño que tendrá cada celda * */ $this->SetXY(50,115); $this->SetFont('Arial','B',15); /* * * * * *
Se recibirá un array y se generará una celda por cada elemento del mismo con Cell(). El texto que contendrá la celda será cada elemento del array. Cell(40, 7, $columna, 1, 2, 'L')
* 40 - ancho de la fila * 7 - altura de la celda * $columna - texto a imprimir, es decir, elementos de array * 1 - la celda tendrá activo el borde completo * 2 - Cada nueva celda irá una debajo de la anterior * 'L' - Texto alineado a la izquierda * */ foreach($cabecera as $columna) { $this->Cell(40,7,$columna,1, 2 , 'L' ) ; } } /* Este método realiza lo mismo que cabecera, * la diferencia radica en el parámetro de los bordes * Arriba (T) * Derecha (R) * Abajo (B) * los bordes que estarán activos. * y el ancho de la celda (90) * */ function datos($datos) { $this->SetXY(90,115); $this->SetFont('Arial','',12); foreach ($datos as $columna) { $this->Cell(65,7,$columna,'TRB',2,'L' ); } } /* El método tabla integra a los métodos cabecera y datos * */ function tabla($cabecera,$datos) { $this->cabecera ($cabecera) ; $this->datos($datos); } }//fin clase PDF include('mysql.php'); $consulta = new mysql; $consulta->server = "localhost"; $consulta->user = "araceli"; $consulta->pass = "huguidugui"; //Cada quien tiene sus formas para ocultar esta información $consulta->connect(); $consulta->select("persona"); //Obtenemos la matricula introducida por el usuario $mat=$_POST['buscarMat']; //El query que se va a usar $cueri = "select Nombre, ApellidoPat, ApellidoMat, Matricula, Puesto, HorarioE, HorarioS FROM empleado WHERE Matricula='$mat'"; //Se asigna a un variable lo que se obtiene del método query $respuesta = $consulta->query($cueri); //Si la consulta tiene 0 resultados, regresar al index.php if(($consulta->f_num($respuesta)) == 0) { header('location:index.php'); } //Sino, generar todo lo que hemos hecho hasta ahora. //Y la tabla con los datos extraídos de la BD else { $fecha="México D.F. a ".$_POST['dia']." de ". $_POST['mes']. " de ".$_POST['anio']; $pdf = new PDF(); //Crea objeto PDF $pdf->AddPage('P', 'Letter'); //Vertical, Carta
$pdf->SetFont('Arial','B',12); //Arial, negrita, 12 puntos $pdf->Cell(0,10,$fecha,0,1,'R'); //Agrega la cadena $fecha $pdf->Ln(); $pdf->ImprimirTexto('textoFijo.txt'); //********************************************************************************************** $sql = $consulta->query($cueri); $fila = $consulta->f_array($sql); $cabecera = array("Nombre","A Paterno","A Materno", "Matricula", "Puesto","HorarioE","HorarioS"); $datos = array($fila['Nombre'], $fila['ApellidoPat'], $fila['ApellidoMat'],$fila['Matricula'],$fila['Puesto'],$fila['HorarioE'],$fila['HorarioS']); $pdf->tabla($cabecera,$datos); //********************************************************************************************** $pdf->Output();
//Salida al navegador
} ?>
Una secuencia de uso:
Una tabla de PhpMyAdmin
Buscar matrícula 30303030 con fecha 18 Octubre 2013
PDF generado Así termina este mini-proyecto
, espero que sea de utilidad en sus proyectos y si quieren el directorio de trabajo que
usé en este ejemplo, me lo pueden solicitar a
[email protected] No olviden “jugar” con los parámetros y visitar el sitio oficial de la librería para ver más métodos de la librería, así como ejemplos que la misma comunidad comparte. Las entradas que conforman el mini-proyecto en forma gradual son: Explicación, página en blanco, pie de página, encabezado, fecha, texto fijo.