RSS

Generar PDF con Dompdf en Codeigniter

25 Abr

Paso a paso. vamos a hacer: Uno, las configuraciones iniciales de Codeigniter. Dos, agregar la librería de Dompdf y la clase para poder usarla en el controlador. Tres, generar 3 documentos para ir probando cómo funciona dompdf. Los documentos serán:

Primero, una hoja con un mensaje desde el controlador.

Segundo, hacer el header y footer del documento

Tercero, mostrar una tabla con datos obtenidos de la BD.

El zip que contiene la base de datos, el proyecto en codeigniter de este ejemplo, estará disponible para descargar aquí. Para ver en funcionamiento el ejemplo, puedes verlo aquí.

Empecemos:

Uno: Configuraciones de Codeigniter:

Las siguientes configuraciones se suelen hacer siempre al principio de cada proyecto y solo se hacen una vez.

Archivo config/config.php

    //Cambiar la url, línea 26
    $config['base_url'] = 'http://localhost/dompdf/';
    
    //Quitar el index.php, línea 38
    $config['index_page'] = '';

Archivo config/autoload.php

    //Agregar helper url, línea 92
    $autoload['helper'] = array('url');
    
    //Agregar library database línea 61
    $autoload['libraries'] = array('database');

Agregar .htaccess en la raíz del proyecto para quitar index.php de la url. Creas un archivo y lo llamas .htaccess con lo siguiente:

<IfModule mod_rewrite.c>
    RewriteEngine on
	RewriteCond $1 !^(index\.php|resources|robots\.txt)
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

Dos: Agregar librería Dompdf a Codeigniter

Para esto se descarga la librería dompdf (está incluida en el zip del ejemplo), se descomprime y se coloca en la carpeta applications/libraries (cambia el nombre como te agrade), aquí mismo creamos un archivo php que yo llamé Mydompdf.php, este archivo será la clase con la que se puedan invocar todos los métodos de dompdf:

El contenido de Mydompdf:

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

require_once(dirname(__FILE__) . '/dompdf/dompdf_config.inc.php');
class Mydompdf extends DOMPDF
{
    
    protected function ci()
    {
        return get_instance();
    }
    
    public function load_view($view, $data = array())
    {
        $html = $this->ci()->load->view($view, $data, TRUE);
        $this->load_html($html);
    }
}

Tres: Generar 3 documentos PDF

El primero será un documento con un texto, el cual será “Hola mundo PDF desde dompdf”, donde “Hola mundo” es una variable generada en el controlador y “PDF desde dompdf” ya estará en la vista que carguemos.

En el controlador Welcome.php creamos el siguiente método pdf_blanco():

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Welcome extends CI_Controller
{
    public function index()
    {
        $this->load->view('menu_pdf');
        /* Ya que no es tema por el momento css y html
         * puedes poner en esta vista 3 <a> que lleven a cada 
         * uno de los métodos de este controlador
         * <a href="<?php echo base_url();?>welcome/pdf_blanco" target="_blank">
         * <a href="<?php echo base_url();?>welcome/header_footer" target="_blank">
         * <a href="<?php echo base_url();?>welcome/datos_bd" target="_blank">
         * Puedes bajar el zip para verlo como en las capturas de pantalla que pongo
         */
    }
    
    public function pdf_blanco()
    {
        //Carga la librería que agregamos
        $this->load->library('mydompdf');
        //$saludo será una variable dentro la vista
        $data["saludo"] = "Hola mundo!";
        //$html tendrá el contenido de la vista
        $html           = $this->load->view('pdf/blanco', $data, true);
        /*
         * load_html carga en dompdf la vista
         * render genera el pdf
         * stream ("nombreDelDocumento.pdf", Attachment: true | false)
         * true = forza a descargar el pdf
         * false = genera el pdf dentro del navegador
         */
        $this->mydompdf->load_html($html);
        $this->mydompdf->render();
        $this->mydompdf->stream("welcome.pdf", array(
            "Attachment" => false
        ));
    }
}

La vista que cargará está en la carpeta views bajo pdf/blanco.php y contiene:

<div>
    <?php echo $saludo . " PDF desde Dompdf :D!"?>
</div>

Con imágenes:

Cuando clickamos en el link, nos abre una pestaña con el pdf

 


Ahora vamos a crear un pdf que tenga header y footer

En el controlador Welcome.php creamos un método que se llame header_footer() que será el siguiente:

