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

Compartir:
  • Twitter
  • Facebook
  • del.icio.us
  • Technorati
  • Digg
  • Google Bookmarks
  • StumbleUpon
  • FriendFeed
  • email

Posts Relacionados:

  1. Esquema de una peticion en CakePHP y funcionamiento general del Framework
  2. CakePHP Helper para crear un listado de países
  3. Una aplicación, multiples bases de datos CakePHP
  4. CakePHP + SMARTY primeros pasos
  5. CakePHP Rocks my world!!

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

2 Comentarios en “Crear archivos PDF con CakePHP”

  1. 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