Upload
oxmaykol18xo
View
190
Download
1
Embed Size (px)
Citation preview
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-MySQL-
PHP).
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. Un PDF con una hoja en blanco.2. El pie de página.3. El encabezado.4. Ingresar fecha desde el formulario.5. Agregar texto fijo en el PDF.6. 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. Un PDF con una hoja en blanco.
2. El pie de página.
3. El encabezado.
4. El texto fijo en el PDF.
5. 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:
<?php
require('libFPDF/fpdf.php');
/* * Se debe crear siempre una clase heredada de FPDF * y partir de aqui se irán agregando la cabecera * footer, cuerpo, etc * */
//Clase en blancoclass 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. Un PDF con una hoja en blanco.
2. El pie de página.
3. El encabezado.
4. El texto fijo en el PDF.
5. 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:
<?php
require('libFPDF/fpdf.php');
class PDF extends FPDF{ function Footer() // Pie de página { // Posición: a 1,5 cm del final $this->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. Un PDF con una hoja en blanco.
2. El pie de página.
3. El encabezado.
4. Agregar fecha.
5. El texto fijo en el PDF.
6. 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):
<?php
require('libFPDF/fpdf.php');
class PDF extends FPDF{ function Footer() // Pie de página { $this->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. Un PDF con una hoja en blanco.
2. El pie de página.
3. El encabezado.
4. Agregar fecha.
5. El texto fijo en el PDF.
6. 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):
<?php
require('libFPDF/fpdf.php');
class PDF extends FPDF{ function Footer() // Pie de página { $this->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 <img src="http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif?m=1129645325g" alt=":D" class="wp-smiley"> ',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):
<!--?php require('libFPDF/fpdf.php'); class PDF extends FPDF { function Footer() // Pie de página { $this--->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 <img src="http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif?m=1129645325g" alt=":D" class="wp-smiley"> ',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. 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).
3. 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
<!--?php require('libFPDF/fpdf.php'); class PDF extends FPDF { function Footer() // Pie de página { $this--->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 <img src="http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif?m=1129645325g" alt=":D" class="wp-smiley"> ',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.