• Publicidad

PDF generados no andan

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

PDF generados no andan

Notapor BigBear » 2016-06-06 10:42 @487

Hola, estoy probando este código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. # aptitude install libpdf-report-perl
  3.  
  4. use PDF::Report;
  5.  
  6. my $pdf = new PDF::Report( PageSize => 'A4', PageOrientation => 'Portrait');
  7. my %hash_info = ( Author => "Leninmhs - Lenin Hernandez", Creator => "Perl v5.10.1",
  8. Subject => "Practica Perl + PDF::Report ", Title => "Practica Perl + PDF::Report", CreationDate => "D:20110703112700");
  9.  
  10. $pdf->setInfo(%hash_info);
  11. $pdf->newpage(1);
  12. $pdf->setFont('Helvetica-bold');
  13. $pdf->setSize(16);
  14. my ($width, $height) = $pdf->getPageDimensions();
  15.  
  16. #$pdf->addImg( "banner.png" , 20, $height-40);
  17. $pdf->centerString(0, $width, $height-80, "Reporte con PDF::Report en Perl");
  18.  
  19. $pdf->setFont('Helvetica');
  20. $pdf->setSize(12);
  21.  
  22. my $whatis = "Perl es un lenguaje de programacion disenado por Larry Wall en 1987. Toma caracteristicas del lenguaje C, del lenguaje interpretado shell (sh),
  23. AWK, sed, Lisp.";
  24. my $defecto = "Perl esta instalado por defecto en las distribuciones mas populares de GNU/Linux como Debian, Canaima, Slackware, Mandriva, Gentoo, RedHat y SUSE.";
  25. my $lema = "Perl es un gran e insidioso mal perpetrado por habiles pero pervertidos profesionales";
  26. my $lema2 = "Lema Perl: Hay mas de una forma de hacerlo.";
  27. $pdf->addParagraph($whatis, 30, $height-130, $width-60, 30, 25, 10);
  28. $pdf->addParagraph($defecto, 30, $height-180, $width-60, 20, 25, 10);
  29. $pdf->addParagraph($lema, 30, $height-250, $width-60, 20, 25, 10);
  30. $pdf->addParagraph($lema2, 30, $height-290, $width-60, 20, 25, 10);
  31. #$pdf->addImg( "perl_mula.jpg" , 400, $height-420);
  32.  
  33. open(PDF, "> leninmhs.pdf") or die "ERROR: No puedo escribir en leninmhs.pdf: $!\n";
  34. print PDF $pdf->Finish();
  35. close(PDF);
  36. exit;
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


El PDF generado no se abre porque dice que tiene errores. El código en Perl funciona bien y no muestra ningún error, solamente es pdf generado el que no quiere abrir. ¿ Hay algo malo en el código ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: PDF generados no andan

Notapor explorer » 2016-06-06 15:51 @702

En vez de usar el open,print,close, es mejor que uses el método saveAs().

Recuerda que un PDF es un objeto binario, así que si lo que quieres es guardarlo por ti mismo, debes activar el modo binmode() en el momento de guardarlo. Lo puedes ver en el método saveas() de PDF::API2, que es el módulo que está por debajo de PDF::Report.

Finish(), lo que hace, es devolver el PDF de otra forma, en texto codificado, para que pueda ser transmitido en una petición HTTP. Puedes ver el ejemplo en el propio manual de PDF::Report, en Finish.
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: PDF generados no andan

Notapor BigBear » 2016-06-07 17:08 @755

