• Publicidad

Crear PDF con PDF::ReportWriter

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Crear PDF con PDF::ReportWriter

Notapor lolguinunsj » 2011-04-26 09:42 @445

Buen día, un saludo desde San Juan, Argentina.

Este es mi primer post en perlenespanol.com, ¡¡soy muy novato en Perl!!

Les comento:
Estamos trabajando con KOHA (koha.org) aplicación para bibliotecas.
Queremos diseñar una serie de reportes a partir de consultas a MySQL de koha.
Entre las recomendaciones que leímos en este foro vimos que PDF::ReportRriter es, tal vez, lo que estamos buscando.

Instalamos el paquete, todo funciona OK, desde la línea de comandos.

Pero... cuando intentamos ejecutar el mismo .pl desde el browser, surge el error al intentar "salvar el pdf" que es lo que hace PDF::ReportWriter.

La orden $rw->saveas('./reportes/Reporte-opac.pdf'); produce un error que creemos es de derechos para grabar este archivo (¿de Apache?)

¿Es así? ¿Por dónde debemos declarar que el servidor debe permitir generar este archivo para luego visualizarlo? O, si es posible, que no grabe el archivo sino que lo devuelva al browser para visualizarlo.

Desde ya, ¡gracias!

atte.
Luis
lolguinunsj
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-04-26 09:28 @436

Publicidad

Re: Crear PDF con PDF::ReportWriter

Notapor explorer » 2011-04-26 10:16 @469

Bienvenido a los foros de Perl en español, lolguinunsj.

Creo que debemos separar las distintas partes del problema.

Una cosa es la generación del reporte, y otra es cómo enviarlo al navegador del usuario.

PDF::ReportWriter generará el reporte. La cuestión es qué queremos hacer con él.

Si queremos guardarlo en disco, necesitaremos saber en qué directorio tenemos permiso para escribirlo. Dices que te sale un error. Sería interesante ver el mensaje de error. Estará guardado en el registro de actividad (log) del servidor web. Lo normal es que puedas escribir en algún directorio donde el usuario que ejecuta el servidor web tenga permisos de escritura.

Si queremos enviarlo a un usuario, entonces, primero, el programa debe enviarle las cabeceras MIME adecuadas para que el navegador sepa que va a recibir un PDF, obtienes el reporte con la función stringify(), pasas el STDOUT a binario (para que no haga transformaciones de los caracteres que sean finales de línea), y a continuación mandas todo el reporte por la salida estándar.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Crear PDF con PDF::ReportWriter

Notapor lolguinunsj » 2011-04-28 09:27 @435

Hola Explorer, ante todo gracias por la pronta respuesta.

Efectivamente, tenía un problema de derechos de escritura para el usuario www-data. Ya lo solucioné y genera el PDF en la carpeta que le indico.

Ahora bien, para que lo muestre en el browser, apliqué estas líneas Perl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # Esto abre el PDF generado para verlo en el browser o descargarlo       
  2.  open(PDF,"./reportes/Reporte-opac-luis.pdf") or die "could not open PDF [$!]";
  3.  binmode PDF;
  4.  my $output = do { local $/; <PDF> };
  5.  close(PDF);
  6.  
  7.  print "Content-Type: application/pdf\n";
  8.  print "Content-Length: " .length($output) . "\n\n";
  9.  print $output;
  10.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Funciona OK, pero... ¡me coloca como nombre del archivo a ver/descargar el nombre de mi script perl! (ej. reportes.pl). Esto me trae un nuevo problema: al descargarlo la extensión es .pl por lo que no puedo verlo. Debo cambiar la extensión a pdf y allí si sale el contenido.

Consulto: ¿hay forma que le indique cuál es el nombre del archivo a descargar de manera que no tome el nombre del script sino el que le asigne (en el ejemplo "Reporte-opac-luis.pdf") ?

Gracias,
Luis
lolguinunsj
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-04-26 09:28 @436

Re: Crear PDF con PDF::ReportWriter

Notapor explorer » 2011-04-28 10:05 @461

Un detalle antes: tienes que poner un binmode STDOUT antes del print del PDF, para evitar que haya transformaciones de los caracteres del propio PDF.

Luego, para enviarle al navegador el nombre del fichero, creo que es así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print 'Content-Type: application/pdf', "\n";
  2. print 'Content-Disposition: attachment; filename="Reporte-opac-luis.pdf"', "\n";
  3. print 'Content-Length: ', length($output), "\n";
  4. print "\n";
  5. binmode STDOUT;
  6. print $output;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2011-04-28 10:56 @497, editado 2 veces en total
Razón: Editado: corregido un error
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Crear PDF con PDF::ReportWriter

Notapor lolguinunsj » 2011-04-28 14:58 @665

Explorer, ¡¡ahora sí!!, puedo descargar con el nombre correcto, ¡¡muchas gracias!!

Apelo a tu paciencia y tiro otra consulta:

En el ejemplo de ReportWriter http://search.cpan.org/~dkasak/PDF-Repo ... t_%28_xml_[,_data_]_%29 aparece la función que mencionaste en el primer contacto stringgify(), pero no obtengo material de cómo se implementa.

En el ejemplo dice:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         my $rw = PDF::ReportWriter->new();
  2.         my @data = (
  3.                 [2004, 'Income',               1000.000 ],
  4.                 [2004, 'Expenses',              500.000 ],
  5.                 [2005, 'Income',               5000.000 ],
  6.                 [2005, 'Expenses',              600.000 ],
  7.                 [2006, 'Income (projection)',  9999.000 ],
  8.                 [2006, 'Expenses (projection)', 900.000 ],
  9.         );
  10.         $rw->render_report('./account.xml', \@data);
  11.        
  12.         # Save to disk
  13.         $rw->save();
  14.  
  15.         # or get a scalar with all pdf document
  16.         my $pdf_doc = $rw->stringify();
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Entiendo que el pdf armado se almacena en la variable $pdf_doc, pero... ¿que código debo asociarle para que muestre el pdf del lado del usuario?

¿Usar esta función permite que no se grabe el pdf en el servidor y se genere "on fly" y se mande al usuario?

Nuevamente gracias, PDF::ReportWriter tiene muchas opciones para probar y aplicar, que iremos conociendo de a poco.

atte.

Luis
lolguinunsj
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-04-26 09:28 @436

Re: Crear PDF con PDF::ReportWriter

Notapor explorer » 2011-04-28 16:28 @727

Eso es: stringify() devuelve todo el pdf como un escalar.

Entonces, una vez que lo tienes en una variable, puedes hacer lo que quieras: sacarla a pantalla, guardarlo en un fichero, mandarlo a la salida estándar para que le llegue al usuario vía web, etc, etc.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Crear PDF con PDF::ReportWriter

Notapor lolguinunsj » 2011-05-04 08:28 @394

Explorer, sigo intentando usar el método stringify() sin éxito.

Busqué en GoogleBooks y di con una obra "Perl Graphics Programming" que cita un ejemplo de stringify() pero no logro avanzar.

Adjunto el código de mi caso:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use HTML::Template;
  3. use utf8;
  4. use warnings;
  5. use PDF::API2;
  6. use PDF::ReportWriter;
  7. use strict;
  8. use DBI;
  9. use CGI;
  10.  
  11.  
  12. my $query = new CGI;
  13. my %FORM = $query->Vars;
  14. # Crear el DBH (DataBase Handle) que maneja la conexión a MySQL       
  15. my $that_famous_string = 'Conexión a la DB MySQL!';  
  16. my $dbh = DBI->connect(
  17.     'DBI:mysql:koha:localhost:3306',
  18.     'usuario',
  19.     'clave',
  20.     {RaiseError => 1}
  21.     )
  22.     or die "No se pudo conectar a MySQL: $DBI::errstr\n";
  23. #mysql_query("SET NAMES 'utf8'");
  24. $dbh->{'mysql_enable_utf8'} = 1;
  25.  
  26. #$dbh->do('SET NAMES utf8');
  27.  
  28. # Del DBH se crea un STH (STatement Handle) para manejar SQL Statements
  29. my $sth = $dbh->prepare("Select biblio.biblionumber,title,IF(author is NULL,'*******',author),count(*) 'cantidad de ejemplares',IF(publishercode is NULL,'  *******  ',publishercode) editorial,IF(copyrightdate is NULL,'*******',copyrightdate) 'año de edición',
  30. DATE_FORMAT(datecreated, '%d/%m/%y') 'Fecha de creación'
  31. From biblio LEFT JOIN biblioitems on(biblio.biblionumber=biblioitems.biblionumber)
  32. LEFT JOIN items on(items.biblioitemnumber=biblioitems.biblioitemnumber)
  33. where  datecreated>='2010-03-12' and datecreated<='2010-08-18'
  34. group by biblio.biblionumber;");
  35. $sth->execute;
  36. my @some_data;
  37. my $rw = PDF::ReportWriter->new();
  38.  
  39. while (my @row = $sth->fetchrow_array) {
  40. push @some_data,[@row[0], @row[1],@row[2]];
  41. }
  42. my @data = @some_data;
  43. $rw->render_report('./db_report2.xml', \@data);
  44.  
  45. my $pdf_doc = $rw->stringify();
  46.  
  47.  
  48. # Terminar la conexión con MySQL        
  49. $dbh->disconnect;
  50.  
  51. # Acá comienza el problema para mostrar el PDF sin grabarlo
  52. # binmode STDOUT;
  53.  print "Content-Type: application/pdf\n";
  54.  print 'Content-Disposition: attachment; filename="Reporte-luis.pdf"', "\n";
  55.  print "Content-Length: " .length($pdf_doc) . "\n\n";  
  56.  
  57. print $pdf_doc->stringify();
  58.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Al ejecutar este .pl desde la línea de comandos, aparece el siguiente error:
Can't call method "stringify" without a package or object reference at ./db_report2-luis1.pl line 57.

¿A qué se debe este error? ¿falta algún paquete o dependencia?

¡Gracias!

Luis
lolguinunsj
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-04-26 09:28 @436

Re: Crear PDF con PDF::ReportWriter

Notapor explorer » 2011-05-04 10:19 @471

Pero... si YA tienes el PDF generado en la línea 45... ese es el valor que tienes que imprimir...

El error es porque estás intentando ejecutar el método stringify() sobre un escalar, $pdf_doc, que no contiene un objeto PDF::ReportWriter. $pdf_doc contiene el PDF renderizado, el propio contenido del PDF.

Descomenta la línea 52 y cambia la línea 57 por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print $pdf_doc;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Crear PDF con PDF::ReportWriter

Notapor lolguinunsj » 2011-05-04 13:15 @594

¡¡¡Ahora sí!!! ¡¡Muchas gracias, explorer!!

Obtengo el PDF tal cual pretendía.

Me confundió el ejemplo del libro de Perl, pero entendí cómo debe realizarse el procedimiento.

¡¡Hasta la próxima!!
lolguinunsj
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-04-26 09:28 @436

Re: Crear PDF con PDF::ReportWriter

Notapor memrobles » 2018-06-12 19:24 @850

Podrías publicar tu XML, por favor :) como ejemplo.
memrobles
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2015-12-07 15:05 @670


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados