PDF- Dateien erzeugen
Kalle_
- php
Hallöle,
in meinem Projekt werden Terminpläne für ca. 350 Besucher einer jährlichen Messe erzeugt.
Im vergangenen Jahr wurden sie ***einzeln*** manuell vom Browser an ein Druckprogramm geschickt, das sie als PDF lokal abspeichern konnte. Dann eine Mail geschrieben und die Datei angehängt.
Kann man mit PHP (Version 3...) ohne großen Aufwand eine PDF- Datei erzeugen? Wer hat das schon gemacht?
Habe mal eben reingeschaut in http://de2.php.net/pdf, sieht kompliziert aus.
LG Kalle
Hi,
Kann man mit PHP (Version 3...) ohne großen Aufwand eine PDF- Datei erzeugen? Wer hat das schon gemacht?
Aufwand ist relativ. Du kannst z.B die libary: fpdf nutzen, aber zuvor muss einiges konfiguriert werden, so muessen z.B. Font-Libaries angelegt werden etc. Es ist eine Beschreibung dabei, trivial ist es aber nicht und Einarbeitung ist noetig.
Fuer Php 3 kann man eine aeltere Version nutzen.
Ansonsten bietet die Pear-Libary afaik auch Pdf-Erzeugung.
Gruesse, Joachim
Hi,
Kann man mit PHP (Version 3...) ohne großen Aufwand eine PDF- Datei erzeugen? Wer hat das schon gemacht?
Habe mal eben reingeschaut in http://de2.php.net/pdf, sieht kompliziert aus.
So genau kann ich dazu nix sagen aber vll. hilft dir fpdf weiter. das
ist ein komplett kostenloses, auf php basierendes, "Programm" zum
erstellen von pdf's.
Konnte mich leider noch nicht ausgiebig damit beschäftigen, macht aber
einen guten eindruck, sehr hilfreich ist das wenn du es dir runterlädst,
auch noch gleich ein paar tutorials dabei sind. weiter bin ich leider
noch nicht gekommen.
MfG
Hallöle,
Hi!
Das sollte mit dem Programm htmldoc unter Unix ganz einfach funktionieren. Ich erstell einfach aus einer HTML Datei eine PDF mit diesem Befehl:
/usr/local/bin/htmldoc --footer "" --webpage --textfont helvetica --top -10mm --left 5mm --right 5mm -t pdf13 $options -f $outfile $infile
Wobei du für $outfile die PDF und für $infile die zuvor generierte HTML angibst.
LG Kalle
lg Daniel
Hallo, Daniel,
/usr/local/bin/htmldoc --footer "" --webpage --textfont helvetica --top -10mm --left 5mm --right 5mm -t pdf13 $options -f $outfile $infile
Wobei du für $outfile die PDF und für $infile die zuvor generierte HTML angibst.
Klingt simpel und ich habe gleich bei meinem Provider angefragt, ob in meiner Domain (ist Unix) diese Möglichkeit besteht und wie ich htmldoc aus PHP starten kann. Habe noch nie ein externes Programm aufgerufen.
Um die HTML-Datei mit PHP auf dem SERVER zu erzeugen, darf man dann wohl das Kommando echo "<html>..." nicht benutzen, sondern so etwas wie $htm = "<html>\n";
$htm .= "<head>\n";
und zum Schluss den String als xxx.htm ausgeben?
Oder bietet PHP eine Umleitung auf Datei?
LG Kalle
Klingt simpel und ich habe gleich bei meinem Provider angefragt, ob in meiner Domain (ist Unix) diese Möglichkeit besteht und wie ich htmldoc aus PHP starten kann. Habe noch nie ein externes Programm aufgerufen.
Bei Perl kann man ein Commando für die Shell so machen:
commando
Sowas gibt es sicher auch bei PHP3
Um die HTML-Datei mit PHP auf dem SERVER zu erzeugen, darf man dann wohl das Kommando echo "<html>..." nicht benutzen, sondern so etwas wie $htm = "<html>\n";
$htm .= "<head>\n";und zum Schluss den String als xxx.htm ausgeben?
Ich denke du kannst einfach anstatt die Sachen mit echo auszugeben in eine Datei schreiben. Kenn mich leider mit PHP nicht so aus, aber das ist der, denk ich, einfachste Weg, da man einfach eine Datei schreibt und diese Umwandelt.
Oder bietet PHP eine Umleitung auf Datei?
Ich denke das kann man sicher steuern, weiß aber in PHP nicht wie!
LG Kalle
lg Daniel
Hi,
Ich denke du kannst einfach anstatt die Sachen mit echo auszugeben in eine Datei schreiben.
jupp das geht. dazu benötigt man:
fopen() mit w
fwrite()
und zu guter letzt
fclose()
somit kannst du eine html datei speichern, wenn du nur ein script machst
als xy.php gibt keine ausgabe kannst du dann eine weiterleitung auf die
datei machen und sie dir noch anschaun. würd ich fürs erste machen.
wenns korekt aussieht dann mit dem umwandeln beschäftigen.
MfG
Hi,
Kann man mit PHP (Version 3...) ohne großen Aufwand eine PDF- Datei erzeugen? Wer hat das schon gemacht?
Ich habe mit PHP einen PDF erzeugt. Es ist nicht besonders schwierig. Nach ein paar Stunden war die Sache gegessen
unter
http://php4-forum.de/pdf.htm?PHPSESSID=300664e7742e9a01733839547796343b
findet man einfache Beispiele
Gruss
Maulwurf
Hi,
unter
http://php4-forum.de/pdf.htm?PHPSESSID=300664e7742e9a01733839547796343b
findet man einfache Beispiele
danke, geht das auch für PHP 3?
Kalle
Hi,
danke, geht das auch für PHP 3?
weiss ich nicht. Ich habe mit PHP4 angefangen. Einfach testen.
Gruss
Maulwurf
Hi Kalle!
Ich habe das ganze wie folgt gelöst:
Ich erstelle ein PDF mit Eingabefeldern, denen ich einen Wert zuweise (mit Adobe Acrobat). Leider sind so keine Checkboxen ausfüllbar.
Dann Datei mit PHP einlesen (fread) und die Default-Werte ersetzen.
Ich zeig dir einfach mal den Code (aus meinen "früheren Tagen", wahrscheinlich relativ unsauber, Kommentare für meinen Chef geschrieben :-):
<?php //PHP-Bereich wird eingeleitet
$anrede = $HTTP_POST_VARS["Anrede"]; //über den Befehl $HTTP_POST_VARS
$nachname = $HTTP_POST_VARS["nachname"]; //werden die Daten, die in das Formular
$vorname = $HTTP_POST_VARS["vorname"]; //der Datei index.html eingegeben
$strasse = $HTTP_POST_VARS["strasse"]; //wurde, den genanten Variablen
$plz = $HTTP_POST_VARS["plz"]; //zugeordnet.
$ort = $HTTP_POST_VARS["ort"]; //Variablennamen beginnen immer mit "$"
$gdatum = $HTTP_POST_VARS["geburtstag"]; //Das einfache Gleichheitszeichen "="
$telefon = $HTTP_POST_VARS["telefon"]; //ordnet den Variablen den Wert zu.
$telefax = $HTTP_POST_VARS["telefax"]; //Jeder Befehl muss mit einem Strichpunkt ";"
$email = $HTTP_POST_VARS["email"]; //beendet werden.
$konto = $HTTP_POST_VARS["konto"];
$tageslimit = $HTTP_POST_VARS["tageslimit"];
$auftragslimit = $HTTP_POST_VARS["transaktionslimit"];
$dalimit = $HTTP_POST_VARS["dalimit"];
$hgue = $HTTP_POST_VARS["hgue"];
$art = $HTTP_POST_VARS["art"];
$anmeldename = $HTTP_POST_VARS["anmeldename"];
$forbidden = array(00000, 11111, 22222, 33333, 44444, 55555, 66666, 77777, 88888, 99999, 01234, 12345, 23456, 34567, 45678, 56789, 67890, 09876, 98765, 87654, 76543, 65432, 54321, 43210); //Trivial-PINs
for (;;){
srand ((double)microtime()*1000000);
$startpin = str_pad(rand(1, 99999), 5, "0", STR_PAD_LEFT);
if (!(in_array ($startpin, $forbidden))) break;
}
$Wert12Option = $HTTP_POST_VARS["Wert12Option"];
$name = $nachname; //Der Variablen $name wird der Inhalt der Variablen $nachname übergeben
$name .= ", "; //dann wird ein Komma und ein Leerschritt zugefügt
$name .= $vorname; //und der Vorname
$plzort = $plz; //das gleiche mit PLZ,
$plzort .= " "; //Leerschritt
$plzort .= $ort; //Ort. Hierdurch wird einfacher, das pdf zu bearbeiten.
$log=fopen("/homepages/u11973/log/homebanking.txt", a); //der Befehl fopen öffnet eine Datei, in diesem Fall die log-Datei im Modus a (heisst: nur ans Ende schreiben)
$logtext = date("Y-m-d, H:i:s"); //Die Datei wird der Variablen $log zugeordnet, wodurch sie später angesprochen wird.
$logtext .= "|";
$logtext .= $name; //Der Variablen $logtext werden das Datum mit der Funktion date(..) und die Inhalte der
$logtext .= "|"; //Formularfelder aus der index.html zugeordnet. Getrennt wird mit "|", damit
$logtext .= $strasse; //man sich die Datei in Excel vernünftig ansehen kann. Standardzeichen wie das Komma
$logtext .= "|"; //bzw. der Strichpunkt können nicht benutzt werden. Das Komma trennt ja bereits Name und Vorname
$logtext .= $plzort; //und der Strichpunkt beendet den Befehl.
$logtext .= "|";
$logtext .= $gdatum;
$logtext .= "|";
$logtext .= $telefon;
$logtext .= "|";
$logtext .= $telefax;
$logtext .= "|";
$logtext .= $email;
$logtext .= "|";
$logtext .= $konto;
$logtext .= "|";
$logtext .= $tageslimit;
$logtext .= "|";
$logtext .= $auftragslimit;
$logtext .= "|";
$logtext .= $dalimit;
$logtext .= "|";
$logtext .= $hgue;
$logtext .= "|";
$logtext .= $art;
$logtext .= "|";
$logtext .= $anmeldename;
$logtext .= "|";
$logtext .= $startpin;
$logtext .= "|";
$logtext .= $HTTP_SERVER_VARS["REMOTE_ADDR"]; //Hier wird noch die IP des Kunden aufgezeichnet, um im Betrugsfalle einen Hinweis auf die Identität zu erhalten.
$logtext .= "\n"; //\n bewirkt einen Zeilenumbruch
fwrite($log, $logtext); //mit diesem Befehl wird in die Datei, die mit $log referenziert wird, der Inhalt der Variablen $logtext geschrieben
fclose($log); //und die Datei wird geschlossen.
if ($art == "kunde") //Wenn der Kunde selbst drucken möchte, wird alles, was in geschweifte Klammern "{}" gefasst ist , ausgeführt.
{ //die "if-Zeile" wir nicht mit Strichpunkt abgeschlossen. Das doppelte Gleichheitszeichen "==" Vergleicht den Inhalt der beiden Ausdrücke
$zufall = "./vordrucke/"; //der Variablen $Zufall wird der relative Pfad zum Verzeichnis Vordrucke zugewiesen.
srand(microtime()*1000000); //Der Zufallsgenerator wird mit einem neuen Startwert "gefüttert"
$zufall .= rand(1,10000); //Der Variablen $Zufall wird ein zufälliger Zahlenwert im Bereich von 1 bis 10.000 hinzugefügt
$zufall .= ".pdf"; //und die Dateiendung ".pdf" wird hinzugefügt.
if($hgue == "ja") //die nächste if-Abfrage: Will der Kunde alle Konten sehen? - Hier "ja"
{ //die öffnende geschweifte Klammer leitet den auszuführenden Teil ein
$f=fopen('hgue.pdf','r'); //die Datei hgue3.pdf wird geöffnet. Modus "R" heisst nur lesen, ich will ja an der Originaldatei auf keinen Fall etwas verändern
$pdf=fread($f,filesize('hgue.pdf')); //über fread wird der Inhalt der Datei in de Variable $pdf eingelesen, damit der Inhalt geändert werden kann.
} //die schließende geschweifte Klammer beendet den if-Teil bzgl. der HGÜ, allerdings noch nicht den ersten.
else //wenn $hgue _nicht_ "ja" beinhaltet, also nicht alle Konten freigeschaltet werden sollen
{ //ebenfalls geschweifte Klammern
$f=fopen('keinehgue.pdf','r'); //die andere Datei wird eingelesen
$pdf=fread($f,filesize('keinehgue.pdf')); //und an $pdf übergeben
} //Ende des else-Teils
fclose($f); //die mit $f referenzierte Datei brauchen wir nihct mehr, also wird sie geschlossen.
$name=substr(str_pad($name,26),0,26); //Da die Dateigröße des pdfs gleich bleiben muss, werden die Variablen zuerst mit dem Befehl str_pad($variable, Länge) erweitert
$strasse=substr(str_pad($strasse,25),0,25); //und dann mit substr gekürzt die 0 ist das erste Zeichen der eichenfolge und die zweite Zahl die Länge, auf die gekürzt wird
$plzort=substr(str_pad($plzort,25),0,25);
$gdatum=substr(str_pad($gdatum,10),0,10);
$telefon=substr(str_pad($telefon,25),0,25);
$telefax=substr(str_pad($telefax,25),0,25);
$email=substr(str_pad($email,31),0,31);
$konto=substr(str_pad($konto,10),0,10);
$tageslimit=substr(str_pad($tageslimit,13),0,13);
$auftragslimit=substr(str_pad($auftragslimit,16),0,16);
$dalimit=substr(str_pad($dalimit,15),0,15);
$anmeldename=substr(str_pad($anmeldename, 15),0,15);
$anmeldename="Anmeldename: ".$anmeldename;
$startpin="Start-PIN: ".$startpin;
$datum="Iserlohn, "; //Der Variablen $datum wird "Iserlohn, " zugeordnet
$datum.=date("d.m.Y"); //und dann das aktuelle Datum hinzugefügt.
$pdf=str_replace('namevorname012345678901234',$name,$pdf); //Der Variablen $pdf wird das Ergebnis der Funktion str_replace zugeordnet
$pdf=str_replace('strassenr1234567890123456',$strasse,$pdf); //Dieser Funktion werden die Parameter der zu ersetzenden Zeichenfolge (hier: der Standardfeldinhalte im pdf),
$pdf=str_replace('plzort1234567890123456789',$plzort,$pdf); //der neue Inhalt hierfür, also die zurechtgeschnitten Variablen (die Dateigröße muss ja exakt gleich bleiben)
$pdf=str_replace('01.01.2000',$gdatum,$pdf); //sowie der Bereich, in dem sie suchen soll, übergeben. Sie liefert als Ergebnis die eingelesene pdf-Datei,
$pdf=str_replace('telefon123456789012345678',$telefon,$pdf); //ersetzt jedoch die Standardinhalte durch die Benutzereingaben
$pdf=str_replace('telefax123456789012345678',$telefax,$pdf);
$pdf=str_replace('email12345',$email,$pdf);
$pdf=str_replace('kontonumma',$konto,$pdf);
$pdf=str_replace('uebtageslimit',$tageslimit,$pdf);
$pdf=str_replace('uebauftragslimit',$auftragslimit,$pdf);
$pdf=str_replace('daauftragslimit',$dalimit,$pdf);
$pdf=str_replace('Iserlohn123456789012',$datum,$pdf);
$pdf=str_replace('Anmeldename: 123456789012345',$anmeldename,$pdf);
$pdf=str_replace('Start-PIN: 12345',$startpin,$pdf);
$f=fopen($zufall,'w+'); //Jetzt wird eine neue Datei angelegt. Der Dateiname ist der Inhalt der Variablen $zufall. Die Art ist w+, d.h. die Datei wird angelegt, wenn sie bereits existiert, wird sie überschrieben.
fwrite($f,$pdf); //in die Datei, die wieder über die Variable $f referenziert werden kann, wird der Inhalt von $pdf, also der ausgefüllte Vertrag, hineingeschrieben.
fclose($f); //die Datei wird geschlossen.
echo "<html><head><title>Weiterleitung</title>"; //jetzt werden über "echo" html-"Befehle" an den Browser geschickt
echo "<script type=\"text/javascript\">"; //Anführungsstriche müssen mit einem Backslash "\" "maskiert" werden, da sie ansonsten den echo-Befehl beenden würden.
echo "self.location.href=\"",$zufall,"\""; //JavaScript: Der Browser wird zu dem erzeugten pdf weitergeleitet.
echo "</script></head>"; //der Script- und der Kopf-Bereich werden verlassen
echo "<body>"; //der <body>-Bereich wird geöffnet. In der nächsten Zeile wird den Usern, die JavaScript ausgeschaltet haben, der Hinweis gegeben, dass sie manuell zum pdf gehen müssen.
echo "Sie werden jetzt zu dem Vertrag weitergeleitet. Sollte die automatische Weiterleitung nicht funktionieren, klicken Sie bitte <a href=\"",$zufall,"\">hier</a>.";
echo "</body></html>"; //in der obigen Zeile wurden nicht alle Anführungsstriche maskiert. mit ",$zufall," wird die Variable $zufall in den s.g. String hineingeschrieben.
} //fertig, wenn der Kunde selbst drucken wollte
elseif ($art == "spk") //Jetzt beginnt der Teil, der ausgeführt werden soll, wenn der Kunde den Vertrag zugeschickt haben möchte.
{
$mailtext = "Formulardaten aus dem Internet-Formular: Girokonto freischalten für µdirekt per PC"; //der Variablen $mailtext werden die Inhalte aus dem sowie Erklärungstexte hinzugefügt.
$mailtext .= "\n"; //\n bewirkt, wie in dr Logdatei, einen Zeilenumbruch. Das ".="-Zeichen fügt der Variablen jeweils zusätzliche Inhalte hinzu.
$mailtext .= "\n";
$mailtext .= "Anrede: ";
$mailtext .= $anrede;
$mailtext .= "\n";
$mailtext .= "\n";
$mailtext .= "Name: ";
$mailtext .= $nachname;
$mailtext .= "\n";
$mailtext .= "\n";
$mailtext .= "Vorname: ";
$mailtext .= $vorname;
$mailtext .= "\n";
$mailtext .= "\n";
$mailtext .= "Kontonummer: ";
$mailtext .= $konto;
$mailtext .= "\n";
$mailtext .= "\n";
$mailtext .= "Straße: ";
$mailtext .= $strasse;
$mailtext .= "\n";
$mailtext .= "\n";
$mailtext .= "PLZ/Ort: ";
$mailtext .= $plzort;
$mailtext .= "\n";
$mailtext .= "\n";
$mailtext .= "Telefon: ";
$mailtext .= $telefon;
$mailtext .= "\n";
$mailtext .= "\n";
$mailtext .= "Telefax: ";
$mailtext .= $telefax;
$mailtext .= "\n";
$mailtext .= "\n";
$mailtext .= "EMail: ";
$mailtext .= $email;
$mailtext .= "\n";
$mailtext .= "\n";
$mailtext .= "Girokontonummer \n";
$mailtext .= $konto;
$mailtext .= "\n";
$mailtext .= "-----------------------------------------\n";
$mailtext .= "Transaktion \n";
$mailtext .= $auftragslimit;
$mailtext .= "\n";
$mailtext .= "-----------------------------------------\n";
$mailtext .= "pro Tag \n";
$mailtext .= $tageslimit;
$mailtext .= "\n";
$mailtext .= "-----------------------------------------\n";
$mailtext .= "Dauerauftrag \n";
$mailtext .= $dalimit;
$mailtext .= "\n";
$mailtext .= "-----------------------------------------\n";
$mailtext .= "alle Konten freischalten \n";
$mailtext .= $hgue;
$mailtext .= "\n";
mail("TelefonService-Center@sparkasse-iserlohn.de", "Girokonto freischalten für sdirekt per PC", $mailtext, "From: webmaster@sparkasseiserlohn.de\nReply-To: $email\nX-Mailer: PHP/" . phpversion());
//In der obigen Zeile wurde die Funktion Mail(....) aufgerufen. In den Klammern steht als erstes der Empfänger, dann der Betreff der Mail, dann der Mailtext und dann zusätzliche Angaben, hier der Absender, die Antwortadresse und der verwandte Mail-Client.
$string = "Sehr geehrte"; //Der Variablen $string wird der Text gespeichert, der dem Kunden nach erfolgreichem mailversand angezeigt werden soll.
if ($anrede == "Herr"){ //wenn ein "Herr" vor dem Rechner sitzt, Muss natürlich "Sehr geehrte_r_" ausgegeben werden.
$string .= "r ";
}
else {
$string .= " ";
}
$string .= $anrede; //die Anrede
$string .= " "; //ein Leerzeichen
$string .= $nachname; //und der Nachname werden hinzugefügt, und gleich kommt der Bestätigungstext in html-Form
$string .= "<br><br>wir haben Ihre Anfrage erhalten und werden sie umgehend entsprechend weiterleiten. <br><br> Bitte haben Sie Verständnis dafür, dass wir keine zeitkritischen Aufträge bzw. Erklärungen, wie z.B. Überweisungen, Wertpapierorder oder Kartensperren über diese Funktion annehmen können. Für die termingerechte Bearbeitung übernimmt die Sparkasse keine Haftung.<br><br> Für die gesicherte Entgegennahme und sofortige Ausführung von Überweisungen und Wertpapierorder steht Ihnen unsere Verfahren \"Sdirekt Internetbanking\" zur Verfügung. Kartensperren teilen Sie uns bitte telefonisch über die Nummer der zentralen Sperrannahme mit. Weitere Einzelheiten erläutert Ihnen gerne Ihr Kundenberater<br><br>Ihre<br><br>Sparkasse Iserlohn";
echo $string; //erst jetzt wird die Bestätigung auf dem Bildschirm ausgegeben,.
}
else
{
echo $art," ist kein gütiger Parameter."; //wenn $art weder "spk" noch "kunde" enthält, kommt die Fehlermeldung, dass der übergebene Parameter falsch ist.
} //und gleich wird der php-Bereich verlassen (und damit ist in diesem Fall das Dateiende erreicht):
?>
Hoffe, dass du was damit anfangen kannst.
Gruß
Martin