Problem mit HTML-Formular und pdf-lib
Stefan Muenz
- perl
Liebe Forumer,
heute mal ein Problem meinerseits. Es geht darum, mit einem CGI-Script dynamisch ein PDF-Dokument zu generieren, wobei bestimmte einzusetzende Texte aus einem HTML-Formular stammen. Zum Generieren des PDF-Dokuments wird das pdflib-Modul verwendet (http://www.pdflib.com/). Das Modul ist korrekt installiert, ein PDF-File wird erzeugt. Bei installiertem Adobe-Acrobat-Viewer zeigt der Browser die erzeugte PDF-Datei an. Funktioniert alles so weit - nur beim IE 6.0 gibt es ein Problem.
Zunaechst der Code des HTML-Formulars (trivial):
<form action="/cgi-local/pdftest.pl" target="_blank" method="post">
Einen Text eingeben: <input type="text" name="eingabe" size="40">
<input type="submit" value="absenden">
</form>
Und jetzt der Code des CGI-Scripts:
use strict;
use CGI;
my $cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);
my $inputtext = $cgi->param('eingabe');
use pdflib_pl 4.0;
my $p = PDF_new();
die "Couldn't open PDF file" if (PDF_open_file($p, "../pdftest/hello.pdf") == -1);
PDF_begin_page($p, 595, 842);
my $font = PDF_findfont($p, "Helvetica-Bold", "host", 0);
PDF_setfont($p, $font, 18.0);
PDF_set_text_pos($p, 50, 700);
PDF_show($p, $inputtext); # <--- hier gibts Probleme!
PDF_continue_text($p, "(says Perl)");
PDF_end_page($p);
PDF_close($p);
PDF_delete($p);
print "Location: /pdftest/hello.pdf\n\n";
Das Problem ist, dass die Variable $inputtext beim Internet Explorer 6.0 nicht ausgegeben wird. Bei anderen getesteten Browsern (Netscape 6.1, 4.7 und IE 5.0) dagegen sehr wohl. Ebenfalls ausgegeben wird die Variable - auch in IE 6, wenn man sie mit einem statischen Text initialisiert, also etwa:
my $inputtext = "bla bla";
statt:
my $inputtext = $cgi->param('eingabe');
Das Komische ist ja, dass nicht mal der Browser fuer die Ausgabe zustaendig ist - er ruft ja nur den Acrobat-Viewer auf.
Die Frage ist also, ob da irgendetwas perl-seitig zu machen ist - oder anders gefragt: warum macht es offensichtlich einen Unterschied, ob der Inhalt der Variablen $inputtext mit statischem Text initialisiert wird, oder ob er durch Zuweisen von $cgi->param('eingabe') initialisiert wird?
Falls jemand von euch Erfahrung mit pdflib und Perl und CGI hat, vielleicht faellt da ja jemandem was ein ... ;-)
viele Gruesse
Stefan Muenz
Hallo!
Meines Erachtens liegt das Problem in der Html-Seite. Da wird der Inhalt des Eingabefeldes nicht gesendet, deswegen funktioniert es auch, wenn Du einen 'statischem' Text vorgibst. Da ist also der Fehler zu suchen, nicht im PerlScript.
Warum es aber nicht übertragen wird, kann ich Dir leder auch nicht sagen.
Gruß Markus
Hallo Markus
Meines Erachtens liegt das Problem in der Html-Seite. Da wird der Inhalt des Eingabefeldes nicht gesendet, deswegen funktioniert es auch, wenn Du einen 'statischem' Text vorgibst. Da ist also der Fehler zu suchen, nicht im PerlScript.
Doch, uebertragen wird es - wenn ich HTML-Code an den Browser sende und dabei die Variable ausgebe, ist wie vorgesehen der eingegebene Text drin. Aber du hast trotzdem Recht - im HTML hab ich was gefunden: method="get", und schon funktionierts auch mit dem IE6 ... frag mich nur nicht warum :-)
viele Gruesse
stefan Muenz
Hallo Stefan,
Doch, uebertragen wird es - wenn ich HTML-Code an den Browser sende und dabei die Variable ausgebe, ist wie vorgesehen der eingegebene Text drin. Aber du hast trotzdem Recht - im HTML hab ich was gefunden: method="get", und schon funktionierts auch mit dem IE6 ... frag mich nur nicht warum :-)
Vielleicht schickt unser aller Liebkind irgendeinen Schrott mit (\n,\r,Nullbyte ?) welches erst beim Einsatz der pdf-lib unangenehm auffällt.
Analysiere noch mal genauer, was der Browser da wirklich sendet.
Grüße
Klaus
Hallo Klaus,
Vielleicht schickt unser aller Liebkind irgendeinen Schrott mit (\n,\r,Nullbyte ?) welches erst beim Einsatz der pdf-lib unangenehm auffällt.
Analysiere noch mal genauer, was der Browser da wirklich sendet.
Ich hab an dem String nichts Ungewoehnliches erkennen koennen. chomp hab ich auch mal angewendet - kein Unterschied. Es gibt auch voellig krasse Beobachtungen. Unter IE6 laeuft es mit method="get" nicht unter Win9x, wohl aber unter Win2000, mit IE5.0 geht es auch mit method="post", bei IE5.5 nicht mehr. Also irgendwie nichts Greifbares.
Wer mag, kann es ja auch mal testen. Ich habs jetzt auf dem Server hier installiert: http://www.teamone.de/pdftest/ - einfach einen Text eingeben und absenden. Derzeit ist das "kritische", aber gewuenschte method="post" eingestellt. In dem PDF, das dann generiert wird, muesste ueber der Textzeile "(says Perl)" der im Formular eingegebene Text erscheinen. Wenn nicht, ist auf dem benutzten Browser auch das beschriebene Problem gegeben.
viele Gruesse
Stefan Muenz
hallo stefan,
Ich hab an dem String nichts Ungewoehnliches erkennen koennen. chomp hab ich auch mal angewendet - kein Unterschied. Es gibt auch voellig krasse Beobachtungen. Unter IE6 laeuft es mit method="get" nicht unter Win9x, wohl aber unter Win2000, mit IE5.0 geht es auch mit method="post", bei IE5.5 nicht mehr. Also irgendwie nichts Greifbares.
ich kenn mich weder mit perl noch mit der pdflib aus, aber mein:
IE 6.0.2600.0000 unter Win2000 5.00.2195
macht alles wie gewünscht. also jetzt noch unerklärlicher.
schöne grüße
FICHTL
Hallo!
Ich hab an dem String nichts Ungewoehnliches erkennen koennen. chomp hab ich auch mal angewendet - kein Unterschied. Es gibt auch voellig krasse Beobachtungen. Unter IE6 laeuft es mit method="get" nicht unter Win9x, wohl aber unter Win2000, mit IE5.0 geht es auch mit method="post", bei IE5.5 nicht mehr. Also irgendwie nichts Greifbares.
Zur Info meine Beobachtungen:
WIN 98 SE
IE 6 : alles wie gewünscht, Acrobat Reader plug-in startet, Datei wird korrekt angezeigt
Opera 6 : Die Antwort wird nicht als PDF-File erkannt und mir zum Download angeboten. Die heruntergeladene Datei ist aber das korrekte PDF-File.
Header falsch? Servereinstellung falsch? MIME-Typ?
Gruß,
kerki
Hallo Stefan,
Opera 6 : Die Antwort wird nicht als PDF-File erkannt und mir zum Download angeboten. Die heruntergeladene Datei ist aber das korrekte PDF-File.
Als Plug-In bekomme ich bei bei Post eine Schwarze Seite zu sehen, und bei GET dann eine Weisse Seite. Jeweils ohne Text.
Das Plug-In ist korrekt installiert. Da ich eine andere PDF Datei, in einem anderen Fenster gleichzeitig geoffnet hatte.
Der Download funtzt hier auch Korrekt.
gruesse
jens mueller
Bei mir funktioniert es auch.
UserAgent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 4.0)
Gruß,
UlfL
hallo stefan
hab mal mein testcenter reaktiviert *g*
adobe acrobat 5.0:
win2k build 2195:
opera 6 beta 1 build 999 java rt 1.3 --> bietet mir das file als pdftest.pl zum download / umlaute sind korrekt
ie 5.0 build 2920 --> get & post funktionieren perfekt / umlaute werden korrekt dargestellt
Mozilla rv:0.9.6 Gecko/20011120 --> get & post funktionieren perfekt / umlaute werden korrekt dargestellt.
adobe acrobat 4.0
winnt build 1381 sp 6:
ie 5.0 build 3314 --> get & post: acrobat startet, dann sehe ich eine leere browser-seite
ie 4.0 sp 2 --> genau das gleiche wie ie 5 (siehe oben)
selfbrowser 3.0 --> macht gar nix, stürzt bei starten ab *g*
opera 5.12 build 932 java rt 1.3 --> siehe opera 6.0 beta 1 / umlaute werden korrekt dargestellt.
lynx 2.8.3rel.1 --> get & post: bietet mir eine application/pdf dokument zum download an. bei post will er es als .pl datei abspeichern, bei get bietet er mir den vorher eingegebenen text als filename an *g* ansonsten klappts. umlaute werden nicht korrekt dargestellt.
nn 4.76 --> get & post: klappt perfekt / umlaute werden korrekt dargestellt.
Mozilla rv:0.9.6 Gecko/20011123 --> get & post funktionieren perfekt / umlaute funktionieren
so, das wärs von meiner seite...
grüessli
Siramon, ja der aus der schweiz
Hallo Siramon
vielen Dank dir, aber auch Ulf, Kerki und Fichtl fuer die Tests! Bestaetigt also meine Beobachtungen, dass das alles 1. leider client-abhaengig ist und perl-seitig kaum loesbar ist, und dass es 2. kaum eine klare Linie in den Reaktionen der Clients gibt. Liegt wohl auch daran, dass bei den Clients die Kommunikationsfaehigkeit mit dem Acrobat Reader auch noch unterschiedlich brauchbar funktioniert.
viele Gruesse
Stefan Muenz
Ich habs jetzt auf dem Server hier installiert: http://www.teamone.de/pdftest/ - einfach einen Text eingeben und absenden.
Hi Stefan!
Doch, uebertragen wird es - wenn ich HTML-Code an den Browser sende und dabei die Variable ausgebe, ist wie vorgesehen der eingegebene Text drin. Aber du hast trotzdem Recht - im HTML hab ich was gefunden: method="get", und schon funktionierts auch mit dem IE6 ... frag mich nur nicht warum :-)
Da macht sich doch ganz hinten in der Ecke eine dunkle Erinnerung bemerkbar...
http://rfc.fh-koeln.de/rfc/html_gz/rfc2616.html.gz#61: Schau Dir mal die Beschreibung der Status-Codes 302 und 303 an. (Ersteren erzeugst Du ja mit 'print "Location: /pdftest/hello.pdf\n\n";'.
If the 302 status code is received in response to a request other
than GET or HEAD, the user agent MUST NOT automatically redirect the
request unless it can be confirmed by the user, since this might
change the conditions under which the request was issued.
Na sieh an, dann verhaelt sich der IE6 jetzt etwa korrekter als alle anderen?
Dummerweise wird die korrekte Antwort, naemlich 303, von aelteren Browsern wahrscheinlich falsch oder gar nicht verstanden. Da wird wohl nur eine Unterscheidung anhand des UserAgent uebrigbleiben. Keine schoene Sache.
HTH && So long
Hallo!
Meines Erachtens liegt das Problem in der Html-Seite. Da wird der Inhalt des Eingabefeldes nicht gesendet, deswegen funktioniert es auch, wenn Du einen 'statischem' Text vorgibst. Da ist also der Fehler zu suchen, nicht im PerlScript.
Das würde ich auch vermuten. Testweise mal das gesendete Formular im Klartext ausgeben lassen würde helfen.
Warum es aber nicht übertragen wird, kann ich Dir leder auch nicht sagen.
Opera 5 hat mit POST-Formularen auch so seine Probleme und sendet manchmal einfach nichts. Back und nochmal versuchen hilft meist, manchmal braucht man auch zwei oder mehr Anläufe. Hat MS für IE6 diesen Code geklaut? <eg>
Gruß Markus
- Sven Rautenberg
Sup!
Ist schon komisch, daß es überall funktioniert, nur mit den Browsern einer gewissen Firma nicht... ist sicher schwer, das korrekte Übergeben von Parametern mit get UND post gleichzeitig richtig zu implementieren - da waren die kleinen Weichhirne wohl überfordert.
HAR HAR!
Gruesse,
Bio
[Mozilla wird siegen! ;-) ]