• Publicidad

Html a PDF usando HTML::HTMLDoc

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

Html a PDF usando HTML::HTMLDoc

Notapor panterozo » 2011-05-04 18:32 @814

Estimados:

Tengo el siguiente script para generar un PDF a partir de un html. Crea un archivo PDF.pdf, pero con cero byte :s..

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use HTML::HTMLDoc;
  4. use strict;
  5.  
  6. my $str1 = '
  7. <html>
  8. <body>
  9. hola
  10. </body>
  11. </html>
  12. ';
  13.  
  14. my $html = new HTML::HTMLDoc(); # Start instance
  15. $html->set_page_size('letter'); # set page size
  16. $html->set_bodyfont('Arial'); # set font
  17. $html->set_left_margin(1, 'in'); # set margin
  18. $html->set_html_content($str1); # contents to convert
  19. my $pdf = $html->generate_pdf(); # generate document
  20.  
  21. $pdf->to_file('pdf.pdf'); # save document
  22.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4



¿Qué podría ser?

¿Alguna idea?

¡¡¡Saludos!!!
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Publicidad

Re: Html a PDF usando HTML::HTMLDoc

Notapor explorer » 2011-05-04 19:11 @841

¿Has instalado el programa http://www.easysw.com/htmldoc tal y como pone en el README de HTML::HTMLDoc?
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: Html a PDF usando HTML::HTMLDoc

Notapor panterozo » 2011-05-04 20:06 @879

Así es...

%# htmldoc --version
1.8.27


El problema, es que probándolo en otro equipo, el propio, y en un servidor X, funciona correctamente. La única diferencia es que en el servidor en el cual tiene que generar el PDF, es un servidor compartido.

A la gente encargada del hosting, les di la url que aparece en CPAN para el módulo HTML::HTMLDoc htmldoc, ya que no lo tenían incorporado.

Al parecer no es problema de la versión, pero seguiré viendo...

¡¡¡Help!!!
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Html a PDF usando HTML::HTMLDoc

Notapor panterozo » 2011-05-04 21:02 @918

Utilizando el ejemplo que aparece en README, lo corro como cgi y entrega el pdf en el browser..

Quizás sea una solución

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use HTML::HTMLDoc();
  2. my $htmldoc = new HTML::HTMLDoc();
  3. $htmldoc->set_html_content($html);
  4. my $pdf = $htmldoc->generate_pdf();
  5.  
  6. # output the generated pdf to a web-browser:
  7. # send the correct header to the client
  8. print "Content-type:application/pdf\n\n";
  9. print $pdf->to_string();
  10.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Html a PDF usando HTML::HTMLDoc

Notapor panterozo » 2011-05-04 22:20 @972

Ahora el problema es otro...

Tengo que imprimir una tabla HTML en el PDF... He probado montones de formas para poder pasar la tabla al script que imprime en PDF (informe.cgi).

¿Habrá alguna forma de pasar la referencia de la variable \$tabla donde tengo la tabla con el método POST al informe.cgi?, y sino, ¿alguna idea de cómo poder solucionar esto?

Thanks...
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Html a PDF usando HTML::HTMLDoc

Notapor explorer » 2011-05-05 05:26 @268

Si funciona el método to_string(), entonces la solución es sencilla: guardas el PDF obtenido en un escalar, y luego imprimes ese escalar en un fichero pdf.pdf que abrirás con open() (y que además, le has puesto en modo binario con binmode()).

Para el tema de la tabla, en teoría, debería ser tan sencillo como el primer ejemplo: generas la tabla en código HTML y ese código se lo pasas a set_html_content().

Hay otra forma de trabajar con PDF: haciendo en renderizado directamente con instrucciones PDF.

Es algo muy pesado de hacer, porque tienes que calcular y dibujar cada línea, gráfico y texto, pero al final, te sale un PDF perfecto. (Ver PDF::API2, por ejemplo.)

Casi siempre, es mejor hacer la plantilla del PDF en otro programa, y luego, desde el nuestro, leerlo y agregar los textos en los sitios adecuados (PDF::Reuse) Ideal para emitir facturas ;)
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: Html a PDF usando HTML::HTMLDoc

Notapor panterozo » 2011-05-05 10:12 @467

La solución fue...

en vez de poner...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "Content-type:application/pdf\n\n";
  2. print $pdf->to_string();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

para que el PDF se muestre en el browser, se tiene que poner:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $pdf->to_file('/tmp/'.$param.".pdf");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De esta forma, el documento PDF sí es generado, aunque no tengo una respuesta del porqué.

Luego un botón para descargar el PDF y listo. No me gusta mucho que el PDF se genere a la vez que el informe (ya que tenía pensado enviarlo por POST si y solo si desea el PDF), pero por el momento la velocidad de respuesta ni se nota...