<?php
function header_footer()
{
    $this->load->library('mydompdf');
    //Servirá para iterar y generar hojas para ver
        //el header y footer en varias hojas
    $data["numero"] = 250;
    $html = $this->load->view('pdf/header_footer', $data, true);
    $this->mydompdf->load_html($html);
    $this->mydompdf->render();
        //Así se agrega css a la vista que queremos renderizar
        //En la vista hay que agregarlo con link en el head del documento html
    $this->mydompdf->set_base_path('./assets/css/dompdf.css'); //agregar de nuevo el css
    $this->mydompdf->stream("welcome.pdf", array(
        "Attachment" => false
    ));
}
?>

La vista será

<html>
  <head>
      <link rel="stylesheet" type="text/css" href="./assets/css/dompdf.css">
  </head>

<body>

  <header>
      <table>
          <tr>
              <td id="header_logo">
                  <img id="logo" src="./assets/images/hd.png">
              </td>
              <td id="header_texto">
                  <div>CENTRO NACIONAL DE TUTORIALES MÉXICO Y ALREDEDORES</div>
                  <div>Consejo de alguna institución para el desarrollox</div>
                  <div>"La mejor de mí para ustedes"</div>
              </td>

              <td id="header_logos">
                  <img id="logo1" src="./assets/images/hd1.png">
                  <img id="logo2" src="./assets/images/hd2.png">
              </td>
          </tr>
      </table>
  </header>
  <footer>
      <div id="footer_texto">Aquí habrá algo relevante para el footer del documento, tiene border top 3px, fontsize de 9px y texto centrado</div>
  </footer>

  <?php for ($i=0; $i < $numero; $i++) {
    echo $i . "<br>";
  } ?>


  </body>
</html>

Con imágenes:

Hoja generada con header y footer

Varias hojas con el header y footer


Por último, mostrar una tabla con datos obtenidos de la BD. Se crea otro método en Welcome.php:

<?php
function datos_bd(){
    $this->load->model('Usuarios');
    $this->load->library('mydompdf');
    $data['usuarios'] = $this->Usuarios->getUsuarios();
    $html= $this->load->view('pdf/datos_bd', $data, true);
    $this->mydompdf->load_html($html);
    $this->mydompdf->render();
    $this->mydompdf->set_base_path('./assets/css/dompdf.css'); //agregar de nuevo el css
    $this->mydompdf->stream("welcome.pdf", array("Attachment" => false));
 }
?>

La vista contiene:

<html>
  <head>
      <link rel="stylesheet" type="text/css" href="./assets/css/dompdf.css">
  </head>

<body>

  <header>
      <table>
          <tr>
              <td id="header_logo">
                  <img id="logo" src="./assets/images/hd.png">
              </td>
              <td id="header_texto">
                  <div>CENTRO NACIONAL DE TUTORIALES MÉXICO Y ALREDEDORES</div>
                  <div>Consejo de alguna institución para el desarrollox</div>
                  <div>"La mejor de mí para ustedes"</div>
              </td>

              <td id="header_logos">
                  <img id="logo1" src="./assets/images/hd1.png">
                  <img id="logo2" src="./assets/images/hd2.png">
              </td>
          </tr>
      </table>
  </header>
  <footer>
      <div id="footer_texto">Aquí habrá algo relevante para el footer del documento, tiene border top 3px, fontsize de 9px y texto centrado</div>
  </footer>

  <table border="1" id="table_info">
       <thead>
           <tr>
               <th>Nombre</th>
               <th>Email</th>
               <th>Teléfono</th>
               <th>Edad</th>
               <th>Sexo</th>
           </tr>
       </thead>
       <tbody>
          <?php foreach ($usuarios as $usuario) { ?>
            <tr>
                <td><?php echo $usuario->nombre;?></td>
                <td><?php echo $usuario->email;?></td>
                <td><?php echo $usuario->telefono;?></td>
                <td><?php echo $usuario->edad;?></td>
                <td><?php echo $usuario->sexo;?></td>
            </tr>
          <?php  }?>
       </tbody>
   </table>

  </body>
</html>

En imágenes:

Espero que sea de mucha utilidad en sus proyectos con Codeigniter, cualquier duda comentario lo pueden enviar a ringhugos@gmail.com

Anuncios
 
Deja un comentario

Publicado por en 25 abril, 2017 en Codeigniter

 

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: