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.
<?php
header("Content-type: application/pdf");
echo $content_for_layout;
?>
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();
<?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:
- Esquema de una peticion en CakePHP y funcionamiento general del Framework
- CakePHP Helper para crear un listado de países
- Una aplicación, multiples bases de datos CakePHP
- CakePHP + SMARTY primeros pasos
- CakePHP Rocks my world!!
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
De nada! me alegro que te haya servido!