Probé otros módulos Perl, pero para lo que necesitaba HTML::HTMLDoc es la mejor opción que encontré, ya que en otros tenía que hacer una por una, todas las líneas de la tabla, y blabla :P...

Al final quedó así...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use HTML::HTMLDoc();
  2. my $htmldoc = new HTML::HTMLDoc();
  3. $htmldoc->set_logoimage('/var/www/images/logo.jpeg');
  4. $htmldoc->set_header('.', 'l', '.');
  5. $htmldoc->set_html_content($contenido); # en $contenido va el html <html><head>...
  6. my $pdf = $htmldoc->generate_pdf();
  7. $pdf->to_file('/tmp/'.$param.".pdf");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y a su vez, un botón para descargar desde la ruta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "<form  action=\"../download.php\" method=\"POST\">
  2. <input style=\"font-family: Arial, sans-serif; font-size: 10 pt\" type=\"submit\" value=\"Informe PDF\" />
  3. <input type=\"hidden\" name=\"id\" value=\"".$param.".pdf"."\">
  4. </form>";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y el código PHP para descargar el documento en PDF:
Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. <?php
  2. $id = $_POST['id'];
  3. $enlace = "/tmp/".$id;
  4. header("Content-disposition: attachment; filename=informe.pdf");
  5. header ("Content-Type: application/pdf");
  6. readfile($enlace);
  7. ?>
Coloreado en 0.025 segundos, usando GeSHi 1.0.8.4


Si alguien tiene un script para descargar PDF en Perl, creo que tendríamos la solución completa ;)

¡¡¡Muchas gracias!!!
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Html a PDF usando HTML::HTMLDoc

Notapor explorer » 2011-05-05 18:15 @802

panterozo escribiste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $pdf->to_file('/tmp/'.$param.".pdf");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De esta forma, el documento PDF sí es generado, aunque no tengo una respuesta del porqué.
Eso es una pista: ahora, quizás, te deja grabarlo en disco porque le estás dando una ruta absoluta al fichero que tiene que crear. Antes, solo indicabas el nombre del fichero, pero no dónde. Si el programa se ejecutaba en un directorio sin permisos de escritura, entonces es normal que no guardara nada.

panterozo escribiste:Si alguien tiene un script para descargar PDF en Perl, creo que tendríamos la solución completa ;)
Pues es casi lo mismo... (no probado)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #
  3. use autodie;
  4. use CGI       qw(:standard      );
  5. #use CGI::Carp qw(fatalsToBrowser);
  6. use File::Slurp;                              # para leer el fichero
  7.  
  8. my $id     = param('id');
  9. my $enlace = "/tmp/$id";
  10.  
  11. die "ERROR" if not -f $enlace;     # aquí comprobamos que nos pasan un id correcto
  12.  
  13. my $buffer = read_file($enlace, binmode => ':raw');
  14.  
  15. # estas cuatro líneas equivalen a la anterior
  16. #open my $pdf, q[<], $enlace;          # abrir
  17. #binmode $pdf;                         # modo binario en entrada
  18. #read $pdf, my $buffer, -s $enlace;    # leemos el fichero
  19. #close $pdf;                           # cerramos
  20.  
  21. print header(                          # cabecera HTTP
  22.     -type => 'application/pdf',
  23.     -Content-disposition => 'attachment; filename=informe.pdf"',
  24. );
  25. binmode STDOUT;                        # modo binario en salida
  26. print $buffer;                         # mandamos fuera el fichero
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


De hecho, podrías enviar el PDF nada más generarlo, sin tener que grabarlo a disco.
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: Html a PDF usando HTML::HTMLDoc

Notapor panterozo » 2011-05-06 08:36 @400

Antes también le daba la ruta al archivo, lo creaba pero con cero byte. También viendo los permisos, y nada.

En la ruta /tmp/, se empezó a llenar de .PDF, y como dices tu, me gustaría generar el pdf pero sin guardarlo...

¿Cómo hacer lo que dices, explorer?
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Html a PDF usando HTML::HTMLDoc

Notapor explorer » 2011-05-06 12:53 @578

El usuario lolguinunsj, hace poco, también tenía ese problema: quería generar un reporte con PDL::ReportWriter, y enviarlo al usuario por el navegador web, para que lo guardara en su disco.

Si sigues el hilo Crear PDF con PDF::ReportWriter verás, al final, que ya lo hemos comentado aquí, tu mismo: después de hacer un to_string(), ya lo tenemos en una variable escalar, así que solo queda enviarlo al usuario. Al final del hilo que te enlazo, tienes el código.
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


Volver a Básico

¿Quién está conectado?

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