http://www.makepovertyhistory.org

domingo, abril 15, 2007

Generando PDF's usando Catalyst y PDF::CreateSimple




Esto es algo que me he dispuesto hacer desde hace un tiempo para darle mejor formato de salida a los reportes que genera mi tesis, pero no hallaba la forma de como hacerlo, acá el resultado después de un tiempo.

Los pasos son:
  1. Crear un proyecto.
  2. Al controlador que llamaremos, le agregamos el modulo a usar y agregamos una acción que será la que genere el pdf.
  3. Llamamos el controlador desde el navegador para obtener de respuesta el pdf.
1
catalyst.pl pdfSimple

2
Editamos el controlador "Root.pm" (nuestro caso) para que quede con estos cambios
--- Root.pm
+++ Root-new.pm
@@ -1,5 +1,6 @@
package pdfSimple::Controller::Root;

+use PDF::CreateSimple;
use strict;
use warnings;
use base 'Catalyst::Controller';
@@ -39,6 +40,17 @@

=cut

+sub pdf : Local {
+ my ($self,$c,$mensaje) = @_;
+
+ my $pdfFile = PDF::CreateSimple->new("root/reporte.pdf",undef,'LETTER');
+ $pdfFile->drawText($mensaje,'Verdana',10,200,450,'black',3);
+ $pdfFile->drawText('Generado con http://www.catalystframework.org/','Verdana',10,200,400,'black',3);
+ $pdfFile->drawImage('root/images/catalyst-logo.png',250,300);
+ $pdfFile->closeFile; # <- esto no envía el pdf para descargar, sino que lo guarda en el disco
+ $c->res->redirect("/archivo.pdf"); # <- acá enviamos al navegador a que muestre el archivo recién guardado
+}
+
+
sub end : ActionClass('RenderView') {}

Es una forma poco elegante, pero funciona en el caso que se quiera usar PDF::CreateSimple (es el modulo que conseguí que se parece mas a fpdf de php)

3
Luego con colocar http://localhost:3000/pdf/clave-123456 en el navegador, debe mandarnos a descargar el archivo pdf, la desventaja de usar este método es que generamos un archivo dentro del proyecto, pero igual podemos lidiar con ello, ya sea eliminándolo con una tarea usando cron o ubicándolo en un directorio y cada vez que se llame el reporte... sobreescribir este.

Material extra:
Artículo de como generar PDF's usando Catalyst, sólo conseguí este http://www.catalystframework.org/calendar/2006/12 Pero el hecho que no es recomendable usarlo en un servidor en producción (porque se altera el módulo agregándole unos parámetros) y la forma como advierten me pusieron a buscar otra alternativa. En eso después de buscar y buscar [1] y no conseguir "esa" forma, entro al canal oficial de irc del proyecto (irc.perl.org #catalyst) donde jshirley, mts y zamolxes me abrieron un poco los ojos al decirme que:

"<> there's nothing magical about catalyst, it doesn't get in your way, it just dispatches urls to actions"

=> No hay algo mágico en catalyst, no se atraviesa en tu camino, el solo despacha url's a acciones.

y me pasaron este ejemplo:

use PDF::CreateSimple;
$pdf = PDF::CreateSimple::idontknowtheapi();
$c->res->body($pdf);
$c->res->content_type('application/pdf');

El cual no aplica fielmente a lo que terminé haciendo, pero es porque el módulo PDF-CreateSimple trabaja diferente.

Espero que esto sea de ayuda para cualquiera, un post mas.

[1] http://www.gossamer-threads.com/lists/catalyst/users/8028