Personaliza tus reportes PDF desde PHP con la librería FPDF
En el artículo de Reportes básicos de PDF con la librería FPDF se demostró paso a paso desde la descarga, e incorporación de la librería FPDF para generar reportes con el lenguaje de programación PHP, en este artículo te mostraré como personalizar un reporte con un ejemplo básico y sencillo.
Lo primero que harás es importar el archivo fpdf.php dentro de nuestro archivo llamado reporte.php para así extender una clase hija la cual heredará las propiedades de la clase padre FPDF, como en el siguiente ejemplo:
<?php /* Author: Ing. Dick Díaz Delgado */ include 'fpdf.php'; // Incluímos la clase fpdf.php para poder utilizar sus métodos para generar nuestro pdf date_default_timezone_set('America/Lima'); //Configuramos el horario de acuerdo a la ubicación del servidor class PDF extends FPDF{ function Header() { $this->Image('img/logo.png', 12, 12, 25); //Insertamos el logo si es en PNG su calidad o formato debe estar entre PNG 8/PNG 24 $ancho = 190; $this->SetFont('Arial', 'B', 6); if($this->pagina == 1){ //Cuando el archivo está en Horizontal $horizontal = 85; //Permitirá que las dimensiones que abarca horizontalmente sea 85 puntos más que cuando es vertical $this->SetY(12); $this->Cell($ancho + $horizontal, 10,'Usuario: http://tucafejava.blogspot.com', 0, 0, 'R'); $this->SetY(15); $this->Cell($ancho + $horizontal, 10,'Fecha: '.date('d/m/Y'), 0, 0, 'R'); $this->SetY(18); $this->Cell($ancho + $horizontal, 10,'Hora: '.date('H:i:s'), 0, 0, 'R'); } else { $this->SetY(12); //Mencionamos que el curso en la posición Y empezará a los 12 puntos para escribir el Usuario: $this->Cell($ancho, 10,'Usuario: http://tucafejava.blogspot.com', 0, 0, 'R'); $this->SetY(15); $this->Cell($ancho, 10,'Fecha: '.date('d/m/Y'), 0, 0, 'R'); $this->SetY(18); $this->Cell($ancho, 10,'Hora: '.date('H:i:s'), 0, 0, 'R'); } } function Body() { $yy = 40; //Variable auxiliar para desplazarse 40 puntos del borde superior hacia abajo en la coordenada de las Y para evitar que el título este al nivel de la cabecera. $y = $this->GetY(); $x = 12; $this->AddPage($this->CurOrientation); $this->SetFont('helvetica', 'B', 20); //Asignar la fuente, el estilo de la fuente (negrita) y el tamaño de la fuente $this->SetXY(0, $y + $yy); //Ubicación según coordenadas X, Y. X=0 porque empezará desde el borde izquierdo de la página $this->Cell(220, 10, "Reportes Personalizados", 0, 1, 'C'); $this->SetFont('courier', 'U', 15); //Asignar la fuente, el estilo de la fuente (subrayado) y el tamaño de la fuente $y = $this->GetY(); $this->SetXY(0, $y); //Ubicación según coordenadas X, Y. X=0 porque empezará desde el borde izquierdo de la página $this->Cell(220, 10, "Lista de Alumnos", 0, 1, 'C'); $this->SetFont('arial', '', 8); //Asignar la fuente, el estilo de la fuente (subrayado) y el tamaño de la fuente $y = $this->GetY() + 8; $this->SetXY(10, $y); $this->MultiCell(12, 4, utf8_decode("Nº"), 1, 'C'); //Utilizamos el utf8_decode para evitar código basura o ilegible $this->SetXY(22, $y); //El resultado 22 es la suma de la posición 10 y el tamaño del MultiCell de 12. $this->MultiCell(73, 4, utf8_decode("Apellidos y Nombres"), 1, 'C'); $this->SetXY(95, $y); $this->MultiCell(40, 4, utf8_decode("Nº DNI"), 1, 'C'); $this->SetXY(135, $y); $this->MultiCell(35, 4, utf8_decode("Correo"), 1, 'C'); $this->SetXY(170, $y); $this->MultiCell(30, 4, utf8_decode("Teléfono"), 1, 'C'); $n = 1; while($n <= 5) { $y = $this->GetY(); $this->SetXY(10, $y); $this->MultiCell(12, 4, $n, 1, 'C'); $this->SetXY(22, $y); $this->MultiCell(73, 4, "", 1, 'C'); $this->SetXY(95, $y); $this->MultiCell(40, 4, "", 1, 'C'); $this->SetXY(135, $y); $this->MultiCell(35, 4, "", 1, 'C'); $this->SetXY(170, $y); $this->MultiCell(30, 4, "", 1, 'C'); $n++; } $y = $this->GetY(); $this->SetXY(10, $y); $this->Cell(190, 10, utf8_decode("Alineación a la derecha con 'R'"), 0, 1, 'R'); $y = $this->GetY(); $this->SetXY(10, $y); $this->Cell(190, 10, utf8_decode("Alineación a la derecha con 'L'"), 0, 1, 'L'); $y = $this->GetY(); $this->SetXY(10, $y); $this->Cell(190, 10, utf8_decode("Alineación centrado con 'C'"), 0, 1, 'C'); $y = $this->GetY(); $this->SetXY(10, $y); $this->Cell(190, 10, utf8_decode("Texto con Borde"), 1, 1, 'J'); $this->pagina = 1; $this->AddPage('L'); $this->pagina = 0; $this->AddPage('P'); $this->pagina = 1; $this->AddPage('L'); } function Footer() { $this->SetY(-10); $this->SetFont('Arial', 'I', 8); $this->Cell(0, 10, utf8_decode('Página ').$this->PageNo().'/{nb}', 0, 0, 'C'); if($this->CurOrientation == 'L') { //Se reconoce el tipo de Orientación de la página (Vertical = P|Horizontal = L) $this->SetX(0); $this->Cell(292, 10, utf8_decode('Creado por el '.$this->Author), 0, 0, 'R'); } else { $this->SetX(0); $this->Cell(205, 10, utf8_decode('Creado por el '.$this->Author), 0, 0, 'R'); } } } $pdf = new PDF(); $pdf->pagina = 0; $pdf->AliasNbPages(); //Permitir el conteo de la cantidad de páginas existentes {nb} $pdf->Body(); //Llamada a la función Body para generar el PDF $pdf->Output('ReporteEjemplo_TuCafeJava_'.date("d_m_Y_H_i_s"), 'I'); //El primer parámetro es para colocar el nombre del archivo al momento de ser descargado y el segundo parámetro es para abrir el archivo en el navegador con la opción para poder ser descargado ?>
Si deseas que tu reporte contenga la detalles en el pie de página es necesario agregar dentro de la función footer el siguiente código:
Permitiendote insertar los detalles en el pie de página de tus reportes. Debo hacer hincapié que, para la posición de cada elemento es necesario trabajar con coordenadas con las clásicas variables X, Y como quien recuerda la escuela como son las teorías de geometría analítica y del espacio.
Si deseas insertar una imagen como logo de tu reporte, utiliza la función Image(), no debes olvidar el direccionamiento a la carpeta o ubicación de la imagen en el caso de ser una url o servidor local. En la siguiente imagen puedes apreciar que el archivo logo.png se encuentra dentro de la carpeta img.
En el caso que se desee abrir el reporte a través de un botón y en una ventana nueva; el código de la página index.php la cual se encargará de contener la función que abrirá el reporte tendría el siguiente código.
El resultado del código anterior:
Espero haya sido de ayuda este artículo para la personalización de tus reportes de los proyectos que tienes desarrollando en entorno web, con esta potente librería y el lenguaje de programación PHP puedes hacer maravillas, no te olvides dejar tu comentario o tal vez una opinión para seguir mejorando nuestro blog, o compartirlo en tus redes sociales. Agradecido por anticipado por el apoyo.
<?php $this->SetY(-10); $this->SetFont('Arial', 'I', 8); $this->Cell(0, 10, utf8_decode('Página ').$this->PageNo().'/{nb}', 0, 0, 'C'); if($this->CurOrientation == 'L') { //Se reconoce el tipo de Orientación de la página (Vertical = P|Horizontal = L) $this->SetX(0); $this->Cell(292, 10, utf8_decode('Creado por el '.$this->Author), 0, 0, 'R'); } else { $this->SetX(0); $this->Cell(205, 10, utf8_decode('Creado por el '.$this->Author), 0, 0, 'R'); } ?>
Permitiendote insertar los detalles en el pie de página de tus reportes. Debo hacer hincapié que, para la posición de cada elemento es necesario trabajar con coordenadas con las clásicas variables X, Y como quien recuerda la escuela como son las teorías de geometría analítica y del espacio.
Si deseas insertar una imagen como logo de tu reporte, utiliza la función Image(), no debes olvidar el direccionamiento a la carpeta o ubicación de la imagen en el caso de ser una url o servidor local. En la siguiente imagen puedes apreciar que el archivo logo.png se encuentra dentro de la carpeta img.
En el caso que se desee abrir el reporte a través de un botón y en una ventana nueva; el código de la página index.php la cual se encargará de contener la función que abrirá el reporte tendría el siguiente código.
Reporte Básico con FPDF Abrir en una nueva pestaña
Abrir en una nueva ventana popup con tamaño definido
Abrir en una nueva ventana popup maximizado
Abrir en una nueva pestaña utilizando la etiqueta de hipervínculo En el caso de utilizar bootstrap puedes personalizarlo
Generar reporteEl resultado del código anterior:
Espero haya sido de ayuda este artículo para la personalización de tus reportes de los proyectos que tienes desarrollando en entorno web, con esta potente librería y el lenguaje de programación PHP puedes hacer maravillas, no te olvides dejar tu comentario o tal vez una opinión para seguir mejorando nuestro blog, o compartirlo en tus redes sociales. Agradecido por anticipado por el apoyo.
Clic aquí para descargar el código de este artículo.
yo quiero que mi reporte me muestre en una ventana nueva
ResponderEliminarListo ya lo actualicé para que puedas trabajarlo según la consulta que me hiciste Reyler.
EliminarSaludos,
¿Cómo se le haría con conexión a MySQL? si yo tengo la siguiente base de datos
ResponderEliminarCREATE TABLE estudiante(
id_alumno INT NOT NULL AUTO_INCREMENT,
nom_alumno VARCHAR(250) NOT NULL,
ape_alumno VARCHAR (250) NOT NULL,
doc_alumno VARCHAR(8) NOT NULL,
correo VARCHAR(250) NOT NULL,
telefono VARCHAR(20),
PRIMARY KEY (id_alumno) )
Qué tal estimado Andrey, adjunto el link del artículo donde lo puedes descargar...
Eliminarhttps://tucafejava.blogspot.com/2019/12/realiza-tus-reportes-pdf-con-conexion.html
Buenas tardes. Estoy haciendo pruebas con el codigo. Al momento de imprimir mas de 60 registros, se generan varias paginas. Por lo que veo es que no se ajusta la ultima fila del reporte, por lo cual genera muchas hojas. Podrias apoyarme a resolver esa parte? ...
EliminarBuenas tardes. He estado utilizando tu codigo, pero al momento de imprimir mas de 60 o 70 registros, se desajusta el formato, podrias apoyarme?. Lo que pasa es que al momento de imprimirlo genera varias hojas y en la ultima hoja, continua con todo normal. Espero puedas apoyarme.
ResponderEliminarSaludos.
Cómo puedo visualizar tu código, Erwin para poder apoyarte.
EliminarQue tal Dick, muy buenas tardes. No se si tengas algún correo para poder enviártelo?, de hecho con el que tienes posteado aqui, le hice una modificacion en la parte del while($n <= 5), aqui le puse 100 y cuando pongo esa cantidad se descuadra. Así tambien estoy haciendo una consulta desde mysql para un reporte y cuando pongo otra tabla abajo de la primera, se encima y no agrega el salto.
Eliminarte anexo el codigo que tengo actualmente aqui pegado y si tienes algun correo con gusto puedo hacertelo llegar.
dirrick9@gmail.com disculpa la demora deje un poco olvidado la página.
Eliminarlograron solucionar ese problema ?
Eliminarhola que tal buena noche... y o quiero que mi reporte salga el nombre del usuario loggeado como puedo hacerlo
ResponderEliminarHola que tal buena noche, me gustaria que en mi reporte dijera el nombre del usuario que se logueo, como puedo hacerlo?
ResponderEliminarhola que tal buena noche... y o quiero que mi reporte salga el nombre del usuario loggeado como puedo hacerlo
ResponderEliminarDebes crear una sesión de logueo y al momento de generar el reporte obtener ésta información del usuario que está realizando el reporte para poder colocar sus datos en la parte superior o donde desees.
EliminarHola que tal, excelente información, me gustaría resolver una duda, si tengo muchas columnas para mostrar en el reporte, cómo se haría para que muestre por ejemplo, 3 columnas y sus registros, después abajo otras 3 columnas y sus registros, etc..?
ResponderEliminarPara que después puedas piezarlo o pegarlo y sea una sola? a eso te refieres. Saludos,
EliminarHola! Me da error cuando las paginas son mas de 2! a partir de la pagina 2 no sigue el mismo formato ya que hace saltos de columnas una columna por pagina en total llega al maximo de paginas 103 aunque solo sean 5 paginas en la base de datos me podrias ayudar?
ResponderEliminarClaro sería definir un tope para poder hacer un salto de línea.
EliminarExcelente aporte! Me ha servido de maravilla en mi sistema muchisimas gracias!!
ResponderEliminarDe nada, siempre apoyando a la comunidad de programadores.
EliminarMe ayudo muchísimo este código, mil gracias por tu ayuda!!
ResponderEliminarMe alegra, fue un placer. Saludos,
Eliminarayuda necesito el problema 3 escribir un programa que acepte fechas escritas de modo usual y las visualice como tres números me ayudaria mucho si lo muestran en pseint
ResponderEliminarDisculpa pero no logro identificar el problema 3.
EliminarAspirolrui1988 Jodi Williams https://marketplace.visualstudio.com/items?itemName=7obrotigi.SCATch--The-Painter-Cat-gratuita
ResponderEliminarmolougepu