Bienvenido a mi site personal, donde encontrarás un blog sobre mis proyectos y experiencias en el mundo de internet y la programación web.

Al mismo tiempo podrás ver mi portfolio profesional y personal, con una infinidad de trabajos que he realizado y proyectos en los que he colaborado.

Mas Sobre mi Ver mi trabajo

Crear archivos PDF con CakePHP

En este post voy a comentar lo que he hecho para crear archivos PDF con CakePHP.

Los ingredientes para esta “receta” son:

1.- La librería TCPDF que se encarga de generar los archivos PDF.
2.- Un layout
3.- Una vista

Para implementar esta funcionalidad en vuestro desarrollo en CakePHP es muy sencillo y da muy buenos resultados.

  • Tendréis que descargar la última versión de la librería TCPDF que como he dicho es la encargada de generar los documentos PDF.
  • Tendréis que crear la carpeta app/vendors/tcpdf y extraer los ficheros en esta ruta. Al menos necesitareis copiar el archivo tcpdf.php y las carpetas tcpdf/config y tcpdf/fonts.
  • Por defecto la librería TCPDF crea unas cabeceras y pie definidas en los métodos header() y footer(), lo que hacemos es sobrescribir estos métodos creando una clase en app/vendors/tcpdf que extienda las propiedades y métodos de la librería TCPDF. Para ello creamos el archivo app/vendors/tcpdf/xtcpdf.php

    <?php
    App::import('Vendor','tcpdf/tcpdf');
    
    class XTCPDF  extends TCPDF
    {
    
        var $xheadertext  = 'PDF creado using CakePHP y TCPDF';
        var $xheadercolor = array(0,0,200);
        var $xfootertext  = 'Copyright © %d XXXXXXXXXXX. All rights reserved.';
        var $xfooterfont  = PDF_FONT_NAME_MAIN ;
        var $xfooterfontsize = 8 ;
    
        function Header()
        {
    
            list($r, $b, $g) = $this->xheadercolor;
            $this->setY(10);
            $this->SetFillColor($r, $b, $g);
            $this->SetTextColor(0 , 0, 0);
            $this->Cell(0,20, '', 0,1,'C', 1);
            $this->Text(15,26,$this->xheadertext );
        }
    
        function Footer()
        {
            $year = date('Y');
            $footertext = sprintf($this->xfootertext, $year);
            $this->SetY(-20);
            $this->SetTextColor(0, 0, 0);
            $this->SetFont($this->xfooterfont,'',$this->xfooterfontsize);
            $this->Cell(0,8, $footertext,'T',1,'C');
        }
    }
    ?>
    

    Por supuesto se puede modificar el valor de las variables para customizarlas a vuestro modo. Hay muchos mas parametros y variables que se pueden añadir y customizar en la documentación de TCPDF.

  • A continuación creamos el layout en app/views/layouts/pdf.ctp donde se renderizará el archivo pdf generado.
  • <?php
    header("Content-type: application/pdf");
    echo $content_for_layout;
    ?>
    
  • Ahora toca la parte del controlador. En el controlador de vuestra aplicación donde se vayan a mostrar o descargar los pdf tendreis que añadir una nueva función, yo la he llamado descargar, la podéis llamar como queráis.
  • function descargar($id = null)
        {
            if (!$id)
            {
                $this->Session->setFlash('no has seleccionado ningun pdf.');
                $this->redirect(array('action'=>'index'));
            }
            // Sobrescribimos para que no aparezcan los resultados de debuggin
            // ya que sino daria un error al generar el pdf.
            Configure::write('debug',0);
            $resultado = $this->MiControlador->findById($id);
            $this->set("datos_pdf",$resultado);
            $this->layout = 'pdf'; //esto usara el layout pdf.ctp
            $this->render();
        }
    

    Esta función es de ejemplo, podreis desarrollar la lógica que necesitéis para obtener la información. Pero lo realmente importante es la renderizacion de los datos en el nuevo layout.

     $this->layout = 'pdf';
    $this->render();
    
  • Es el paso en que hay que mostrar los datos obtenidos mediante nuestro controlador y renderizarlos en la vista. Para ello tenemos que crear nuestra vista. app/views/mi_aplicacion/descargar.ctp
  • <?php
    App::import('Vendor','xtcpdf');
    $tcpdf = new XTCPDF();
    $textfont = 'freesans';
    
    $tcpdf->SetAuthor("");
    $tcpdf->SetAutoPageBreak( false );
    $tcpdf->setHeaderFont(array($textfont,'',10));
    $tcpdf->xheadercolor = array(255,255,255);
    $tcpdf->xheadertext = 'Fecha: '. date('d-m-Y',time());
    $tcpdf->xfootertext = 'www.pedroventura.com';
    
    // Ahora imprimimos el contenido de la pagina en una posición determinada
    // estos datos son un ejemplo, y en mi ejemplo hay un pequeño texto y una imagen.
    $tcpdf->AddPage();
    $tcpdf->SetTextColor(0, 0, 0);
    $tcpdf->SetFont($textfont,'B',10);
    $tcpdf->Cell(10,20,'Nombre:', 0, 0);
    // configuramos la calidad de JPEG
    $tcpdf->setJPEGQuality(100);
    $tcpdf->Image($imagen, 0, 50, 200, 200, '', '', '', false, 150);  
    
    // se pueden asignar mas datos, ver la documentación de TCPDF
    
    echo $tcpdf->Output('mi_archivo.pdf', 'I'); //el pdf se muestra en el navegador
    //echo $tcpdf->Output('mi_archivo.pdf', 'I'); //el pdf se descarga
    
    ?>
    

    en el segundo parámetro del Output yo tengo ‘I’, esto es que el PDF se generará en una nueva ventana del navegador. Si ponemos el parámetro: ‘D’ el pdf generado se descargará.

