|
|
 |

|

 |

| Community » CGI: Allgemeines Forum |
|
pdf-Dokument wird nicht gespeichert
|
Seitenanfang |
hallo zusammen, ich hoffe mir kann jemand helfen, sitz schon 2 tage an dem problem.mittels dem modul pdf::api2::simple erstelle ich ein pdf-dokument, nach der erstellung erzeuge ich einen link in einem html-dokument, der darauf verweist. so viel zum wunschdenken!!! mein perl-skript erstellt zunächst das pdf-dokument soll dieses speichern und danach ne htmlseite mit dem link darauf erzeugen. wenn ich $pdf->save; auskommentiere, wird der link sauber im browser angezeigt, jedoch logischerweise das dokument nicht gespeichert, lass ich diese zeile stehen, bekomme ich einen internal server error... WARUM???
Datum: 31.05.2007-11:48

|
re: pdf-Dokument wird nicht gespeichert
|
Seitenanfang |
| Wenn du einen Internal Server Error bekommmst, steht definitiv was in der Error Log Datei von deinem Webserver. Bei Apache zum Beispiel: /var/log/httpd/error_log oder /var/log/apache/error_log . So spontan würde ich folgendes vermuten: - fehlende Schreibrechte in dem Pfad, wo du die PDF Datei ablegen möchtest Grüße Mario
Datum: 31.05.2007-13:34

|
re: pdf-Dokument wird nicht gespeichert
|
Seitenanfang |
| wenn ich das skript in der Konsole ausführe, wird das dokument erstellt, an dem kanns also nicht liegen... ich glaub eher dass es was mit der mischung zwischen html und perl zu tun hat zu tun hat. ich hab es jetzt mal so realisiert: 1. hab ein html-dokument mit nem button, dieser startet folgendes cgi-skript print header('text/html'); print qx("perl -w create_report.pl"); print '<a href="../report.pdf">Report</a>'; das skript soll eigentlich nur das eigentliche skript "create_report.pl" ausführen und erzeugt dann einen link auf dieses (report.pdf wird von create_report.pl erstellt) ich krieg nun keine fehlermeldung mehr, jedoch wird auch kein pdf erstellt, warum funktioniert der befehl qx() in diesem fall nicht???
Datum: 31.05.2007-14:30

|
re: pdf-Dokument wird nicht gespeichert
|
Seitenanfang |
Lass mal die Anfuehrungszeichen weg bei qx(""), denn qx// gehoert wie q// und qq// zu den Quote- bzw. Quote-Like Operators, andernfalls ist dein Aufruf wie
print `"perl -w create_report.pl"`;
Das heiszt der Shellprozess erhaelt nur eine Zeichenkette und keine Befehle.Du solltest auch pruefen ob die Ausfuehrung des Befehls erfolgreich war, qx// und `` liefern im Skalarenkontext undef und im Listenkontext eine lerre Liste zurueck falls fehlgeschlagen. Warum muss es eigentlich ein neu gestarteter Prozess sein der die PDF-Datei erzeugt? Besser waere es du wandelst das Script dass Die PDF-Datei erzeugt in ein Modul um, so dass dein CGI-Script das PDF erzeugt, das spart dir einen Shell- und einen weiteren perl-Prozess. Du hast auch immer noch nicht mit angegeben was zuvor in der Logdatei stand
Datum: 31.05.2007-16:34

|
re: pdf-Dokument wird nicht gespeichert
|
Seitenanfang |
es muss kein neuer prozess sein, urprünglich wollte ich es so machen:
#!/usr/bin/perl -wuse strict; use CGI; use CGI qw(param header); use CGI qw(fatalstoBrowser); use PDF::API2::Simple; my $pdf = PDF::API2::Simple->new(); my $file= "/opt/lampp/htdocs/DailyReport/report.pdf"; $pdf->file($file); $pdf->add_font('VerdanaBold'); $pdf->add_font('Verdana'); $pdf->add_page(); for (my $i = 0; $i < 25; $i++) { my $text = "$i - All work and no play makes Jack a dull boy"; $pdf->text( $text, x => $pdf->margin_left, autoflow => 'on' ); } $pdf->save($file); print header('text/html')."Daily Report wurde erstellt<br>"; print '<a href="../DailyReport/report.pdf">Daily Report anzeigen</a>';
bei diesem code steht im log "Unable to open /opt/lampp/htdocs/DailyReport/report.pdf for writing at /usr/lib/perl5/site_perl/5.8.8/PDF/API2/Basic/PDF/File.pm line 454., referer: http://localhost/DailyReport/index.php Premature end of script headers: create_report.pl, referer: http://localhost/DailyReport/index.php" führe ich die $pdf->save($file); nach dem link aus folgende: "Unable to open /opt/lampp/htdocs/DailyReport/report.pdf for writing at /usr/lib/perl5/site_perl/5.8.8/PDF/API2/Basic/PDF/File.pm line 454., referer: http://localhost/DailyReport/index.php File does not exist: /opt/lampp/htdocs/DailyReport/report.pdf, referer: http://localhost/cgi-bin/create_report.pl " und im browser kommt die meldung <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>500 Internal Server Error</title> </head><body> <h1>Internal Server Error</h1> <p>The server encountered an internal error or misconfiguration and was unable to complete your request.</p> <p>Please contact the server administrator, you@example.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.</p> <p>More information about this error may be available in the server error log.</p> <hr> <address>Apache/2.2.4 (Unix) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.8e PHP/5.2.1 mod_apreq2-20051231/2.5.7 mod_perl/2.0.2 Perl/v5.8.7 Server at localhost Port 80</address> </body></html> hilft dir das weiter??? mir nicht... was meintest du mit modul umwandeln, kenn mich auch noch nicht so gut in perl aus!!! hab deinen vorschlag bei qw() ausprobiert, leider wieder ohne erfolg, es tritt kein fehler auf, jedoch wird auch kein pdf erzeugt
Datum: 01.06.2007-07:50

