Kalle_: PDF- Dateien erzeugen

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

  1. 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

    --
    Am Ende wird alles gut.
  2. 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

  3. 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

    1. 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

      1. 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

        1. 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

  4. 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

    1. Hi,

      unter

      http://php4-forum.de/pdf.htm?PHPSESSID=300664e7742e9a01733839547796343b

      findet man einfache Beispiele

      danke, geht das auch für PHP 3?

      Kalle

      1. Hi,

        danke, geht das auch für PHP 3?

        weiss ich nicht. Ich habe mit PHP4 angefangen. Einfach testen.

        Gruss

        Maulwurf

  5. 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 :-):

    Das zugrundeliegende PDF.

    <?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&uuml;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