fuente: http://bakery.cakephp.org/articles/view/creating-pdf-files-with-cakephp-and-tcpdf

Posts Relacionados:

  1. Cakephp generar logs con $this->log();
  2. componente geo posicionamiento ip con cakephp
  3. CakePHP Helper para crear un listado de países
  4. Una aplicación, multiples bases de datos CakePHP
  5. CakePHP + SMARTY primeros pasos

Posted in: CakePHP on Enero 23, 2010 by admin. Tags: , ,

Comparte este post o deja un comentario si te ha resultado útil!!

| | | | |

Url acortada con Linkinho

    http://www.linkinho.com/rKc

Visitar el site: linkinho.com

6 Comentarios en “Crear archivos PDF con CakePHP”

  1. Alan dice:

    Cual es la ruta exacta para ver la descargar del PDF.
    intento con web.com/mi_aplicacion/descargar y nada…

    Gracias

    • admin dice:

      pues la ruta depende, será miweb.com/controller/function que tengas. En este caso la function es descargar.
      Mete en el boostrap.php

      Configure::write('debug',3);

      para ver que error te está dando.
      Eso… o puedes meter

      function __construct()
          {
              parent::__construct();
              configure::write('debug',3);
          }
      

      en el controlador donde has integrado esto del pdf

      Primero hay que localizar el error u obtener más pistas del error que te pueda estar dando… sabes es una pregunta muy poco concreta

      también puedes mirar en el error_log de apache

  2. Alevsk dice:

    Hola primero que nada gracias por el tutorial, he buscado en google un par de horas y no consigo encontrar una solucion, segui tu tutorial pero me da un error al generar el pdf

    TCPDF ERROR: Some data has already been output, can’t send PDF file

    Ya revise todos mis archivos en busca de saltos antes de , tambien aplice el Configure::write(‘debug’,0); en el controlador y sigue dando el error

    gracias

    • admin dice:

      pues ese error parece algo de los header, le has puesto bien la cabecera??
      lo tienes que renderizar en el layout pdf
      < ?php
      header("Content-type: application/pdf");
      echo $content_for_layout;
      ?>

      un problema común por el que da un error de headers es que haya algún espacio en blanco al final del controller…

  3. Dementrio Macias dice:

    Muy bien el articulo traducido, muchas gracias.
    solo tuve un inconveniente, que la memoria era superada por este script, así que hacia falta corregir esto en la configuración del PHP, con:
    Al inicio del script “app/views/mi_aplicacion/descargar.ctp”

    ini_set(“memory_limit”,”12M”); // se incrementa tamaño hasta que sea el correcto

Deja tu comentario

Nombre:

Email (no será publicado)

Website

Comentario

Deja tu comentario usando FacebookConnect