PHP-Einfach.de
  • PHP Tutorial
  • MySQL Tutorial
  • Für Fortgeschrittene
  • Webhosting
  • Forum

PDF per PHP erstellen – PDF-Rechnung

10. Februar 2020
  1. Home
  2. »
  3. Für Fortgeschrittene
  4. »
  5. Script-Beispiele
  6. »
  7. 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

  • 1 PDF-Dokument erstellen per tcpdf
  • 2 PDF-Rechnung per PHP erstellen.
  • 3 PDF-Dokument per E-Mail versenden

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);

Autor: Nils Reimers
Zurück: Gästebuch
Weiter: Besucherzähler mit Reload-Sperre

Für Fortgeschrittene

  • Objektorientierte Programmierung
  • PHP Sicherheit
  • Script-Beispiele
    • Loginscript
    • E-Mails mit Anhang versenden
    • Gästebuch
    • PDFs erstellen
    • Besucherzähler mit Reload-Sperre
    • Kontaktformular
    • Logfiles mit PHP generieren
    • URLs im Text identifizieren
  • Codeschnipsel
  • Stellenmarkt
Mit freundlicher Unterstützung von:
  • Punkt191 Werbeagentur

Hoster – Geringste Ausfallzeit

  1. webgo Ø 0 Min.
  2. netcup Ø 0 Min.
  3. All-Inkl.com Ø 3 Min.
  4. Linevast Ø 3 Min.
  5. checkdomain Ø 5 Min.
  6. dogado Ø 6 Min.
  7. Strato Ø 8 Min.
  8. manitu Ø 9 Min.
  9. 1&1 Ø 10 Min.
  10. DomainFactory Ø 14 Min.
» Mehr erfahren

Impressum | Datenschutz | Auf PHP-Einfach.de werben

© PHP-Einfach.de 2003 - 2025

Cookie-Zustimmung verwalten
Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du diesen Technologien zustimmst, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn du deine Zustimmung nicht erteilst oder zurückziehst, können bestimmte Merkmale und Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Anbieter verwalten Lese mehr über diese Zwecke
Einstellungen ansehen
{title} {title} {title}