• Publicidad

Error al servir archivo PDF

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Error al servir archivo PDF

Notapor silva » 2013-05-05 16:31 @730

Tengo una aplicación web, que genera una archivo pdf, lo guarda a disco y luego lo abre.

El archivo generado es de unos 8 MB de tamaño, se genera bien (lo puedo ver, si accedo a la estructura de carpetas). El problema es que no se abre desde el Apache, es decir, desde mi aplicación web tira error: 500 Internal Server Error

Genero el archivo con API2::PDF, lo guardo a disco y lo abro de la siguiente forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.   $pdf->save;
  2.   $pdf->end);
  3.  
  4.    my $archPDF = $dir_Files . '/'.$FilePDF ;
  5.  
  6.   open PDF, $archPDF or die "Error, No puede abrir archivo PDF" ;
  7.   binmode(PDF);
  8.   my $fileSize = -s $archPDF;
  9.   print "Content-type: application/octet-stream\r\n";
  10.   print "Content-Length: ".$fileSize."\r\n";
  11.   print "Content-disposition: attachment; filename=".$archPDF."\r\n";
  12.   print "Content-Transfer-Encoding: binary\r\n";
  13.   print "Pragma: no-cache\r\n";
  14.   print "\r\n";
  15.   print while (<PDF>);
  16.   close PDF;
  17.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


¿Qué podría hacer? ¡¡¡Gracias!!!
silva
Perlero nuevo
Perlero nuevo
 
Mensajes: 82
Registrado: 2011-05-24 05:59 @291

Publicidad

Re: Error al servir archivo PDF

Notapor explorer » 2013-05-05 17:14 @760

Lo primero que yo haría sería mirar el registro error.log del servidor web para saber qué es lo que ha pasado (ver el mensaje de error que provoca el error 500).

Luego... veo que usas "\r\n". En la mayoría de los casos no es necesario detallar tanto los finales de línea, y con "\n" sería más que suficiente. Incluso sospecho que cada "\r\n" que pones está generando tres caracteres en lugar de solo los dos que necesitas.

Ahora bien... como veo que sacas un archivo binario (el pdf), vamos a suponer que unas líneas antes has hecho un

binmode STDOUT;

para que la salida sea completamente en binario. En ese caso sí está bien el poner los "\r\n", aunque yo, que uso Linux, creo que siempre he usado un simple "\n".

El

print while <PDF>;

se puede reducir a

print <PDF>;

pero yo preferiría usar una sola instrucción read():

read PDF, my $bufer, $fileSize;
print $bufer;


Una cuestión más. ¿El pdf que dejas en el disco, lo vas a necesitar más tarde? Si no es así, te puedes ahorrar el paso de tener que grabarlo y leerlo para luego enviarlo por HTTP. Basta con convertir el pdf en una cadena de caracteres, y eso es lo que sale hacia el usuario:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $pdf_string = $pdf->stringify();
  2. my $pdf_size   = length $pdf_string;
  3.  
  4. print <<SENDPDF;
  5. Content-type: application/octet-stream
  6. Content-Length: $pdf_size
  7. Content-disposition: attachment; filename=$FilePDF
  8. Content-Transfer-Encoding: binary
  9. Pragma: no-cache
  10.  
  11. $pdf_string
  12. SENDPDF
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
¡Ojo! Según la documentación, al ejecutar stringify(), el documento es destruido como si hubiéramos ejecutado un end().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Error al servir archivo PDF

Notapor silva » 2013-05-07 10:21 @473

¡¡¡Correcto!!! Anduvo. ¡¡¡Gracias!!!
silva
Perlero nuevo
Perlero nuevo
 
Mensajes: 82
Registrado: 2011-05-24 05:59 @291


Volver a Web

¿Quién está conectado?

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