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() { Configure::write('debug',0); $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.
Actualización (9/2/2009) :
Errores frecuentes:
“TCPDF error: Some data has already been output to browser, can’t send PDF file”: Este error se produce cuando cakePHP envía algún dato antes de crear el pdf y enviarlo, esto puede ocurrir por una serie de razones que habrá que comprobar:
- Realizar un debug o un echo, en la vista o controlador.Esto crea salida de datos por lo que se genera el error, para eso añadimos en la primera línea de la función del controlador Configure::write(’debug’,0); , función que lo que hace es cambiar el nivel de debug a modo producción, donde no se muestra ningún mensaje, ni de error ni warnings.
- Existencia de caracteres de salto de línea o espacios después del símbolo de fín de archivo php, ?>. Para esto hay que comprobar todos los ficheros de nuestro proyecto y borrar todos los caracteres o saltos de línea que haya al final del fichero. Esta suele ser la razón más habitual para este error por lo que debemos comprobar todos los ficheros antes de tirar la toalla con tcpdf.
Dudas de cakephp » dudas
Crear pdfs en cakephp utilizando TCPDF
(8 mensajes)-
Publicado hace 1 year #
-
Hola nuria gracias por tu repuesta, pero hice lo que me recomendaste y de ninguna de las dos maneras me funciona, aqui te dejo el codigo de la funcion del controlador que me redirecciona a la vista que crea el pdf
function departamento($generar=null)
{if($generar!=null)
{
$sql="select formatos.*, departamentos.nombre from formatos, departamentos where formatos.departamento_id= 1 and departamentos.id= 1 and formatos.departamento_id= departamentos.id;";
$forma = $this->Departamento->query($sql);$this->set('forma',$forma);
$this->render('pdfdepartamento','pdf');
}
else
{
$this->layout="ajax";
}
}
la vista se llama pdfdepartamento si lo dejo de ese modo no funciona, pero si renombro la vista y la llamo pdf y en el render en vez de llamar a pdfdeparttamento llamo a pdf si funciona, no se que pueda estar pasndo si tienes akguna sugerencia te lo agradeceria
Gracias.........Publicado hace 1 year # -
Hola compañeros, tengo un problema en mi creacion de pdf con tcpdf , porque no sale nada con fuente Arial, he mirado en tcpdf1-php4/font/ (y ahi no hay ningún archivo Arial.php),,,,será eso la razón, el problema lo explico bien, en esta url
http://www.forosdelweb.com/f18/error-con-tcpdf-fuente-arial-html-pdf-502379/
me podeis ayudar?
os lo agradeceria.Gracias.
Publicado hace 6 months # -
Hola amigo primero que nada un saludo y felicidades por tu web, te comento que he seguido tu tutorial de crear pdf's, pero no logro generarlo me da el error que comentas "TCPDF ERROR: Some data has already been output, can't send PDF file" ya revise todos mis archivos en busca de saltos de linea antes de <?php y despues de ?> y tambien agregue lo del debug y nada, sique sin funcionar
Funcion:
function pdf($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->Alumno->findById($id);
$this->set("datos_pdf",$resultado);
$this->layout = 'pdf'; //esto usara el layout pdf.ctp
$this->render();
}Vista pdf.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?>
Investigue varios tutoriales pero todos con el mismo resultado, copio el codigo tal cual, pero no funciona, espero me puedas ayudar
gracias
Publicado hace 2 months # -
Buenas, si ya revisaste todos los ficheros para que no hubiese caracteres tras las etiquetas de apertura y cierre de PHP, no sé qué te puede estar pasando. Supongo que ya conocerás Firebug, ¿has mirado la respuesta de la petición por si te da alguna información más acerca de la salida? Existe también la herramienta Debug kit que te puede dar información interesante sobre la salida para ver si está mostrando algún carácter antes de hacer la llamada Output, que es siempre la causa de este error.
Publicado hace 2 months # -
hola, excelente web, mi pregunta es si existe alguna forma de mostrar un arreglo en el pdf, algo asi como colocar una sentencia foreach que vaya creando las celdas con los valores recuperados del array, estoy intentandolo pero nada.
Publicado hace 1 month # -
Sí, se puede hacer. Sólo debes tener en cuenta el ir avanzando en la posición de las celdas. Si te resulta más cómodo existe también la función "writeHTML" que te permite crear el contenido con código HTML y luego imprimirlo al PDF, aunque está bastante limitada en las etiquetas que soporta.
Publicado hace 1 month # -
muchas gracias lo resolvi de esta forma:
$y = 122;
foreach($datos['Datos'] as $clave):
$tcpdf->SetXY(0,$y);
$tcpdf->Cell(26,0, $clave['valor'], 0, $ln=0, 'C', 0, '', 0, false, 'T', 'T');
$tcpdf->Cell(23,0, $clave['valor2'], 0, $ln=0, 'C', 0, '', 0, false, 'T', 'T');
$tcpdf->MultiCell(80,0, $clave['valor3']."\n".$clave['valor4'], 0, 'C', 0, 0);
$tcpdf->Cell(36,0, $clave['valor5'], 0, $ln=0, 'C', 0, '', 0, false, 'T', 'T');
$tcpdf->Cell(38,0, $clave['valor6'].' '.$clave['valor7'], 0, $ln=0, 'C', 0, '', 0, false, 'T', 'T');
$y = $y+22;
endforeach;no se sera lo mas profesional, pero me funciona bien.
Publicado hace 1 month #