|
re: pdf-Dokument wird nicht gespeichert
|
Seitenanfang |
wenn ich die ganzen skripte in der shell starte, funktioniert alles wunderbar, nur im browser klappt das speichern der datei nicht, ich könnt echt verzweifeln, hab wirklich schon alles ausprobiert... deswegen wollte ich auch nen 2. prozess starten, so dass mein skript unabhängig vom browser ist, leider wird das skript hier auch nicht gestartet... aber mal ne andere frage, wenn ich das skript über print qw(perl -w meinskript.pl); starten will, kann es doch nicht funktionieren, weil print ja in cgi ne andere funktion hat oder??? wenn ich die ganze prozedur über die shell laufen lass, ist mirs klar, da liefert print die ausgabe direkt an die shell, aber bei cgi liefert print doch keine ausgabe an die shell und kann den prozess gar nicht starte oder bin ich langsam ganz bekloppt?!
Datum: 01.06.2007-08:34

|
re: pdf-Dokument wird nicht gespeichert
|
Seitenanfang |
| So wie's aussieht hat dein Apache einfach nur keine Schreibberechtigung fuer das Verzeichnis, dein Benutzername schon, deshalb funktioniert das Script auch in der Console. Ich hab es so eben in einer WAMPP-Umgebung getestet, der PDF-Report wird erstellt wenn ich das Script ueber den Browser aufrufe. Ueberpruefe ob der Apache Schreibrechte fuer das entsprechende Verzeichnis hat, du kannst dich zum Beispiel ueber den root-User durch 'su - ApacheBenutzer' als ApacheBenutzer anmelden (wie auch immer der bei dir lautet) und unter diesen Benutzerkonto versuchen in das Verzeichnis zu schreiben. Generell wuerde ich dir empfehlen dass du eine Ueberpruefung in dein Script einbaust ob das Verzeichnis schreibbar ist, in etwa so
my $output_dir = '/tmp/some/dir/where/report/goes/to';[code] unless (-d $output_dir && -w _) { die "output_dir is not a directory or is not writeable!\n"; }
#!/usr/bin/perl -w
Der Aufruf 'perl -w' ist veraltet, es wird empfohlen das 'warnings'-Modul einzubinden. use CGI qw(fatalstoBrowser);
Das CGI-Modul exportiert kein 'fatalstoBrowser', das gehoert zu CGI::Carp use CGI::Carp; qw( fatalsToBrowser warningsToBrowser );
auch auf die Schreibweise ist zu achten, das 'To' beginnt mit einen Groszbuchstaben $pdf->file($file);
Die Dokumentation von PDF::API2::Simple empfiehlt die Eigenschaft 'file' nicht selbst zu setzen. -----8<----- file Gets/sets the file used to save the PDF. It's recommended that you do not set this. ----->8----- -----8<----- aber mal ne andere frage, wenn ich das skript über print qw(perl -w meinskript.pl); starten will, kann es doch nicht funktionieren, weil print ja in cgi ne andere funktion hat oder??? wenn ich die ganze prozedur über die shell laufen lass, ist mirs klar, da liefert print die ausgabe direkt an die shell, aber bei cgi liefert print doch keine ausgabe an die shell und kann den prozess gar nicht starte oder bin ich langsam ganz bekloppt?! ----->8----- Wenn du
print qw(perl -w meinscript.pl);
schreibst dann wird 'perl-wmeinscript.pl' ausgegeben, denn beim qw//-Operator (word list operator) stehen zwischen den Begrenzern eine durch Leerzeichen getrennt Liste von Woertern. Was du meinst ist qx//, der die Kommandos ausfuehrt, und wenn du
print qx(perl -w meinscript.pl);
schreibst dann fuehrt qx// den Befehl 'perl -w meinscript.pl' aus und liefert die Ausgabe des Befehls zurueck, die dann via print ausgegeben wird (bei einen CGI-Script als Inhalt des HTTP-Requests).
Datum: 01.06.2007-18:40

|
|

|

|

|
 |

|

|
|