PDF per PHP erstellen – PDF-Rechnung
Im folgenden Script erfahrt ihr, wie ihr ohne zusätzliche Software mittels PHP sehr einfach dynamische PDFs erstellen könnt. Diese könnt ihr entweder auf dem Server abspeichern oder im Browser direkt an den Benutzer senden. Hier möchte ich es am Beispiel einer Rechnung demonstrieren, die per PHP erstellt und als PDF ausgegeben wird. Das Script könnt ihr hier herunterladen und frei verwenden.
Inhaltsverzeichnis
PDF-Dokument erstellen per tcpdf
tcpdf ist eine kostenlose Bibliothek zur Erstellung von PDF-Dokumenten in PDF. Die Bibliothek ist recht umfangreich, mit der richtigen Code-Grundlage kann man aber so einfach eigene PDF-Dokumente erzeugen. Besonders bequem ist es, dass sich HTML-Code in PDF übersetzen lässt. So müsst ihr keine komplizierten API-Befehle lernen, sondern könnt eure dynamische Seite als HTML-Code schreiben und aus dieser per tcpdf in ein PDF-Dokument erzeugen.
Ladet euch als ersten Script die tcpdf-Bibliothek herunter und entpackt diese entsprechend, z.B. in den Ordner 'tcpdf'.
Auf der rechten Seite seht ihr ein Bild der erzeugten PDF. Den Code zur Erzeugung der PDF mit Erklärungen findet nachfolgend.
PDF-Rechnung per PHP erstellen.
Nachfolgender Code erzeugt zuerst HTML-Code für die Rechnung. Dieser HTML-Code wird dann in ein PDF-Übersetzt und im Browser an den Benutzer geschickt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
<?php $rechnungs_nummer = "743"; $rechnungs_datum = date("d.m.Y"); $lieferdatum = date("d.m.Y"); $pdfAuthor = "PHP-Einfach.de"; $rechnungs_header = ' <img src="logo.png"> PHP-Einfach.de Nils Reimers www.php-einfach.de'; $rechnungs_empfaenger = 'Max Musterman Musterstraße 17 12345 Musterstadt'; $rechnungs_footer = "Wir bitten um eine Begleichung der Rechnung innerhalb von 14 Tagen nach Erhalt. Bitte Überweisen Sie den vollständigen Betrag an: <b>Empfänger:</b> Meine Firma <b>IBAN</b>: DE85 745165 45214 12364 <b>BIC</b>: C46X453AD"; //Auflistung eurer verschiedenen Posten im Format [Produktbezeichnung, Menge, Einzelpreis] $rechnungs_posten = array( array("Produkt 1", 1, 42.50), array("Produkt 2", 5, 5.20), array("Produkt 3", 3, 10.00)); //Höhe eurer Umsatzsteuer. 0.19 für 19% Umsatzsteuer $umsatzsteuer = 0.0; $pdfName = "Rechnung_".$rechnungs_nummer.".pdf"; //////////////////////////// Inhalt des PDFs als HTML-Code \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ // Erstellung des HTML-Codes. Dieser HTML-Code definiert das Aussehen eures PDFs. // tcpdf unterstützt recht viele HTML-Befehle. Die Nutzung von CSS ist allerdings // stark eingeschränkt. $html = ' <table cellpadding="5" cellspacing="0" style="width: 100%; "> <tr> <td>'.nl2br(trim($rechnungs_header)).'</td> <td style="text-align: right"> Rechnungsnummer '.$rechnungs_nummer.'<br> Rechnungsdatum: '.$rechnungs_datum.'<br> Lieferdatum: '.$lieferdatum.'<br> </td> </tr> <tr> <td style="font-size:1.3em; font-weight: bold;"> <br><br> Rechnung <br> </td> </tr> <tr> <td colspan="2">'.nl2br(trim($rechnungs_empfaenger)).'</td> </tr> </table> <br><br><br> <table cellpadding="5" cellspacing="0" style="width: 100%;" border="0"> <tr style="background-color: #cccccc; padding:5px;"> <td style="padding:5px;"><b>Bezeichnung</b></td> <td style="text-align: center;"><b>Menge</b></td> <td style="text-align: center;"><b>Einzelpreis</b></td> <td style="text-align: center;"><b>Preis</b></td> </tr>'; $gesamtpreis = 0; foreach($rechnungs_posten as $posten) { $menge = $posten[1]; $einzelpreis = $posten[2]; $preis = $menge*$einzelpreis; $gesamtpreis += $preis; $html .= '<tr> <td>'.$posten[0].'</td> <td style="text-align: center;">'.$posten[1].'</td> <td style="text-align: center;">'.number_format($posten[2], 2, ',', '').' Euro</td> <td style="text-align: center;">'.number_format($preis, 2, ',', '').' Euro</td> </tr>'; } $html .="</table>"; $html .= ' <hr> <table cellpadding="5" cellspacing="0" style="width: 100%;" border="0">'; if($umsatzsteuer > 0) { $netto = $gesamtpreis / (1+$umsatzsteuer); $umsatzsteuer_betrag = $gesamtpreis - $netto; $html .= ' <tr> <td colspan="3">Zwischensumme (Netto)</td> <td style="text-align: center;">'.number_format($netto , 2, ',', '').' Euro</td> </tr> <tr> <td colspan="3">Umsatzsteuer ('.intval($umsatzsteuer*100).'%)</td> <td style="text-align: center;">'.number_format($umsatzsteuer_betrag, 2, ',', '').' Euro</td> </tr>'; } $html .=' <tr> <td colspan="3"><b>Gesamtsumme: </b></td> <td style="text-align: center;"><b>'.number_format($gesamtpreis, 2, ',', '').' Euro</b></td> </tr> </table> <br><br><br>'; if($umsatzsteuer == 0) { $html .= 'Nach § 19 Abs. 1 UStG wird keine Umsatzsteuer berechnet.<br><br>'; } $html .= nl2br($rechnungs_footer); //////////////////////////// Erzeugung eures PDF Dokuments \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ // TCPDF Library laden require_once('tcpdf/tcpdf.php'); // Erstellung des PDF Dokuments $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); // Dokumenteninformationen $pdf->SetCreator(PDF_CREATOR); $pdf->SetAuthor($pdfAuthor); $pdf->SetTitle('Rechnung '.$rechnungs_nummer); $pdf->SetSubject('Rechnung '.$rechnungs_nummer); // Header und Footer Informationen $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA)); // Auswahl des Font $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); // Auswahl der MArgins $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); $pdf->SetHeaderMargin(PDF_MARGIN_HEADER); $pdf->SetFooterMargin(PDF_MARGIN_FOOTER); // Automatisches Autobreak der Seiten $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); // Image Scale $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); // Schriftart $pdf->SetFont('dejavusans', '', 10); // Neue Seite $pdf->AddPage(); // Fügt den HTML Code in das PDF Dokument ein $pdf->writeHTML($html, true, false, true, false, ''); //Ausgabe der PDF //Variante 1: PDF direkt an den Benutzer senden: $pdf->Output($pdfName, 'I'); //Variante 2: PDF im Verzeichnis abspeichern: //$pdf->Output(dirname(__FILE__).'/'.$pdfName, 'F'); //echo 'PDF herunterladen: <a href="'.$pdfName.'">'.$pdfName.'</a>'; ?> |
Wenn ihr das Script nicht von Github herunterladet, stellt sicher, dass das require_once('tcpdf/tcpdf.php'); funktioniert, d.h., dass die Datei tcpdf.php sich im Unterordner tcpdf befindet.
Zu Beginn des Script, könnt ihr einige Daten eurer Rechnung spezifizieren. Beispielsweise die Rechnungsnummer, das Rechnungsdatum oder die Anschrift des Empfängers. In diesen Zeilen könnt ihr ganz normales HTML verwenden, so kann beispielsweise per img-Tag eine Grafik in das PDF eingebunden werden.
In der Variable $rechnungs_posten werden die gekauften Produkte aufgeführt, jeweils mit Bezeichnung, Menge und Brutto-Einzelpreis. Das Script rechnet die Gesamtkosten entsprechend zusammen.
In der Variable $umsatzsteuer könnt ihr einen Umsatzsteuersatz angeben. Ist in dieser Variable beispielsweise 0.19 gespeichert, so werden 19% Umsatzsteuer auf der Rechnung ausgewiesen. Die Berechnung läuft automatisch.
Der Inhalt des PDF-Dokuments wird in der Variable $html definiert. Hier wird gewöhnlicher HTML-Code spezifiziert, der den Inhalt und das Aussehen des PDF angibt. Den HTML-Code könnt ihr einfach und bequem entsprechend auf eure Anwendung anpassen. TCPDF unterstützt viele HTML-Befehle, sowie einige Inline-CSS-Befehle. Allerdings, im Vergleich zum Browser, ist der Umfang recht rudimentär. Für die Erzeugung von simplen PDF-Dokumenten ist das absolut ausreichend. Ihr solltet aber nicht hoffen, dass aus dem HTML-Code eurer Website mit sämtlichen CSS-Befehle eine anständige PDF-Datei erzeugt werden kann.
Zum Abspeichern der PDF habt ihr zwei Optionen: Die Ausgabe der PDF im Browser, so dass der Benutzer diese direkt im Browser einsehen kann / herunterladen kann. Oder, als zweite Variante, das Abspeichern der PDF auf dem Server.
In Variante 1, wird die PDF an den Benutzer gesendet:
1 2 |
//Variante 1: PDF direkt an den Benutzer senden: $pdf->Output($pdfName, 'I'); |
In der zweiten Variante wird das PDF auf dem Server zu speichern. Hierzu ändert man den 'I'-Parameter zu 'F'. Das PDF kann dann z.B. als E-Mail versendet werden oder der Link dem Benutzer angezeigt werden:
1 2 3 |
//Variante 2: PDF im Verzeichnis abspeichern: $pdf->Output(dirname(__FILE__).'/'.$pdfName, 'F'); echo 'PDF herunterladen: <a href="'.$pdfName.'">'.$pdfName.'</a>'; |
PDF-Dokument per E-Mail versenden
Mit dem obigen Script lässt sich bequem ein dynamisch erzeugtes PDF-Dokument per E-Mail versenden. Speichert hierzu das PDF-Dokument auf dem Server ab indem ihr den Wert 'F' der Methode Output übergebt.
Anschließend könnt ihr mit unserem Script E-Mails mit Anhang versenden sehr bequem diese PDF als E-Mail versenden:
1 2 3 4 5 6 |
//PDF-Dokument per E-Mail versenden $pdfPfad = dirname(__FILE__).'/'.$pdfName; $pdf->Output($pdfPfad, 'F'); $dateien = array($pdfPfad); mail_att("[email protected]", "Betreff", "Euer Nachrichtentext", "Absendername", "[email protected]", "[email protected]", $dateien); |