Generar PDF con TCPDF

1,318 views
Skip to first unread message

eyecool

unread,
Aug 28, 2009, 11:14:41 AM8/28/09
to CakePHP en Español
Saludos comunidad. Me ha surgido una duda para generar un archivo pdf
con cake.

Me segui el manual de los panas de Hospedaxes (http://
cakephp.hospedaxes.com/crear-pdf), y efectivamente cree un pdf tal
cual como ellos lo indican alli. Tuve un pequeño error, pero me di
cuenta que tenia que cambiar el parametro "memory_limit" en mi archivo
php.ini.

El caso es el siguiente. Quiero generar un archivo pdf desde una
consulta mysql. Es decir, tengo un formulario donde se "configura" el
reporte, y en base a eso tengo que hacer la busqueda para generar una
tabla con la informacion. Mi archivo de "configuracion" del reporte lo
muestro a continuacion:

/app/views/tickets/reportar_tickets.ctp:

<div id="formulario">
<?php echo $this->renderElement ('logout'); ?>
<?php echo $this->renderElement ('go.menu.admin'); ?>
<fieldset>
<legend>Reporte de Tickets</legend>
<?php
echo $form->create('Ticket',array('action'=>'generarPdf'));
echo $datePicker->picker('Fecha Inicial', array
('id'=>'fechaInicial'));
echo $datePicker->picker('Fecha Final', array
('id'=>'fechaFinal'));
$orden = array
('departamento'=>'Departamento','user'=>'Usuario','equipo'=>'Equipo','prioridad'=>'Prioridad','status'=>'Status');
echo $form->input ('ordenar',array ('label'=>'Ordenar por',
'options'=>$orden,"default"=>"departamento"));

echo $form->end ('Generar Reporte');
?>
</fieldset>
</div>

y esta es la funcion en el controller (No tiene nada):

/app/controllers/tickets_controller:

function reportarTickets() {
// Codigo de la accion
}

No se si estoy haciendo las cosas bien. No se si para configurar el
reporte debe ser con un formulario, y no se como tomar lo que el
usuario "configura" en ese formulario para luego hacer la consulta.
Mucho menos se como pasar eso a un archivo pdf.

Si alguien me puede dar una luz se los agradeceria.

Gracias de antemano a todos.

racanix

unread,
Sep 1, 2009, 11:21:31 AM9/1/09
to CakePHP en Español
En verdad nunca he trabajado con tcpdf para la generacion de reportes,
he
utilizado fpdf que es simple y se acopla muy bien al cakephp y no me
ha presentado
fallas. Como dices que es una inquietud tuya deverias probar fpdf y en
ese
caso podria ayudarte a generar pdfs desde cakephp.
saludos
> ('departamento'=>'Departamento','user'=>'Usuario','equipo'=>'Equipo','prior idad'=>'Prioridad','status'=>'Status');

giovanny rodriguez

unread,
Sep 1, 2009, 2:41:19 PM9/1/09
to cakep...@googlegroups.com
Hola, pues hace poco trabajo con cakephp, y te cuento que tcpdf es la evolucion de fpdf, asi que no te desanimes, tcpdf es el indicado para lo que quieres hacer.

ahora bien, no entiendo la naturaleza de vuestro problema, pero pues en ultimas puedes generar una tabla HTML (con los datos que quieres mostrar, recuerda que en el controlador es donde se debe plasmar tu logica del negocio, y es alli donde debes hacer uso de los metodos que trae cake para ayudarte en la abstraccion de la BD), y pasarla a la vista con el metodo set desde el controlador, una vez en la vista simplemente utilizas el metodo writeHTML para que se pinte en el PDF.

Espero te sirva de ayuda. sin embargo aqui te dejo un ejemplo sencillo de como funciona (es de un tutorial que hay en internet no recuerdo el link en este momento, creo que es un ejemplo en el mismo blog que posteaste antes):

/********* CONTROLADOR ***************/

//metodo del controlador que genera los pdf's
function pdf()
    {
          Configure::write('debug',0);
          $this->layout = 'pdf'; //this will use the pdf.ctp layout
          $this->set('nombreArchivo',    'pdfs'.DIRECTORY_SEPARATOR .     $this->generarNombreArchivo());
          $this->set('contenido',                                        $this->generarTablaHTML());
          $this->render();
    }


/**Genera el nombre de archivo aleatorio*/
    private function generarNombreArchivo()
    {
        mt_srand((double)microtime()*1000);
        return sha1(microtime());
    }
    /**Genera la tabla con los datos para que la utilicen en lo que necesiten*/
    private function generarTablaHTML()
    {
        $datos = $this->getPosts();
        $tablaHTML = '<table border="1" cellspacing="2" cellpadding="2">
                              <tr>
                                  <th>Post</th>
                                <th align="right">Crecion</th>
                                <th align="left">Modificado</th>
                                <th align="left">Usuario</th>
                                <th>Titulo</th>
                                <th>Contenido</th>
                            </tr>';
        foreach($datos as $clave=>$valor)
        {
            //$this->log($valor , LOG_DEBUG);
              $tablaHTML .= '<tr>
                                  <td>' . $valor["Post"]["id"] . '</td>
                                  <td>' . $valor["Post"]["created"] . '</td>
                                  <td>' . $valor["Post"]["modified"] . '</td>
                                  <td>' . $valor["Post"]["nickname"] . '</td>
                                  <td>' . $valor["Post"]["title"] . '</td>
                                  <td>' . $valor["Post"]["content"] . '</td>
                            </tr>';
        }
        $tablaHTML .= '</table>';
        return $tablaHTML;
    }

/********* VISTA ***************/
<?php
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(true);
$tcpdf->setPrintFooter(true);
$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,$contenido,1,1,'C');
//$tcpdf->writeHTML();
$this->log($contenido , LOG_DEBUG);
$tcpdf->writeHTML($contenido, true, 0, true, 0);
$tcpdf->Output($nombreArchivo.".pdf", "F");
?>


como puedes ver no tiene nada raro, lo demas es la misma definicion que hacen en el articulo que mencionaste.



--
Giovanny Rodriguez
Demential Studios
Parquesoft Meta

Wladimir Chopite

unread,
Sep 1, 2009, 6:04:13 PM9/1/09
to cakep...@googlegroups.com
Muchas gracias por la informacion. Y si, efectivamente he leido que TcPDF es la evolucion de fpdf. Fue por eso que decidi optar por esa opcion. Voy a probar el codigo que me enviaron y cualquier cosa comento.

Gracias por la informacion...
--
Atentamente: Wladimir Chopite
                    0424 - 9700264

Wladimir Chopite

unread,
Sep 7, 2009, 9:57:49 AM9/7/09
to cakep...@googlegroups.com
Buenos dias! Ya hice las pruebas con TCPDF y funciona perfectamente. Gracias por los comentarios...

El 2 de septiembre de 2009 14:11, giovanny rodriguez <gio...@gmail.com> escribió:
Reply all
Reply to author
Forward
0 new messages