explorer, hacer esto en Perl es muy confuso comparado con Visual :( Estoy poniendo los textos de las columnas abajo del título pero todos, o se pegan todos o están en cualquier lado. ¿Cómo es esto x,y o ancho y largo?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. # aptitude install libpdf-report-perl
  3.  
  4. use PDF::Report;
  5.  
  6. my $pdf = new PDF::Report( PageSize => 'A4', PageOrientation => 'Portrait');
  7. my %hash_info = ( Author => "Leninmhs - Lenin Hernandez", Creator => "Perl v5.10.1",
  8. Subject => "Practica Perl + PDF::Report ", Title => "Practica Perl + PDF::Report", CreationDate => "D:20110703112700");
  9.  
  10. $pdf->setInfo(%hash_info);
  11. $pdf->newpage(1);
  12. $pdf->setFont('Helvetica-bold');
  13.  
  14. my ($width, $height) = $pdf->getPageDimensions();
  15.  
  16. $pdf->setSize(25);
  17. $pdf->centerString(0, $width, $height-80, "Reporte de listado de productos");
  18.  
  19. $pdf->setSize(16);
  20.  
  21. $pdf->addText("id_test",30,$height-20, $width-60);
  22. $pdf->setAddTextPos("20",$width-60);
  23. $pdf->addText("nombre",30,$height-20, $width-90);
  24. $pdf->setAddTextPos("20",$width-90);
  25. $pdf->addText("test",30,$height-20, $width-130);
  26. $pdf->setAddTextPos("20",$width-130);
  27. $pdf->addText("test",30,$height-20, $width-160);
  28. $pdf->setAddTextPos("20",$width-160);
  29.  
  30. $pdf->saveAs("test.pdf");
  31.  
  32. exit;
  33.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


PD : Sigo intentando y es lo mismo: las posiciones no funcionan :oops:
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: PDF generados no andan

Notapor explorer » 2016-06-08 15:58 @707

Por lo que puedo entender del manual, primero llamas a setAddTextPos() para colocar el "cursor", y luego se llama a addText(), pero... no dice nada que los argumentos $hPos, $textWidth y $textHeight sean obligatorios, así que yo probaría a quitarlos, y dejar solo el argumento del texto.

Algo así:

$pdf->setAddTextPos(20, $width-60);
$pdf->addText("nombre");


Como dice el manual, addText() solo vale si antes el texto se ha "ajustado" al ancho de la página donde se va a pintar, y se ha colocado el cursor con setAddTextPos(). Se supone entonces que es para textos pequeños, ya que para párrafos enteros existe addParagraph().

Si le pasas (a addText()) el argumento $textWidth, entonces, internamente, llama a wrapText().
El argumento $hPos sirve para que, en un bucle, vayamos pintando líneas unas debajo de otras, a partir de la misma columna.
Y $textHeight es la altura de cada línea.

Te recomiendo que eches un vistazo a la carpeta de ejemplos que trae la distribución. Por ejemplo, paragraph.pl.
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: PDF generados no andan

Notapor BigBear » 2016-06-11 15:24 @683

explorer, estoy haciendo un gráfico basado en este código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use lib qw(../lib);
  2. use PDF::Report;
  3.  
  4. my $pdf = new PDF::Report(
  5.                           PageSize => "letter",
  6.                           PageOrientation => "portrait",
  7.                           undef => undef
  8.                          );
  9.  
  10. $pdf->newpage(1);
  11. $pdf->setFont('Helvetica-bold');
  12. $pdf->setSize(16);
  13. my ($width, $height) = $pdf->getPageDimensions();
  14.  
  15. $pdf->centerString(0, $width, $height-40, "Big Pie Graph");
  16.  
  17. my @data = qw(2 4 3 2 3 5 2 4 2 3 4 5 3 4 3 5 4 2 4 3 4);
  18. my @labels;
  19. for (0 .. $#data) {
  20.   push(@labels, "label" . $_);  
  21. }
  22. $pdf->drawPieGraph($width/2, $height-200, 100, \@data, \@labels);
  23.  
  24. $pdf->saveAs("test.pdf");
  25.  
  26. exit;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Mi versión es esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use PDF::Report;
  2.  
  3. my @nombres = ("test1","test2","test3");
  4. my @valores = ("100","200","300");
  5.  
  6. my $pdf = new PDF::Report(
  7.                           PageSize => "letter",
  8.                           PageOrientation => "portrait",
  9.                           undef => undef
  10.                          );
  11.  
  12. $pdf->newpage(1);
  13. $pdf->setFont('Helvetica-bold');
  14. $pdf->setSize(16);
  15. my ($width, $height) = $pdf->getPageDimensions();
  16.  
  17. $pdf->centerString(0, $width, $height-40, "Big Pie Graph");
  18.  
  19. $pdf->drawPieGraph($width/2, $height-200, 100, @valores, @nombres);
  20.  
  21. $pdf->saveAs("test.pdf");
  22.  
  23. exit;
  24.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Tengo dos array diferentes; uno con los nombres y otros con los valores para el gráfico; esos array los junto con datos sacados de la base de datos. El error que me muestra es este:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Can't use string ("100") as an ARRAY ref while "strict refs" in use at C:/Perl/site/lib/PDF/Report.pm line 828.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Intenté poniendo los datos como 100 sin comillas para que se vean como números pero aun así sigue el error.
También poniendo \@datos como lo hace el código en el que me basé y sigue el mismo error.

¿ Cómo lo soluciono ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: PDF generados no andan

Notapor explorer » 2016-06-11 18:36 @817

drawPieGraph() exige recibir los argumentos de los datos y de las leyendas como referencias a array, y no como array normales. Por eso, en el ejemplo, ponen \@data y no @data. Y lo mismo para los @nombres. Ha de ser \@nombres.

Si pones dos array como los pones en tu código, Perl "despliega" todos los elementos de @valores, y luego, todos los elementos de @nombres, y luego los manda todos como argumentos a drawPieGraph(). Por eso, el mensaje de error dice que se ha encontrado un valor cuando en realidad estaba esperando una referencia a un array de valores.
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: PDF generados no andan

Notapor BigBear » 2016-06-11 20:25 @892

Genial, gracias por la respuesta a la media noche, explorer. El código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         my $sql = "select nombre_producto,sum(precio) from productos";
  2.         my $consulta = $conexion->prepare($sql) or die("\n\nPREPARE ERROR:\n\n$DBI::errstr");
  3.         $consulta->execute or die("\n\nQUERY ERROR:\n\n$DBI::errstr");
  4.  
  5.         while(@rows = $consulta->fetchrow_array()) {
  6.                 my $nombre_producto = $rows[0];
  7.                 my $precio = $rows[1];
  8.                 #print "producto : ".$nombre_producto."\n";
  9.                 push(@nombres,$nombre_producto);
  10.                 push(@valores,$precio);
  11.                                        
  12.         }
  13.        
  14. #
  15.  
  16. print @nombres."\n";
  17. print @valores."\n";
  18.  
  19. #my @nombres = ("test1","test2","test3");
  20. #my @valores = ("100","200","300","400","500","600","700","800","900");
  21.  
  22. my $pdf = new PDF::Report(
  23.                           PageSize => "letter",
  24.                           PageOrientation => "portrait",
  25.                           undef => undef
  26.                          );
  27.  
  28. $pdf->newpage(1);
  29. $pdf->setFont('Helvetica-bold');
  30. $pdf->setSize(16);
  31. my ($width, $height) = $pdf->getPageDimensions();
  32.  
  33. $pdf->centerString(0, $width, $height-40, "Big Pie Graph");
  34.  
  35. $pdf->drawPieGraph($width/2, $height-200, 100, \@valores, \@nombres);
  36.  
  37. $pdf->saveAs("test.pdf");
  38.  
  39. exit;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Los array de prueba funcionan perfectos, pero el array real de los precios está mal. Dice que no es entero y es verdad, El error:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Argument "" isn't numeric in addition (+) at C:/Perl/site/lib/PDF/Report.pm line
 836.
Illegal division by zero at C:/Perl/site/lib/PDF/API2/Content.pm line 772.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Intenté con soluciones como: $precio += 0; basado en preguntas similares, pero es lo mismo. ¿ Qué debería hacer ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: PDF generados no andan

Notapor BigBear » 2016-06-12 14:17 @637

El error más noob de todos. Tenía que usar
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @nombres;
  2. my @valores;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

en vez de
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @nombres = ();
  2. my @valores = ();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¡Qué cosa más rara! Este tipo de cosas no se ven a la media noche :D

explorer: ¿ no existe alguna opción para poner el valor de cada etiqueta en el gráfico ? Me parece que no, tendré que amontonarlo en la etiqueta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $pdf->drawPieGraph($x, $y, $size, $rData, $rLabels);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: PDF generados no andan

Notapor explorer » 2016-06-13 05:04 @253

Pues no lo sé. ¿Has probado el ejemplo piegraph.pl de la carpeta de ejemplos?

Hay otros módulos más especializados en gráficos en PDF, como el caso de PDF::API2::Content.
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 3 invitados

cron