Sigueme por RSS! RSS

PDF en CodeIgniter con TCPDF

Uno de los requerimientos más solicitados en el módulo de un sistema, son los reportes, a continuación dejo una forma de generar un pequeño reporte en PDF usando TCPDF.

1.- Descargamos TCPDF de la página oficial (para el ejemplo descargue tcpdf_5_9_165.zip).
2.- Creamos una carpeta en la raíz de nuestro proyecto de CodeIgniter, con el nombre de plugins.
CodeIgniter
-> application
-> system
-> plugins (la nueva carpeta)
-> imagenes
3.- Descomprimimos el archivo descargado(TCPDF) en la carpeta plugins.
4.- Usando el plugin:

a.- creamos nuestro controlador(index_c.php):
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Index_c extends CI_Controller {

  public function __construct(){
        parent::__construct();
        $this->load->model('index_m','modelo');
  }
  
  function index(){
        $this->load->view('index_v');
  }
  
  public function generar_pdf(){
        
 // enviamos el cabezal de la tabla
        $arrHeading = array('Id', 'Campo');

 // obtenemos los datos resultantes de la consulta
        $arrData    = $this->modelo->get_data_pdf();

  // enviaremos el titulo
        $sTitulo    = 'Ejemplo PDF Export en CodeIgniter'; 
        
        // generamos el pdf
        generar_pdf($arrHeading,$arrData,$sTitulo);
  }
}

b.- creamos nuestro modelo(index_m.php):
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Index_m extends CI_Model {
    
  public function __construct(){
        parent::__construct();   
  }
  
  function get_data_pdf(){

        $result = $this->db
    ->query('SELECT idtabla1, campo1 FROM tabla1');

 // recuerda que puiedes hacer cualquier filtro usando SQL
 // como limitar el numero de registros, mostrar todo en mayúscula, etc..

        $arrDatos=array();
        foreach ($result->result_array() as $row){
            $arrDatos[] = array(
                htmlspecialchars($row['idtabla1'],ENT_QUOTES),
                htmlspecialchars($row['campo1'],ENT_QUOTES),
            ); 
        }
        $result->free_result();
        $this->db->close();

        return($arrDatos);
  }
}

c.- nuestra vista (index_v.php):
<?php 

echo '<a  title="Click aquí para exportar a PDF" href="'
      .base_url() . '/index.php/index_c/generar_pdf"><img src="'
      .base_url() . 'imagenes/pdf.png" alt="PDF" 
      width="16" height="16" /></a>';

d.- ahora debemos crear la función que se encarga de generar el PDF, lo ideal es tener esa función disponible siempre que deseemos hacer uso de ella y que sea una sola y no que este repetida en cada controlador, así que la guardaremos en nuestro propio helper. Nos vamos a CodeIgniter --> system -->helpers y creamos un archivo con el nombre mod_ppal_helper.php y agregamos lo siguiente:
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

if ( ! function_exists('generar_pdf'))
{
   function generar_pdf($arrHeading,$arrData,$sTitulo){
       
        //  validamos los priemros dos parametros
        if(!is_array($arrHeading) or !is_array($arrData)){
         return 0;
        }
        // seteamos el titulo, si es necesario
        $sTitulo = empty($sTitulo) ? 'NO SE HA DEFINIDO EL TITULO..' : $sTitulo;
       
        //instanciamos al objeto codeigniter
        $CI =& get_instance();
        $CI->load->library('table');

  // configuraciones de la tabla
 $tmpl = array('table_open' => '<table border="0" cellpadding="2" cellspacing="1">');
 $CI->table->set_template($tmpl); 
 $CI->table->set_heading($arrHeading);

 // iniciamos el HTML que enviaremos para generar el PDF
 $html = "<html><head>
        <style>
            h1{
                font-family: times new roman;
                font-size: 50px;
                text-align:center;
            }
            table {
                color: #fff;
  font-weight: bold;
                font-family: Arial Black;
                font-size: 28px;
                background-color: #B10020;
                border: red 0px solid;
            }
            table td {
  font-weight: none;
                color: #000;
                background-color: #FAFAFA;
                font-size: 26px;
                font-family: times new roman;
            }
        </style>
        </head><body><h1>$sTitulo</h1>";

 $html .= $CI->table->generate($arrData); 
        $html .= '</body></html>';

 // para evitar errores, limpiamos, 
 // deshabilitamos los búferes de salida
 if(ob_get_contents()){
  ob_end_clean();
 }

 // incluimos el plugin
        require_once('./plugins/tcpdf/config/lang/spa.php');
 require_once('./plugins/tcpdf/tcpdf.php');
 
 // estas son las configuraciones para la generacion del PDF
 // los detalles los encuentras en la pagina oficial
 $pdf = new TCPDF(PDF_PAGE_ORIENTATION,PDF_UNIT,PDF_PAGE_FORMAT,true,'UTF-8',false);
 $pdf->SetCreator(PDF_CREATOR);
 $pdf->SetAuthor('aqui_tu_nombre');
 $pdf->SetTitle($sTitulo);
 $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 001');
 $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
 $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
 $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
 $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
 $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
 $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
 $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
 $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
 $pdf->setLanguageArray($l);
 $pdf->setFontSubsetting(true);
 $pdf->SetFont('dejavusans', '', 12, '', true);
 $pdf->AddPage();
 $pdf->writeHTML($html, true, false, true, false, '');
 $pdf->Output('','D');
  }  
}

# END Mod Ppal Class
/* End of file mod_ppal_helper.php */
/* Location: ./system/libraries/Mod_ppal.php */

e.- La configuración de la base de datos no tiene mayor misterio (CodeIgniter --> appliction --> config --> database.php):
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'tu_usuario';
$db['default']['password'] = 'tu_password';
$db['default']['database'] = 'el_nombre_de_tu_base_de_datos';

Las librerías y los helpers los cargas como mejor te parezca, ya sea desde cada controlador o el autoload (CodeIgniter --> appliction --> config --> autoload.php):
// para la base de datos
$autoload['libraries'] = array('database');
// url: para base_url()
// mod_ppal: para generar_pdf()
$autoload['helper'] = array('url','mod_ppal');

El código está lo suficientemente comentado, por lo que no veo la necesidad de explicar más, cualquier duda no dudes en consultar. No olvides agregar la imagen () a utilizar en (CodeIgniter --> imagenes).

5 comentarios: Suscribete a los comentarios por RSS

Kus Blue

Amigo lo probaré espero que sea de ayuda :D

Kus Blue

Un exito muchas gracias me salvaste la vida, de forma local funciono perfectamente, si lo monto en un servidor funciona de igual manera???

saludos y gracias!!

Manuel Huertas Honores

Hola amigo estoy tratando de hacer filtrando una tabla (Ejemplo: codigo, nombre, sexo) con un combobox, y solo quiero exportarlo al PDF los de sexo Masculino y no me sale, me podria ayudar porfavor

Reinaldo Cassiani (cass)

Hola. Prueba cambiando la consulta directamente en la función get_data_pdf() del modelo, si todo es correcto debería mostrarte el pdf y una vez verifiques que funciona, modifica esa función para pasarle los parámetros que recibes de tu formulario y así vas armando la consulta según sea el caso.
Usa el Active Record de CodeIgniter: http://ellislab.com/codeigniter/user-guide/database/active_record.html

Publicar un comentario

- Los comentarios están siendo moderados y serán publicados en la brevedad posible.