Página 1 de 1

Error al servir archivo PDF

NotaPublicado: 2013-05-05 16:31 @730
por silva
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.002 segundos, usando GeSHi 1.0.8.4


¿Qué podría hacer? ¡¡¡Gracias!!!

Re: Error al servir archivo PDF

NotaPublicado: 2013-05-05 17:14 @760
por explorer
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().

Re: Error al servir archivo PDF

NotaPublicado: 2013-05-07 10:21 @473
por silva
¡¡¡Correcto!!! Anduvo. ¡¡¡Gracias!!!