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:
<?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 reporte

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.

Clic aquí para descargar el código de este artículo. 

Comentarios

  1. yo quiero que mi reporte me muestre en una ventana nueva

    ResponderEliminar
    Respuestas
    1. Listo ya lo actualicé para que puedas trabajarlo según la consulta que me hiciste Reyler.

      Saludos,

      Eliminar
  2. ¿Cómo se le haría con conexión a MySQL? si yo tengo la siguiente base de datos
    CREATE 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) )

    ResponderEliminar
    Respuestas
    1. Qué tal estimado Andrey, adjunto el link del artículo donde lo puedes descargar...
      https://tucafejava.blogspot.com/2019/12/realiza-tus-reportes-pdf-con-conexion.html

      Eliminar
    2. 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? ...

      Eliminar
  3. Buenas 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.

    Saludos.

    ResponderEliminar
    Respuestas
    1. Cómo puedo visualizar tu código, Erwin para poder apoyarte.

      Eliminar
    2. Que 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.

      te anexo el codigo que tengo actualmente aqui pegado y si tienes algun correo con gusto puedo hacertelo llegar.

      Eliminar
    3. dirrick9@gmail.com disculpa la demora deje un poco olvidado la página.

      Eliminar
    4. lograron solucionar ese problema ?

      Eliminar
  4. hola que tal buena noche... y o quiero que mi reporte salga el nombre del usuario loggeado como puedo hacerlo

    ResponderEliminar
  5. Hola que tal buena noche, me gustaria que en mi reporte dijera el nombre del usuario que se logueo, como puedo hacerlo?

    ResponderEliminar
  6. hola que tal buena noche... y o quiero que mi reporte salga el nombre del usuario loggeado como puedo hacerlo

    ResponderEliminar
    Respuestas
    1. Debes 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.

      Eliminar
  7. Hola 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..?

    ResponderEliminar
    Respuestas
    1. Para que después puedas piezarlo o pegarlo y sea una sola? a eso te refieres. Saludos,

      Eliminar
  8. Hola! 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?

    ResponderEliminar
    Respuestas
    1. Claro sería definir un tope para poder hacer un salto de línea.

      Eliminar
  9. Excelente aporte! Me ha servido de maravilla en mi sistema muchisimas gracias!!

    ResponderEliminar
  10. Me ayudo muchísimo este código, mil gracias por tu ayuda!!

    ResponderEliminar
  11. ayuda 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

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Practica de Diagrama de Flujo Intermedio - Resueltos

Ejercicios Básicos para aprender a programar en Android Studio [Java y Kotlin]