Crear archivos PDF con CakePHP

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

Tags de búsquedas:

cakephp pdf,pdf cakephp,imprimir cakephp,generar pdf cakephp,generar informes cakephp,tcpdf incluir http a otra pagina,cakephp generar pdf,app que generan pdfs,crear pdf cakephp,no puedo generar reportes cakephp,no se puede crear pdf error,metodo para establecer tamanio de hoja en libreria tcpdf,mostrar codigo html en el write de tcpdf,listar los registros de una tabla con tcpdf,pdf cakephp 1 3

Noticias relacionadas »

60 comentarios en Crear archivos PDF con CakePHP

  1. Gina
    / Responder

    Hola, gracias por el artículo.
    He seleccionado Cakephp como framework, pero tengo un inconveniente a la hora de exportar a pdf. No me salen las tildes ni las ñ en las palabras. Para ser más exacta no me salen las palabras que tienen esos caracteres. Me han dicho que se soluciona con encode o decode, pero no tengo la menor idea de donde poner eso, y cómo solucionarlo

  2. carmen
    / Responder

    Muy buen articulo, pero algo se me debe estar pasando porque no me marca error solo me da algo como esto:

    %PDF-1.3 %���� 1 0 obj <> endobj 2 0 obj <> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources <> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj <> endobj 6 0 obj <> endobj 7 0 obj <> stream x�eam endobj xref 0 8 0000000000 65535 f 0000000015 00000 n 0000000080 00000 n 0000000126 00000 n 0000000257 00000 n 0000000286 00000 n 0000000391 00000 n 0000000454 00000 n trailer <> startxref 688 %%EOF

    Ya lei todos los comentarios de abajo pero nada!, espero puedan aconsejarme!

    • marcel
      / Responder

      Hola Carmen a mi me ocurre lo mismo como pudiste solventar eso q sale ayudame mi email es marcel4233@gmail.com

  3. aurelio
    / Responder

    muy buen tutorial
    pero cuando pongo todo y lo mando llamar me sale “no has seleccionado ningun pdf.”
    y no se como solucionarlo.

  4. Mda
    / Responder

    Hola…
    De antemano muchísimas gracias por el post, me sirvió muchísimo… si genera el pdf de manera normal con la fecha y la página en el pie, pero si quiero tomar datos de mi controlador me sale el error

    Some data has already been output, can’t send PDF file

    y nadamás no hallo la solución. Espero puedas contestar pronto… Saludos.

  5. Oreana
    / Responder

    Hola Pedro, ante todo saludos y felicitaciones por iniciativas como estas. Te cuento que implementé el código que explicaste en mi aplicación, y aunque no me arrojó ningún error tampoco me muestra indicios de descargar el archivo. Podrías ayudar a aclarar mi panorama por favor. Ya leí detenidamente los comentarios del foro y ninguno de los problemas que resolvieron en el pudieron ayudarme. Gracias pedro de antemano!!

  6. cesar
    / Responder

    hola soy nuevo en cake, y me gustaría que me pasen un tutorial para convertir en pdf con tcpdf para versión de cakephp 2.4.5

  7. oscar
    / Responder

    hola pedro gracias por tu ayuda. siguiendote desde twitter,
    Veras mi problema es el siguiente. debo imprimir documentos que van en hojas membretadas… por lo q para ubicar los datos en cierta posición de la hoja uso esto:

    $tcpdf->SetFont( $textfont,”, 8 );
    $tcpdf->SetXY( 165, 4 );
    $tcpdf->Cell( 0,0, $texto, 0, 0 );

    y funciona bien en desde la pc q usé para hacer el documento, pero por alguna razon, si uso otra pc, con otra impresora, el formato sale descuadrado, ya no concuerdan del los textos, con la posicion que les di….. salen mas arriba o mas abajo.Y la solución es hacer una version de ese archivo para esa maquina pero esto no es practico ya que son 6 maquinas que usan el sistema y 2 impresoras diferentes.

    Alguna solución para esto ? Estare haciendo algo mal ?
    Gracias por tu ayuda.

    • Pedro Ventura
      / Responder

      Hola Oscar,

      mmmm que raro, en principio estás ubicando el texto mediante una posición del eje de coordenadas, por lo que al descargar el pdf siempre te debería salir lo mismo. Lo raro es que luego se imprima mal… deja de usar la funcion SetXY y solo usa la funcion Cell() para ubicar y posicionar el texto. En la documentación de tcpdf tienes archivos php de ejemplo http://www.tcpdf.org/examples.php que puedes ir probando parar ver los resultados que van generando.

      Otro consejo, mucho mejor, es que pruebes un plugin nuevo, ya que este artículo es algo viejo. Me imagino que será una lata que tengas que cambiar todo el código pero te aconsejo que uses este Plugin https://github.com/ceeram/CakePdf es de ceeram que es core de CakePHP, el código es de gran calidad y por lo que he visto es mucho más versátil y el contenido que se muestra en el pdf puede ser renderizado desde un template que es mucho más fácil.

      Espero haberte ayudado, ya nos contarás!

      • oscar
        / Responder

        Hola pedro gracias por la respuesta. Mi version de cakephp es la 1.2, veo que el plugin que me das es para version 2.0+, al parecer no seria compatible pero igual probare. Por otro lado no veo que el método Cell tenga trabaje con coordenadas x,y solo usa w y h width y height, pero igual probare. Y como segunda duda, tengo un problema con el Firefox, resulta que se come algunas letras con acentos. mientras que mis PDF (que me produce el TCPDF), salen bien en otros navegadores.. que cres que pueda ser. ?

        • Pedro
          / Responder

          Si tu versión es la 1.2 entonces ese plugin no te va a servir.

          Mira la funcion MultiCell(), a lo mejor te puede servir, así es como se ve este ejemplo de pdf http://www.tcpdf.org/examples/example_005.pdf es algo así lo que quieres,no? donde una celda esté ubicada en una posición concreta,no? El código es este http://www.tcpdf.org/examples/example_005.phps donde se usa la función MultiCell()

          Sobre el problema ese de codificación, estás seguro que todo esté en utf8? el código de CakePHP, la base de datos?

          Un saludo!

          • Marcel

            Hola pedro perdona incomodarte soy San Cristobal Venezuela y estoy dandome contra la pared con cakephp de manera nativa no e tenido rollo pero orita generando el pdf me arroja esto que es no creo q sea un error de la libreria AYUDAME POR FAVOR marcel4233@gmail.com
            me sale esto:
            %PDF-1.7 %���� 21 0 obj << /Type /Page /Parent 1 0 R /LastModified (D:20160704153232+02'00') /Resources 2 0 R /MediaBox [0.000000 0.000000 595.276000 841.890000] /CropBox [0.000000 0.000000 595.276000 841.890000] /BleedBox [0.000000 0.000000 595.276000 841.890000] /TrimBox [0.000000 0.000000 595.276000 841.890000] /ArtBox [0.000000 0.000000 595.276000 841.890000] /Contents 22 0 R /Rotate 0 /Group <> /Annots [ 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 17 0 R 18 0 R 19 0 R 20 0 R ] /PZ 1 >> endobj 22 0 obj stream x��]w�6�uͧP��sVE�%��]�$]ڵ���v���%˖��������0�ۀ�Z0�C,[�����Nj�(�����~��C�W�\6~�����B1�^4�ѣ���+(�����j�<

  8. leo
    / Responder

    muy buen tutorial genio. al principio me daba el siguiente error:
    Fatal error: Class ‘TCPDF’ not found.
    Edité la linea en la vista:
    App::import(‘Vendor’,’tcpdf’);
    Y la dejé así:
    App::import(‘Vendor’,’tcpdf/tcpdf’);
    Y arrancó perfecto!!!

  9. Jose Antonio ros
    / Responder

    He seguido al pie de la letra tu ejemplo, y me encuentro con que:
    El archivo PDF lo crea, pero me deja un mensaje: El archivo no empieza por ‘%PDF’.
    He leido el comentario al respecto que tienes por ahi, pero no consigo solucionarlo.
    Y otra cosa. Dentro del $htmlcontent necesitaria editar unas variables procedentes del registro que he leido en la aplicacion, por lo que, necesito imprimirlas con <?php echo… Como puedo introducir codigo php dentro nde la variable $htmlcontent.
    Si puede ayudarme en estos dos puntos, te lo agradecere

  10. miguel
    / Responder

    Saludos… la verdad no me funciona, ni de esta, ni de ninguan manera que encuentro en la red… conocen a alguna pagina o blog que detalle mas explicitamente como generar archivos pdf desde cakephp? porque no la manera de generar dichos archivos en ninguna de mis aplicaciones y ya lo necesito :S …. gracias….

    • Pedro Ventura
      / Responder

      Hola Miguel

      Es cierto que generar pdf en cakephp suele dar muchos problemas, de hecho a mi me costó mucho trabajo porque me daba muchos errores. Prueba a leer todos los comentarios que hay en éste artículo porque puede que a otros lectores o programadores le haya pasado lo mismo.

      Que versión de CakePHP tienes?

      • miguel
        / Responder

        Gracias por responder a mi pregunta.. y pues si la verdad da muchos errores, pero como todo en la programación es posible si se toma el tiempo y si se lee con cuidado se pueden resolver… Estoy usando la versión de CakePhp 1.3 porque es la que tiene información mas detallada a mi parecer (sin embargo en diferencia a la 2.1 no le veo grandes cambios a la hora de desarrollar allí)… pero bueno, el caso es que pude generar los pdf utilizando el tcpdf, pero detalles como el Output no me funcionan (el archivo siempre se me genera con el nombre ‘pdf’ sin importar cual coloque)… además el problema mas grande que aun me persiste es el llamado de la base de datos… genero la variable que contiene el llamado y en la vista enlazo la variable, pero me devuelve campos en blanco o la palabra Array… alguna idea de que pueda ser?…… Gracias nuevamente….

  11. elena
    / Responder

    Hola, estoy tratando de hacer los reportes usando la version 2.1 de cakephp, pero no me funcionan, ¿tendras algun ejemplo de como generarlos utilizando esta versión por favor?
    muchas gracias de antemano

  12. Sergio
    / Responder

    Lamentablemente no me funciona. Me sale el siguiente error:

    TCPDF ERROR: Some data has already been output, can’t send PDF file

    No se cómo solucionarlo. ¿Alguien me ayuda?

    • rolucio
      / Responder

      Tienes que agregar la linea:
      ob_end_clean();

      en tu vistapdf.ctp al principio!!!

      antes de :

      App::import(‘Vendor’,’xtcpdf’);
      $tcpdf = new XTCPDF();
      // create new PDF document
      $tcpdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, ‘UTF-8’, false);
      …..
      ….

  13. Mpadron
    / Responder

    Buenos dias, felicitaciones por tu blogs y los diferentes notas contenida en ella, una pregunta a ver como me puede ayudar:
    Tengo un reporte en TCPDF, en donde la primera hoja quiero imprimir una cabezera y a partir de la segunda en adelenate otra, trato de hacerla de esta manera:
    public function Header($segundaHoja,$banco,$cliente,$Cta_cte,$fecha_finals,$ano) {
    if ($segundaHoja===true) {
    // *** replace the following parent::Header() with your code for TOC page
    //parent::Header();
    $this->Image(‘/var/www/SISCONVAPOST/app/webroot/img/LogoUnerg.jpg’,10,10,40,20);
    $this->Cell(180,3,”Respublica Bolivariana de Venzuela”,0,1,’C’);
    $this->Cell(180,4,”Universidad Rómulo Gallegos”,0,1,’C’);
    $this->Cell(180,5,”San Juan de los Morros Ed. Guárico”,0,1,’C’);

    } else {
    // *** replace the following parent::Header() with your code for normal pages
    //parent::Header();
    //$this->SetX(10);

    $this->Cell(180,6,$banco,0,1,’C’);
    $this->Cell(180,7,$cliente,0,1,’C’);
    $this->Cell(180,8,”Cta. Cte. Nº.: “.$Cta_cte,0,1,’C’);
    $this->Cell(180,7,”Depositos Originales Correspondiente al mes “.$fecha_finals.” de “.$ano,0,1,’C’);

    }

    Pero no sale, como quiero, a partir de la 3 hojas no sale ningun encabezado, sera q me podrias orientar. gracias

  14. Leonardo
    / Responder

    Felicitaciones por tu blog. Relamente tienes una forma de explicar las cosas y una dedicacion digna de destacar. Muchas gracias por tu tiempo y tu generosidad.

  15. sebastian
    / Responder

    hola pedro,hice tu ejemplo para mi tabla cotizaciones que quiero exportar a pdf
    y aparece
    Error del servidor
    El sitio web ha detectado un error al recuperar la Es posible que esta esté inactiva debido a tareas de mantenimiento o que se haya configurado de forma incorrecta.

    cambio el debug a 3 y aparece:

    Fatal error: Class ‘XTCPDF’ not found in

    ojala puedas ayudarme

    • sebastian
      / Responder

      gracias por tu rapida respuesta como ayudas con tu blog ¬¬

    • Patrick I. Oliveras
      / Responder

      El archivo xtcpdf.php debe ir directamente en la carpeta Vendor y no en tcpdf.php, si es que ese tienes la inclusión como App::import(‘Vendor’,’tcpdf/tcpdf’);

      Ya sé que ya no te sirve, pero para echarle la mano a los demás que lleguen al mismo problema. Saludos!

  16. Dayan
    / Responder

    Hola despues de buscar mucho encontre tu tutorial, y esta genial!!! muchas gracias me funciona a la perfeccion, pero tengo un pequeño problema, como hago para que en el documento me muestre mas de una tupla de la base de datos?, por ejemplo como sacar un reporte de todos los usuarios que nacieron en 1990… Gracias de antemano…

    • Pedro Ventura
      / Responder

      Pues esto es tema de mysql. Tendrá que mirarte la documentación de mysql, pero será algo similar a esto:

      SELECT *
      FROM table
      WHERE DATE >= '01/01/1990' AND DATE <= '30/12/1990'
      
      • Dayan
        / Responder

        Mil gracias por responder… ya solucione ese tema y ya muestro los datos de mi bd con querys a la misma… todo bien!!! hasta ahi… , es decir localmente funciona a mil maravillas hasta redimencione el tamaño de la hoja 1/2 carta para que me imprima notas de entrega, recibos, etc., pero cuando subí la pagina al servidor y probe, me sale el siguiente error:

        TCPDF ERROR: Some data has already been output to browser, can’t send PDF file

        No me muestra los pdf como cuando funciona localmente…

        Te agradeceria alguna sugerencia para solucionar aquello, ya revise lo de los espacios antes y despues de ….

        Gracias de antemano…

        • Pedro Ventura
          / Responder

          Puede que sea que en local tienes algún reporte de errores y en producción no. Prueba a poner al principio del php

          error_reporting(0);
          

          Sino, esto me ha pasado a veces que hay algún espacio en blanco en el fichero, normalmente al final de éste y da este problema

  17. Isra
    / Responder

    Wooow gracias por este tuto, es el mejor que encontre de verdad me sirvio mucho funciona a la perfeccion

  18. elvis
    / Responder

    Muy bueno el tuto, yo había probado con dompdf pero me daba algunos errores al rederizar la vista, pero con tcpdf me esta funcionando de maravilla aunque sea mas moroso crear el pdf.

  19. Juan
    / Responder

    Primero que nada: Gracias por este articulo tan útil! segui las instrucciones y logre ver el archivo pdf (aunque no se mostró la imagen pero si el texto). Ahora quiero visualizar los datos del objeto Post los cuales extraigo de una tabla pero no se el procedimiento completo. En tu ejemplo usas
    $resultado = $this->Post->findById($id);
    $this->set(‘datos_pdf’,$resultado);
    Pero no entiendo como debo usar datos_pdf en el archivo cargar.ctp si me puedes aclarar esta duda te lo agradecería.

    • Pedro Ventura
      / Responder

      Buenas Juan,

      Gracias por tu comentario!

      Bueno te explico, lo que yo tengo es un ejemplo. Que puede ser algo que no necesitas, simplemente es ilustrativo. Por lo que es posible que tu no necesites asignar datos a la vista, o si… eso ya es lo que tu necesites.

      Ahora bien te explico el ejemplo, lo que hago es recoger los datos del Modelo Post cuyo identificador sea $id. Bien.
      Esto que se ha obtenido va a ser un array y lo seteo en la vista. con

      $this->set(‘datos_pdf’,$resultado);

      Si tienes dudas lo primero que puedes hacer es un

      debug($datos_pdf); o var_dump($datos_pdf); 

      en la vista, para comprobar que se ha seteado bien los datos y llegan a la vista. Si tienes problemas y te da errores, prueba a renderizar otro layout que no sea el de pdf, en la función del controller en vez de poner

        $this->layout = 'pdf';

      pon

        $this->layout = 'default';

      o cualquier otro layout que tengas creado para tu aplicación.

      Y luego ya desde la vista vas colocando los datos de $datos_pdf donde necesites y en la posición que necesites en el html o en el pdf.

    • Juan
      / Responder

      Ya lo resolvi utilizando $datos_pdf como sigue:
      $tcpdf->Cell(60,20,$datos_pdf[‘Post’][‘title’], 0, 10);

      Ahora tengo otra duda. Cuando utilizo cualquiera de los ejemplos de http://www.tcpdf.org/examples.php obtengo el siguiente error:Fatal error: require_once() [function.require]: Failed opening required ‘../tcpdf.php’

      • Juan
        / Responder

        Pedro y muchas gracias por tomar un poco de tu tiempo para aclarar en forma tan explicita la duda que tenia!

      • Juan
        / Responder

        Pedro encontre una manera (forma absoluta) de usar los ejemplos de http://www.tcpdf.org/examples.php:
        Tomo cualquiera de los ejemplos y lo agreo como una accion del controlador Post, en este caso la llame imprimir.ctp; luego sustituyo tanto en require_once(‘../config/lang/eng.php’) como en
        require_once(‘../tcpdf.php’); colocando la ruta completa donde se encuentran respectivamente tcpdf.php y eng.php asi:
        require_once(‘Unidad:/ruta/completa/config/lang/eng.php’);
        require_once(‘Unidad:/ruta/completa/tcpdf/tcpdf.php’); (funciono usando ‘/’ o usando ” aunque creo que debe haber una manera mas elegante de indicar la ruta en forma relativa).

        • Pedro
          / Responder

          Lo puedes hacer con el require_once como haces, pero lo suyo es incluirlo como Vendor, App::import(‘Vendor’,’tcpdf/tcpdf’);

          Luego para la barra, utiliza la constante DS, que sirve para pintar los separadores.
          require_once(‘Unidad:’.DS.’ruta’.DS.’completa’.DS.’tcpdf’.DS.’tcpdf.php’);

          • Juan

            Gracias por esa recomendacion. Estoy tratando de implementarla. Sin embargo se me esta presentando un problema con algunos ejemplos, cuando los trato de usar me aparece el siguiente error: “el archivo no empieza por ‘ %pdf-‘”; he buscado una solucion a través del buscador de google pero ninguna me ha funcionado. Estoy usando la ultima version de Wampserver (2.1) y las versiones 6 y 9 de Adobe Reader… ¿Tienes alguna idea que me sugieras Pedro? Gracias!

          • Pedro Ventura

            Eso mismo me pasó hace mucho tiempo, pero no recuerdo muy bien como lo solucioné… vaya tenía que haber documentado ese error en su día.

            Creo que puede venir por que tienes algun espacio en blanco, o algo relacionado en la vista, como te digo no recuerdo muy bien.

            Si quieres usa este código de ejemplo que te paso, que es el que tengo en una de mis vistas y que funciona ok

            <?php
            App::import('Vendor','xtcpdf'); 
            $tcpdf = new XTCPDF();
            $textfont = 'freesans'; // looks better, finer, and more condensed than 'dejavusans'
            
            $tcpdf->SetAuthor("");
            $tcpdf->SetAutoPageBreak( false );
            $tcpdf->setHeaderFont(array($textfont,'',10));
            $tcpdf->xheadercolor = array(255,255,255);
            $tcpdf->xheadertext = '';
            $tcpdf->xfootertext = '';
            
            // Now you position and print your page content
            // example: 
            $tcpdf->AddPage();
            $tcpdf->SetTextColor(0, 0, 0);
            // test Cell stretching
            // set JPEG quality
            
            $htmlcontent = '<img src="http://www.pedroventura.com/images/logo.jpg" /><p>Destinatario:</p>';
            
            // output the HTML content
            $tcpdf->writeHTML($htmlcontent);
            //$tcpdf->setJPEGQuality(100);
            //$tcpdf->Image('https://www.todopapas.com/img/logo_tpp.jpg');  
            //$tcpdf->Cell(0, 10, 'Destinatario:', 0, 1, null, 0, '', 0);
            $tcpdf->Cell(0, 10, strtoupper($datos_user['User']['nombre']).' '.strtoupper($datos_user['User']['apellidos']), 0, 1, null, 0, '', 0);
            $tcpdf->Cell(0, 10, strtoupper($datos_user['User']['direccion']), 0, 1, null, 0, '', 0);
            $tcpdf->Cell(0, 10, strtoupper($datos_user['User']['localidad']), 0, 1, null, 0, '', 0);
            $tcpdf->Cell(0, 10, $datos_user['User']['cp'].' '.strtoupper($datos_user['GeoIntProvincia']['provincias_nombre']), 0, 1, null, 0, '', 0);
            $tcpdf->Cell(0, 10, $datos_user['User']['tlf'], 0, 1, null, 0, '', 0);
            
            echo $tcpdf->Output('filename.pdf', 'I');
            
            ?>
            
          • Juan

            Ya resolvi el problema “el archivo no empieza por ‘ %pdf-’ “: Cuando copiaba y pegaba el codigo de los ejemplos dentro del imprimir.ctp se insertaba una linea en blanco con caracteres extraños. Solo repeti la operacion de copiar y pegar en forma “limpia” sin pegar espacios o carecteres extraños al final de linea. Pedro todavia tengo dudas para usar el App::import(‘Vendor’,’tcpdf/tcpdf’) que me sugeristes pero estoy en eso.

          • Pedro Ventura

            me alegro!! bueno como tenia la sensación tenia que ser algún carácter raro o espacio en blanco. Sobre lo del App::Import, de que tienes dudas? no te entiendo muy bien. App::Import en cakephp no es mas que un include() de php. No te lies mucho con esto es muy simple.

          • Juan

            Que tal Pedro, como estas? Con respecto al último comentario que me enviastes sobre el uso del App::import() le he “hechado cabeza” y sigo con dudas sobre su uso. El problema comienza con las instrucciones require_once(‘../config/lang/eng.php’);
            require_once(‘../tcpdf.php’); que como te comente no me funcionaban, asi que coloque en ambas las rutas completas: require_once(‘ruta/completa/config/lang/eng.php’);
            require_once(‘ruta/completa/tcpdf.php’); y asi si corrio. Tu me sugeristes usar App::import(‘Vendor’,’tcpdf/tcpdf’); las use para sustituir ambas instrucciones pero no se que partes de las rutas debo colocar (si es que tengo que colocar las rutas). En resumen solo me ha funcionado combinando las instrucciones asi tal cual como siguen: App::import(‘Vendor’,’tcpdf’); require_once(‘ruta/completa/tcpdf/config/lang/eng.php’); ¿Debo usar App::import para apuntar al archivo eng.php o la carpeta que lo contiene? y ¿Cómo indicar su ubicacion al App::import? Gracias!

          • Pedro Ventura

            Buenas Juan,

            Bueno a ver creo que estas algo confuso.
            Tal cual lo tienes ahora esta perfecto!!!

            App::Import() te dije que es parecido a un require, pero bueno es algo más no te lo aclaré bien. Se usa para incluir librerías y clases. Por lo que para incluir un php que no es un clase no funciona, y me imagino que en tu /config/lang/eng.php no tendrás ninguna clase, y por esto cakephp no está incluyendo bien este archivo.

            Entonces como lo tienes esta perfecto. Con App::Import importas la clase de tcpdf.php y con el requiere lo que tienes en /config/lang/eng.php

            Por otro lado, te pregunto que es lo que tienes en /config/lang/eng.php??? Son textos? Porque si son textos para diferenciarlos de una versión en ingles, español, portugués, etc.. usa el sistema de internalizacion que trae cakephp “locale” que es una implementacion de los archivos .po de internacionalizacion.

          • Juan

            Oye Pedro muchas gracias de verdad! No me habia fijado en el contenido de ese archivo. Voy a leer un poco más sobre el sistema de internacionalizacion de cakephp. Seguimos en contacto…

      • Mda
        / Responder

        hola…

        en que parte pones

        $tcpdf->Cell(60,20,$datos_pdf[‘Post’][‘title’], 0, 10); ??

        Le busco y nadamas no soluciono el error…

        Gracias

  20. mayuli
    / Responder

    hola Sr Pedro Ventura, tendrá algún ejemplo pero para excel.xls? o alguna recomendación?

  21. Nicolas
    / Responder

    No he podido ver el pdf, cuando intento generarlo, no tira ningun error pero la pagina queda en blanco, probe variar los parametros de memoria que han explicado arriba pero sigo sin resultados, Muchas gracias!

    • / Responder

      Le pusiste el header de pdf header(“Content-type: application/pdf”); ??

      Tienes el debug a 3? Mira el log de errores de apache que seguro te tiene que estar devolviendo algun error

      • Nicolas
        / Responder

        Si activo debug en el controlador me tira esto:
        Fatal error: Call to a member function charset() on a non-object in N:wwwhostcontrolappviewslayoutsadmin.ctp on line 4

        en el log de apache:[Fri Sep 17 09:28:45 2010] [error] [client 127.0.0.1] PHP Fatal error: Call to a member function charset() on a non-object in N:\www\hostcontrol\app\views\layouts\admin.ctp on line 4, referer: http://hostcontrol.local/admin/people

        Y si le puse el header por lo que decias antes, gracias

        • / Responder

          seguro te está fallando una linea en el layout: admin.ctp que será algo así

          echo $html->charset(); 
          

          En tu controlador has incluido el helper de html??

          var $helpers = array('Html');
          
  22. Alan
    / Responder

    Cual es la ruta exacta para ver la descargar del PDF.
    intento con web.com/mi_aplicacion/descargar y nada…

    Gracias

    • / Responder

      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

  23. Alevsk
    / Responder

    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

    • / Responder

      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…

    • Adolfo
      / Responder

      Hola, tengo el mismo problema, lograste encontrar la solución? de antemano gracias!

      • Adolfo
        / Responder

        Es extraño, pero al cambiar la I o la D en el view por una S, el archivo se ve, saludos

        echo $tcpdf->Output(‘mi_archivo.pdf’, ‘S’);

        • Roger
          / Responder

          Lograste al final resolver el inconveniente, a mi me da el mismo error : TCPDF ERROR: Some data has already been output, can’t send PDF file

  24. Dementrio Macias
    / Responder

    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

    • Pedro Ventura
      / Responder

      De nada! me alegro que te haya servido!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

10$ gratis con Digital Ocean »

Este blog está funcionando con Digital Ocean,
para todos los lectores 10$ gratis! para probar el cloud a través del siguiente enlace.


Ir a Digital Ocean

¡Comparte este artículo! »

Sígueme en Facebook »

  • sdfgsdf sdfgsdf (2 semanas)
    dsfasd sdfas asdf asdfa asdfasdfafa asdfsdewtr fdsfsdfasfwewesfsd sdf ds
  • sdfgsdf sdfgsdf (2 semanas)
    sdfgsdf sdfgsdfgsdf sdfg
  • Luis (1 mes)
    Hola Pedro, muchas gracias por transmitirnos tu conocimiento. Te comento…
  • Senado.es: Vuelta al año 2000 - Yorokobu (1 mes)
    […] desarrollador Pedro Ventura explica en su blog cómo alternativas…
  • Pedro Ventura (1 mes)
    Hola Edwer La manera de como hacerlo viene explicada en…
  • Rodrigo (1 mes)
    Tengo una duda, como hago para no repetir el tweet?…

Suscríbete al newsletter »

Proporciona tu correo electrónico a continuación y recibe las últimas noticias! Funciona con Feedburner de Google

Archivo »

Leer entrada anterior
Truco WordPress. Añadir widgets al pie o footer de tu tema de wordpress

¿Cómo meter widgets en el pie o footer de tu wordpress cuando no existe esa zona en la sección widgets...

Cerrar