Torsten: PDF-Datei mit perl an Browser zurückgeben

Hallo,
ich möchte mit hilfe eines Formulares einen nummer eingeben, die in meinem script
eine pdf-datei aufrufen soll und an den browser zurückgeben soll, so das automatisch
acrobat reader aufgerufen wird.
in meinem fall erst mal nur eine datei zur auswahl -> testen.
ich gebe also di nummer 001160 ein und möchte die datei  400842.pdf erhalten,
hier ist mal mein script:

#!/perl/bin/perl.exe

read(STDIN, $input, $ENV{'CONTENT_LENGTH'});

@pairs = split(/&/, $input);

foreach $pair (@pairs) {
          ($name, $value) = split(/=/, $pair);
        
          $name =~ tr/+/ /;
          $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
          $value =~ tr/+/ /;
          $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

$FORM{$name} = $value;
                    }

$nummer=$FORM{"nummer"};

if (nummer == 001160)
{
    print "Content-type: application/pdf \n\n";
    print "4008420.pdf";
}

else
{
  print "Fehler";
}

Ich kann die Datei mit einem normalen link ohne Probleme aufrufen, aber über das script
gibt er mir immer die Fehlermeldung:  "Document contained no data. Try later, or contact the server‚s
administrator." als Popup-Fenster.
Info: Der Webserver läuft unter Windows NT Server 4.0 mit IIS4 und ActivePerl.

  1. Hi,

    ich möchte mit hilfe eines Formulares einen nummer eingeben, die in meinem script
    eine pdf-datei aufrufen soll und an den browser zurückgeben soll, so das automatisch
    acrobat reader aufgerufen wird.

    das Verhalten des Client kannst Du nicht bestimmen, sondern nur die Wahrscheinlichkeit des von Dir gewünschten Verhaltens vergrößern.

    #!/perl/bin/perl.exe

    #!/perl/bin/perl -w
    use strict;

    read(STDIN, $input, $ENV{'CONTENT_LENGTH'});

    NEIN!

    Benutze bitte CGI.pm:

    use CGI ':standard';
    my $nummer = param('nummer');

    if (nummer == 001160)

    Hättest Du den w-Switch benutzt (s.o.), wäre Dir Dein Syntaxfehler aufgefallen.

    »»  {

    print "Content-type: application/pdf \n\n";

    print header('application/pdf');

    print "4008420.pdf";

    Und was soll die Ausgabe der Zeichenkette '4008420.pdf'? Du möchtest doch den Inhalt der Datei ausgeben, oder? Dann mußt Du die Datei öffnen, auslesen und ausprinten. Auf archaischen Systemen (Windows) ist der Binmode zu setzen, siehe

    perldoc -f binmode

    else

    »»  {

    print "Fehler";

    »»  }

    Das gibt einen schönen Internal Server Error, weil der HTTP-Header fehlt. Zumindest einen Content-Type solltest Du zurückgeben.

    Ich kann die Datei mit einem normalen link ohne Probleme aufrufen, aber über das script
    gibt er mir immer die Fehlermeldung:  "Document contained no data. Try later, or contact the server‚s
    administrator." als Popup-Fenster.

    Dann würde ich auf Apache wechseln, der hätte Dir einen sauberen 500-Fehler geliefert. Im Error-Log steht dann übrigens mehr.

    Cheatah

  2. Hallo,

    Gleichfalls...

    print "Content-type: application/pdf \n\n";
        print "4008420.pdf";

    So gehts nicht. Du mußt das File 4008420.pdf öffnen, einlesen und dann printen:

    open (FILE,"4008420.pdf") die "Can't Open 4008420.pdf!\n";
       binmode File;         #ob das hier richtig ist, weiß ich nicht, kenne PDF nicht genau.
       @lines = <FILE>;
       close(FILE);

    print "Content-type: application/pdf \n\n";
       print @lines;

    Gruß Frank

    P.S. Ausserdem: sieh Dir mal http://www.oreilly.de/catalog/perlmodger/manpage/cgi.htm an. Die Auswertung von Formularfeldern ist mit CGI-pm viel einfacher.