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:
- Cakephp generar logs con $this->log();
- componente geo posicionamiento ip con cakephp
- CakePHP Helper para crear un listado de países
- Una aplicación, multiples bases de datos CakePHP
- CakePHP + SMARTY primeros pasos
Cual es la ruta exacta para ver la descargar del PDF.
intento con web.com/mi_aplicacion/descargar y nada…
Gracias
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
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
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…
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!