Como integrar la libreria fpdf con el framework codeigniter

En el post del dia de hoy voy a explicar como se puede integrar la librería fpdf con el framework CodeIgniter si se desean generar reportes en PDF,  en el ejercicio se va a crear un reporte sencillo, si quieres profundizar un poco mas sobre la librería fpdf echarle un vistazo a nuestro post Crear un reporte con FPDF usando PHP y MySQL  o revisar la documentación de esta librería.

El ejemplo consiste en generar un archivo pdf que muestre la lista completa de alumnos, utilizando la siguiente tabla

Base de datos

--
-- Estructura de tabla para la tabla `tblalumno`
--

CREATE TABLE IF NOT EXISTS `tblalumno` (
  `idalumno` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `paterno` varchar(15) NOT NULL,
  `materno` varchar(15) NOT NULL,
  `nombre` varchar(15) NOT NULL,
  `grado` varchar(10) NOT NULL,
  `grupo` varchar(2) NOT NULL,
  `fec_nac` date NOT NULL,
  PRIMARY KEY (`idalumno`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Reporte de alumnos en pdf

Vamos a comenzar descargando la librería fpdf desde su página oficial, una vez que tengamos el archivo se descomprime y copia hacia la carpeta application/third_party de CodeIgniter

fpdf CodeIgniter

Nos vamos al directorio application/libraries y creamos un archivo llamado Pdf.php con el siguiente código

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    // Incluimos el archivo fpdf
    require_once APPPATH."/third_party/fpdf/fpdf.php";

    //Extendemos la clase Pdf de la clase fpdf para que herede todas sus variables y funciones
    class Pdf extends FPDF {
        public function __construct() {
            parent::__construct();
        }
        // El encabezado del PDF
        public function Header(){
            $this->Image('imagenes/logo.png',10,8,22);
            $this->SetFont('Arial','B',13);
            $this->Cell(30);
            $this->Cell(120,10,'ESCUELA X',0,0,'C');
            $this->Ln('5');
            $this->SetFont('Arial','B',8);
            $this->Cell(30);
            $this->Cell(120,10,'INFORMACION DE CONTACTO',0,0,'C');
            $this->Ln(20);
       }
       // El pie del pdf
       public function Footer(){
           $this->SetY(-15);
           $this->SetFont('Arial','I',8);
           $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
      }
    }
?>;

Ahora creamos nuestro modelo por lo tanto nos vamos al directorio application/models y creamos un archivo llamado alumno_modelo.php dentro del cual vamos a crear una función que se llame obtenerListaAlumnos() la cual se va a encargar de obtener la lista completa de registros que se encuentran almacenados en la tabla tblalumno.

<?php
class Alumno_modelo extends CI_Model {

    function __construct()
    {
        parent::__construct();
    }

    /* Devuelve la lista de alumnos que se encuentran en la tabla tblalumno */
    function obtenerListaAlumnos()
    {
    	$this->load->database();
        $alumnos = $this->db->get('tblalumno');
        return $alumnos->result();
    }
}
?>;

Ahora solo nos queda crear el controlador, para ello accedemos al directorio application/controllers y creamos un archivo llamado reporte.php, dicho archivo es el encargado de llamar al modelo, generar el pdf y mandarlo al navegador para su descarga.

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Reporte extends CI_Controller {

	public function index()
	{
		// Se carga el modelo alumno
		$this->load->model('alumno_modelo');
		// Se carga la libreria fpdf
		$this->load->library('pdf');

		// Se obtienen los alumnos de la base de datos
		$alumnos = $this->alumno_modelo->obtenerListaAlumnos();

		// Creacion del PDF

		/*
		 * Se crea un objeto de la clase Pdf, recuerda que la clase Pdf
		 * heredó todos las variables y métodos de fpdf
		 */
		$this->pdf = new Pdf();
		// Agregamos una página
		$this->pdf->AddPage();
		// Define el alias para el número de página que se imprimirá en el pie
		$this->pdf->AliasNbPages();

		/* Se define el titulo, márgenes izquierdo, derecho y
		 * el color de relleno predeterminado
		 */
		$this->pdf->SetTitle("Lista de alumnos");
		$this->pdf->SetLeftMargin(15);
		$this->pdf->SetRightMargin(15);
		$this->pdf->SetFillColor(200,200,200);

		// Se define el formato de fuente: Arial, negritas, tamaño 9
		$this->pdf->SetFont('Arial', 'B', 9);
		/*
		 * TITULOS DE COLUMNAS
		 *
		 * $this->pdf->Cell(Ancho, Alto,texto,borde,posición,alineación,relleno);
		 */

		$this->pdf->Cell(15,7,'NUM','TBL',0,'C','1');
		$this->pdf->Cell(25,7,'PATERNO','TB',0,'L','1');
		$this->pdf->Cell(25,7,'MATERNO','TB',0,'L','1');
		$this->pdf->Cell(25,7,'NOMBRE','TB',0,'L','1');
		$this->pdf->Cell(40,7,'FECHA DE NACIMIENTO','TB',0,'C','1');
		$this->pdf->Cell(25,7,'GRADO','TB',0,'L','1');
		$this->pdf->Cell(25,7,'GRUPO','TBR',0,'C','1');
		$this->pdf->Ln(7);
		// La variable $x se utiliza para mostrar un número consecutivo
		$x = 1;
		foreach ($alumnos as $alumno) {
			// se imprime el numero actual y despues se incrementa el valor de $x en uno
			$this->pdf->Cell(15,5,$x++,'BL',0,'C',0);
			// Se imprimen los datos de cada alumno
			$this->pdf->Cell(25,5,$alumno->paterno,'B',0,'L',0);
			$this->pdf->Cell(25,5,$alumno->materno,'B',0,'L',0);
			$this->pdf->Cell(25,5,$alumno->nombre,'B',0,'L',0);
			$this->pdf->Cell(40,5,$alumno->fec_nac,'B',0,'C',0);
			$this->pdf->Cell(25,5,$alumno->grado,'B',0,'L',0);
			$this->pdf->Cell(25,5,$alumno->grupo,'BR',0,'C',0);
			//Se agrega un salto de linea
			$this->pdf->Ln(5);
		}
		/*
		 * Se manda el pdf al navegador
		 *
		 * $this->pdf->Output(nombredelarchivo, destino);
		 *
		 * I = Muestra el pdf en el navegador
		 * D = Envia el pdf para descarga
		 *
		 */
		$this->pdf->Output("Lista de alumnos.pdf", 'I');
	}
}

Listo, ya nos debe mostrar el reporte en pdf. Para más información puedes revisar la documentación de CodeIgniter, documentación de fpdf o dejar un comentario.

Si la información de este post te fue de ayuda dale me gusta a nuestra pagina de Facebook, añádenos a tus círculos o recomienda nuestro blog.

48 comentarios en “Como integrar la libreria fpdf con el framework codeigniter”

  1. noceea dice:

    Gracias viejo n_n

  2. Rafael dice:

    Gracias !!!

    Lo voy a probar y muy buen post…

  3. Vero dice:

    Muchas gracias!!!! 😀

  4. luis dice:

    No direct script access allowed
    me bota este mensaje al correr la pagina

    1. denker dice:

      No puedes acceder directamente a la libreria, lo tienes que hacer atravez de codeigniter

  5. Alexis dice:

    muchas gracias, me funciono a la perfeccion, solo tengo un problema para cargar el logo, es que no se donde encontrar $this->Image(‘imagenes/logo.png’,10,8,22); , en que carpeta deben estar alojadas las imagenes.

    1. denker dice:

      Hola Alexis, la imagen debe estar en la carpeta imagenes de tu sitio, saludos

      1. Manuel dice:

        Entonces hay que crear una carpeta imagenes en el directorio Raiz?,Gracias

        1. denker dice:

          Así es, la carpeta imágenes se crea en raíz.

          1. ¿y como hago para poner en otra carpeta?

            $this->Image(‘../assets/img/logo.png’,10,8,22);

            no hay funcionado asi para mi

          2. sun2012 dice:

            yo uso base_url() Y ya pones la carpeta donde quieras

  6. Juankar dice:

    Siempre es un verdadero gustazo entrar en esta web….. me ha funcionado perfectamente….eres un jodido crack tio.

    Felicidades por tus logros y esfuerzo.

  7. hug0 dice:

    Me funciono muy bien, gracias. Solo tengo una duda.
    Digamos que tengo distintos tipos de reportes, cada reporte tiene su propio formato del header, ¿Es necesario crear distintos archivos en la carpeta libraries según la cantidad de reportes? Es decir si tengo dos reportes distintos tengo que crear un Pdf1.php y Pdf2.php para tener el formato por separado ó puedo enviarle el contenido a la función header desde el controlador??

    1. denker dice:

      Hola Hugo, lo puedes hacer con un solo archivo, en el archivo pdf.php de la carpeta libraries puedes agregar las siguientes funciones

      function SetDatosHeader( $datos ){
      $this->datosHeader = $datos;
      }

      function GetDatosHeader(){
      return $this->datosHeader;
      }

      En el controller asignas el valor de datosHeader

      $this->pdf = new Pdf();
      $this->pdf->SetDatosHeader($datosHeader);

      y dentro de la funcion header obtienes el valor asignado para personalizar el encabezado de tu reporte


      $datosHeader = $this->GetDatosHeader();
      $this->Cell(120, 7, $datosHeader , "T", 0, "L");

      Espero que te sirva, saludos

  8. xalatte dice:

    hola disculpa ya hice todo pero donde me debe aparecer el reporte por favor ayudare es para un proyecto de la escuela y me falta eso. Gracias

  9. Francisco Pérez dice:

    Hola @denker Hice pero no me instancia las funciones podrias poner un ejemplo completo. por favor.

  10. jjjulio dice:

    si funciono, solo te falto poner antes del output: “ob_end_clean();”

    GRACIAS!

  11. alvarito dice:

    Muy buen trabajo amigo. Me fue de mucha utilidad y funcionó de primera instancia. Felicitaciones y sigo atento a tu nuevo post. Abrazo.

  12. darko dice:

    Hola, mira, primero que nada muy buen tutorial, pero tengo un problema, instalé FDPF y genero mis informes de en mi servidor local sin problemas (mi sistema al cual le genero informes corre en una base de datos de tipo Postgres); el pero es que este sistema lo mudé a un servidor remoto, me funciona todo el sistema en sí, (en una dirección remota) pero los informes al llamarlos como si funciona localmente me arroja el mensaje “FPDF error: Could not include font definition file”, he revisado mis controladores y rutas, y como te digo, si lo ejecuto localmente no hay ningún problema, todo funciona impecable, pero en el remoto si puesto que me arroja el mensaje que te adjunté.

    Me ayudarías mucho si me dieras tu apreciación al respecto. Saludos cordiales, quedo atento al feedback.

    1. sun2012 dice:

      hola necesitas ponerle permisos a tu carpeta de fonts 755, saludos

      1. darko dice:

        Hola, he revisado los permisos y estan en 755, y como les contaba corre perfectamente de manera local, alguna otra sugerencia?

  13. jorge dice:

    Some data has already been output, can’t send PDF file.

    Me aparece ese error. AYUDA !!!!

    1. sun2012 dice:

      Tal vez tienes un error y se esta imprimiendo, por eso dice que no se puede enviar el pdf

    2. Leopoldo dice:

      Elimina el punto y coma al final de Php.pdf

  14. Podeis encontrar en:

    https://github.com/acacha/fpdf-codeigniter

    Un repositorio que podei utilitzar para utilitzar fpdf como third-party en Code Igniter:


    $ cd application/trhid-party
    $ git clone https://github.com/acacha/fpdf-codeigniter

  15. Natalia dice:

    Hola!
    He probado los códigos, pero he obtenido el sgte. error:

    ;;FPDF error: Some data has already been output, can’t send PDF file

    Si alguien sabe porque puede ser.
    Gracias

    1. Froilan dice:

      Buenas m gusta el tutorial segui los paso pero tengo un error:
      ;;FPDF error: Some data has already been output, can’t send PDF file

      es el mismo que le salio a natalia en los comentarios si alguin lo pudo resolver le agradeceria mucho

  16. robert dice:

    Excelente tutorial solo le quitaria “;” en la librería y en el model al final del código porque no es necesaria,

  17. jhon dice:

    muy bueno el reporte solo tengo un problema bueno dos….1ro no me reconoce las tildes……..2do en una celda no se adapta al contenido de caracteres..sobrepone al siguiente , es decir ensima…por favor si me ayudan a dar solucion

    1. sun2012 dice:

      hola para lso caracteres usa utf8_decode() por cada impresión y en Cell el segundo valor es el qeu cambia los espacios si pones 0 se enciman.

  18. Luis dice:

    Hola que tal esta muy bueno el post, tengo un pequeño problema cuando mando a mostrar el reporte en el navegador me manda el siguiente error ;;FPDF error: Some data has already been output, can’t send PDF file espero alguien pueda ayudarme gracias por el aporte.

  19. Juan dice:

    Muchas gracias por la información me sirvió bastante

  20. Froilan dice:

    aun no pude solucionar el problema: FPDF error: Some data has already been output, can’t send PDF file no se si s la version pero busque mucho y no hay respuesta m gustaria si puedes usbir el proyecto en si o indicar las verciones de CI y d la libreria .. t agradesco de antemano Saludos

    1. DobleA dice:

      Estimados amigos.! El error “FPDF error: Some data has already been output, can’t send PDF file” me salió a mi tambien porque deje sin comentar un “echo” para hacer el debugging de las variables que estaba enviando. Prueben verificar que no exista ninguna salida a la pantalla antes del “$this->pdf->Output(“xxxxxxxx.pdf”, ‘I’);”
      Por otro Lado, estoy atascado con los headers dinamicos. Necesito enviar el nombre del reporte y unos datos que estan en la base de datos para el header pero no lo he conseguido. Seguí los consejos del comentario que le hizo el amigo Denker a Hugo pero me devuelve el error:
      Severity: Notice
      Message: Undefined property: Pdf::$datosHeader
      Filename: libraries/Pdf.php

      ese error se genera (o viene de) en las lineas:
      //funciones para cambiar los encabezados de los reportes
      function GetDatosHeader(){
      return $this->datosHeader;
      }
      me aseguro de obtener los valores para esa función con:
      function SetDatosHeader($datosH){
      $this->datosHeader = $datosH;
      }
      y $datosH lo recibo del controlador de esta forma:
      $datosH = array(
      ‘Titulo’ => ‘Reporte de Nomina’,
      ‘Subtitulo’ => $estanomina
      );
      // asigno el valor a los encabezados
      $this->pdf->SetDatosHeader($datosH);
      aun así persiste el error… no puedo terminar de generar el pdf. Al convertir en comentario estas funciones el pdf se genera sin ningún problema…
      Alguna idea? Gracias de antemano.
      PD: Amigo Denker, por personas como usted y sus esfuerzos es que los niveles calidad de los programas hechos con Open Source están en ese alto limite inimaginable hace algunos años. Sigue así, no estas solo..! Compartir el conocimiento nos hará libres.!

  21. David JMS dice:

    Que tal, excelente aporte, solo que me manda el siguiente error “FPDF error: Some data has already been output, can’t send PDF file”, alguna idea de que pueda ser? Muchas Gracias!

  22. morocho dice:

    monte todo como indicas , ahora bien debo crear una vista para ver el pdf cual es el procedimiento gracias

  23. morocho dice:

    Tengo el siguiente error que podra ser

    A PHP Error was encountered

    Severity: Error

    Message: Class ‘pdf’ not found

    Filename: controllers/Reporte.php

    Line Number: 21

  24. julio dice:

    como mandaria llamar 2 tablas de una base de datos a la vez ?

    1. sun2012 dice:

      Has tus consultas con inner join

  25. Cesar dice:

    No muestra nada ??? hay que crear una vista ? :S

    1. sun2012 dice:

      Si hay que crear la vista o teclear el nombre del controlador en el navegador.

  26. si alguien le da error “FPDF error: Some data has already been output, can’t send PDF file” el problema es ?>;, quitenlo de la libreria y del modelo y listo

  27. Miguel dice:

    Hola,
    Gracias por este tutorial. Tengo una pregunta. Después de generar y descargar el documento pdf, mostrandolo en el navegador o descargándolo, quisiera cargar otro controlador y su vista. Cualquier intento que hago, anula la descarga del pdf. ¿Me podéis ayudar?. Gracias.

    1. sun2012 dice:

      Hola, pues abre el pdf en otra pestaña, saludos.

  28. ENSASKE dice:

    Genial! Despues de tanto tiempo y es muy util. Estaba confundido porque habia muchas formas de hacerlo. Incluso otros frameworks lo usan es en la vista, crean una vista para pdf. Con esto despeje la duda y esta funcionando de 10!

  29. enrique dice:

    hola
    buen tutorial pero tengo un problema la librería pdf.php no encuentra la función de fpdf.php como cambio la dirección de url

  30. cristian dice:

    como hago para enviar un correo electronico teniendo el pdf de esa forma

    1. sun2012 dice:

      hola el fpdf solo genera el archivo, en este caso debes guardar el archivo en el hosting con la función Output, ya que este el archivo en una carpeta mediante la librería de mail en codeigniter adjuntas el archivo.

Deja un comentario