Symfony 1.4 y TCPDF

Como obtener datos desde una base de datos y mostrarlos en un archivo .pdf

Quiero explicar como hacer posible la recuperación de datos desde una tabla o conjunto de tablas relacionadas de una base de datos, accedida con Symfony 1.4 y luego transformar la información en un archivo de formato PDF usando la libreria TCPDF.

Aquí no explicaré la instalación y uso de la librería TCPDF. Yo recurrí al plugin que está disponible en el sitio oficial de Symfony, pero hay que tener mucho cuidado porque existe un error en el link que aparece en este plugin sobre los archivos a instalar de la librería TCPDF. Pueden ver la naturaleza del problema y la solución que he encontrado consultando aquí:

http://stackoverflow.com/questions/19753485/how-to-use-the-plugin-sftcpdfplugin

Yo he separado el problema en dos partes.
Primero que nada procedo a escribir la consulta, en el archivo que contiene las «actions», que en mi caso toma la forma que se muestra a continuación:

public function executeTest()
{ 
     $this->conflictos1s = Doctrine_Core::getTable('Conflictos1')
      ->createQuery('a') 
      ->leftJoin('a.SectorActividadCiuTa7')     
      ->leftJoin('a.RelacionConflictualPrincipalTa9') 
      ->leftJoin('a.SubsectorActividadTa8')       
       ->leftJoin('a.DemandasTa2')      
       ->leftJoin('a.ActoresTa1')     
       ->leftJoin('a.Conflictos1HasActoresTa1')    
      ->orderBy('a.Id')
      ->execute();  
} 

Luego, yo construyo un template llamado testSuccess.php Hasta aquí nada nuevo en Symfony 1.4. Pero en el template, yo agrego las siguientes líneas de código:
Al comienzo:

<?php ob_start(); ?>

Al final de todo:

<?php $posts = ob_get_contents(); ?>

<?php ob_end_clean(); ?>

El contenido de la vista, queda grabado en la variable $posts
El contendio completo del código del archivo testSuccess.php, se muestra a continuación:

//testSuccess.php

<?php ob_start(); ?>


<h2>Listado de Conflictos</h2>
<table cellspacing="1" border="1">       
  <thead>
    <tr>
      <th width="2%">Id</th>
       <th width="6%">Fecha comienzo</th>
      <th>Relacion conflictual principal</th>
      <th>Sector actividad</th>
      <th>Subsector actividad</th>
      <th>Demandas</th>      
      <th width="20%">Descripcion-general</th>
      <th>Descripcion protagonista</th>
      <th>Descripcion antagonista</th>
      <th>Descripcion demandaprinc</th>
      <th>Nivel estado</th>
      <th>Descripcion sector</th>
</tr>
</thead>
<tbody>
  <?php foreach ($conflictos1s as $conflictos1): ?>
    <tr>
      <td width="2%"><?php echo $conflictos1->getId() ?></td>
      <td width="6%"><?php echo date('d/m/Y', strtotime($conflictos1->getFechaComienzo())) ?></td>
      <td><?php echo $conflictos1->getRelacionConflictualPrincipalTa9() ?></td>
      <td><?php echo $conflictos1->getSectorActividadCiuTa7() ?></td>
      <td><?php echo $conflictos1->getSubsectorActividadTa8() ?></td>
      <td><?php echo $conflictos1->getDemandasTa2() ?></td>
       <td width="20%"><?php echo substr($conflictos1->getDescripcionGeneral(),0,60).'...' ?></td> 
      <td><?php echo $conflictos1->getDescripcionProtagonista() ?></td>
      <td><?php echo $conflictos1->getDescripcionAntagonista() ?></td>
      <td><?php echo $conflictos1->getDescripcionDemandaprinc() ?></td>
      <td><?php echo $conflictos1->getNivelEstado() ?></td>
      <td><?php echo $conflictos1->getDescripcionSector() ?></td>   
    </tr>
    <?php endforeach; ?>      
  </tbody>
</table>
<?php $posts = ob_get_contents();
ob_end_clean(); ?>
<?php $sf_user->setAttribute('para_pdf', $posts); ?>
 <a href="<?php echo url_for('conflictos/testpdf') ?>">Generar Pdf</a>

En el template generamos la vista y capturamos todo lo que el browser «escribe». Agregué al final un link para generar ahora sí el archivo PDF

<a href="<?php echo url_for('conflictos/testpdf') ?>">Generar Pdf</a>

Esto pasa el contenido de la variable $posts a una nueva actions denominada: testpdf de la forma usual:

<?php $sf_user->setAttribute('para_pdf', $posts); ?>

En la nueva actions executeTestpdf, pongamos atención a la siguiente línea de código:

$ html = $ this-> getUser () -> getAttribute ('para_pdf');

La función completa se muestra a continuación:

public function executeTestpdf()
{       
  $config = sfTCPDFPluginConfigHandler::loadConfig();

  // pdf object
  $pdf = new sfTCPDF();

  // set document information
  $pdf->SetCreator(PDF_CREATOR);
  $pdf->SetAuthor('J. H.');
  $pdf->SetTitle('TCPDF Example 001');
  $pdf->SetSubject('TCPDF Tutorial');
  $pdf->SetKeywords('TCPDF, PDF, example, test, guide');

  // set default header data
 $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 001', PDF_HEADER_STRING);

  // set header and footer fonts
  $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
  $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));

  // set default monospaced font
  $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

  //set margins
  $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
  $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
  $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

  //set auto page breaks
  $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

  //set image scale factor
  $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

  // ---------------------------------------------------------
 $pdf->setPageOrientation("L");


  // set default font subsetting mode
  $pdf->setFontSubsetting(true);

  // Set font
  $pdf->SetFont('helvetica', '', 6);

  // Add a page
  // This method has several options, check the source code documentation for more information.

$pdf->AddPage();

$pdf->Write(0, '', '', 0, 'L', true, 0, false, false, 0);


  // Set some content to print


 $html = $this->getUser()->getAttribute('para_pdf');


  $pdf->writeHTML($html, true, false, false, false, '');

  // ---------------------------------------------------------

  // Close and output PDF document
  // This method has several options, check the source code documentation for more information.
  $pdf->Output('example_conflictos.pdf', 'I');

  // Stop symfony process
  throw new sfStopException();
}

Luego, ¡finalmente yo obtengo el archivo en formato PDF con todos los datos correctamente mostrados!

2 comentarios sobre “Symfony 1.4 y TCPDF

Replica a Jorge Halaban Cancelar la respuesta