Crear pdfs en cakephp utilizando TCPDF
Viernes, 5 Septiembre 2008
En nuestra experiencia en desarrollo web, se nos ha planteado proyectos que tenían como uno de sus requisitos la creación de un archivo pdf generado automáticamente, por ejemplo una factura de compra o un informe de ventas.
En un principio, comenzamos utilizando fpdf, una clase en php, totalmente gratuíta, que permite crear automáticamente archivos pdf y que además tenía un helper para cakephp 1.1.
Esta clase funcionaba increíblemente bien, pero como todos los proyectos que no se actualizan regularmente (hasta hace poco llevaban más de 4 años sin realizar cambios), se quedan desfasados.
Tenía un gran número de desventajas como que no aceptaba codificación UTF-8, o lo complejo que resultaba su uso.
De este proyecto surgió en 2002 una rama, TCPDF. Este proyecto ,también libre y gratuíto, en un principio solucionaba carencias del fpdf, pero finalmente se ha convertido en una versión mucho más potente, con gran cantidad de posibilidades como por ejemplo el soporte de UTF-8 o idiomas de derecha-izquierda, permite la utilización de códigos html e incluye una lista bastante amplia de fuentes libres, que podremos utilizar en nuestro pdf.
Para incluirlo en uno de nuestros proyectos y empezar a utilizarlo hay que llevar a cabo una serie de pasos bastante sencillos (añadir nuevas funcionalidades a un proyecto cakePHP se ha facilitado en la versión 1.2), en primer lugar bajar la última versión de TCPDF, descomprimirla en el directorio /app/vendors de nuestra aplicación.
El resultado debería ser /app/vendors/tcpdf/ conteniendo al menos, tcpdf.php y los directorios tcpdf/config y tcpdf/fonts
En segundo lugar tendremos que crear un layout para los pdf’s en /app/views/layouts/pdf.ctp, con este contenido
header("Content-type: application/pdf");
echo $content_for_layout;
En el controlador que queramos crear los pdf’s, crearemos una función para ello
function pdf()
{
$this->layout = 'pdf'; //this will use the pdf.ctp layout
// Operaciones que deseamos realizar y variables que pasaremos a la vista.
$this->render();
}
Por último una vista para esta función, con el siguiente contenido:
App::import('Vendor','tcpdf');
$tcpdf = new TCPDF();
$textfont = 'freesans';
$tcpdf->SetCreator(PDF_CREATOR);
$tcpdf->SetAuthor("autor");
$tcpdf->SetTitle("Título");
$tcpdf->SetSubject("Tutorial TCPDF en cakePHP");
$tcpdf->SetKeywords("TCPDF, PDF, cakePHP, ejemplo");
$tcpdf->setPrintHeader(false);
$tcpdf->setPrintFooter(false);
$tcpdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$tcpdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
$tcpdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
$tcpdf->setLanguageArray($l);
$tcpdf->AliasNbPages();
$tcpdf->AddPage();
$tcpdf->SetFont("freesans", "BI", 20);
$tcpdf->Cell(0,10,"Hola mundo",1,1,'C');
$tcpdf->Output("ejemplo.pdf", "I");
En este ejemplo se creará un pdf muy sencillo con un cuadrado con el texto hola mundo dentro.
Las posibilidades de TCPDF son muchas, para comprobar lo que es capaz de hacer, es recomendable ojear los ejemplos contenidos en la página y la documentación de la clase, que explica el funcionamiento de todos sus métodos.
En nuestra página de pruebas de cakephp hay un ejemplo sencillo de funcionamiento.

No. 1 — Septiembre 10th, 2008 at 3:57 pm
Hola tienes algun ejemplo de como mostrar una imagen en el pdf que se cargue desde memoria? Por ejemplo una imagen creada en JPGRAPH y que la insertes en el pdf sin antes guardarla.
Saludos.
No. 2 — Septiembre 11th, 2008 at 9:48 am
Hasta ahora lo que he conseguido es crear una imagen, guardarla en un directorio temporal y después de insertarla en el pdf borrarla.
No se si te valdría esta opción.
No. 3 — Noviembre 4th, 2008 at 4:06 am
hola hice todo lo que indica tu post pero me sale el siguiente error TCPDF error: Some data has already been output to browser, can’t send PDF file.
ando en cake1.2, quepodra ser, Muchas Gracias.
No. 4 — Noviembre 4th, 2008 at 7:48 am
Eso suele pasar cuando envía algo de información antes de enviar los datos del pdf.
No se pueden poner ni echos ni debugs en ninguno de los ficheros que participan en la creación del pdf, ni en la vista ni en el modelo ni en la función del controlador.
Por otra parte ningún fichero puede tener espacios después del cierre de php ?>, hay que comprobar uno a uno y borrar todos los espacios y saltos de línea que puede haber.
Estos son los fallos que nos solían aparecer a la hora de crear un pdf, espero que resuelva tu duda.