1. Code
  2. PHP

So erstellen Sie eine PDF-Datei in PHP

In diesem Artikel werden wir diskutieren, wie Sie PDF-Dateien in PHP generieren können. Wir verwenden die TCPDF-Bibliothek, um programmgesteuert PDF-Dokumente zu erstellen.
Scroll to top
11 min read

German (Deutsch) translation by Alex Grigorovich (you can also view the original English article)

In diesem Artikel werden wir diskutieren, wie Sie PDF-Dateien in PHP generieren können. Wir verwenden die TCPDF-Bibliothek, um programmgesteuert PDF-Dokumente zu erstellen.

Wenn Sie an einer Website arbeiten, die es Benutzern ermöglicht, Dokumente wie Bestellbelege, Rechnungen oder Rechnungen herunterzuladen oder auszudrucken, haben Sie mehrere Möglichkeiten. Sie können das Dokument entweder inline im Browser anzeigen oder einen Download bereitstellen. Wenn es um das Herunterladen von Dokumenten geht, ist PDF eines der besten Formate und eignet sich hervorragend zum Beibehalten der Textformatierung.

Wenn Sie also lernen möchten, wie Sie PDF-Dateien auf Ihrer PHP-Website generieren, sind Sie hier richtig!

So installieren Sie die TCPDF-Bibliothek

In diesem Abschnitt erfahren Sie, wie Sie die TCPDF-Bibliothek installieren.

Es gibt verschiedene Möglichkeiten, die TCPDF-Bibliothek auf Ihrem Server zu installieren. Die TCPDF-Bibliothek ist bei Packagist und GitHub verfügbar, sodass Sie entweder Composer verwenden oder von GitHub klonen können. In unserem Fall werden wir es mit Composer installieren.

Fahren Sie fort und führen Sie den folgenden Befehl aus, um die TCPDF-Bibliothek mit Composer zu installieren.

1
$composer require tecnickcom/tcpdf
2
Using version ^6.3 for tecnickcom/tcpdf
3
./composer.json has been created
4
Loading composer repositories with package information
5
Updating dependencies (including require-dev)
6
Package operations: 1 install, 0 updates, 0 removals
7
  - Installing tecnickcom/tcpdf (6.3.5): Downloading (100%)         
8
Writing lock file
9
Generating autoload files

Nach erfolgreicher Installation müssen Sie die Datei autoload.php in Ihr PHP-Skript einbinden, wie im folgenden Snippet gezeigt.

1
<?php
2
require "./vendor/autoload.php";
3
...
4
?>

Und damit sind Sie bereit, alle von der TCPDF-Bibliothek bereitgestellten Dienstprogrammmethoden zu verwenden.

So verwenden Sie die TCPDF-Bibliothek

In diesem Abschnitt erstellen wir ein reales Beispiel, das zeigt, wie eine PDF-Rechnung erstellt wird. Die TCPDF-Bibliothek bietet viele vorgefertigte Vorlagen, die Sie als Referenz zum Generieren von PDF-Dokumenten verwenden können. Wir werden jedoch eine Rechnung von Grund auf neu erstellen.

Wie ich bereits im vorherigen Abschnitt erwähnt habe, bietet die TCPDF-Bibliothek viele vorgefertigte Vorlagen, mit denen Sie generische PDF-Dateien mit Kopf- und Fußzeilen generieren können. Und das ist wirklich nützlich, wenn Sie mit der Standardformatierung und den Standardeinstellungen zufrieden sind. Wenn Sie jedoch die Kopf- und Fußzeile zusammen mit dem Inhalt anpassen möchten, müssen Sie die TCPDF-Klasse erweitern und die entsprechenden Methoden überschreiben.

In unserem Beispiel erstellen wir zwei Dateien: customPdfGenerator.php und example.php. In der Datei customPdfGenerator.php erstellen wir die Klasse CustomPdfGenerator, die die TCPDF-Kernklasse erweitert und einige Methoden überschreibt. In der Datei example.php sehen wir, wie die CustomPdfGenerator-Klasse verwendet wird.

Die CustomPdfGenerator-Klasse

Fahren Sie fort und erstellen Sie die Datei customPdfGenerator.php mit dem folgenden Inhalt.

1
<?php
2
class CustomPdfGenerator extends TCPDF 
3
{
4
    public function Header() 
5
    {
6
        $image_file = '/web/logo.png';
7
        $this->Image($image_file, 10, 3, 25, '', 'PNG', '', 'T', false, 300, '', false, false, 0, false, false, false);
8
        $this->SetFont('helvetica', 'B', 20);
9
        $this->Cell(0, 15, '', 0, false, 'C', 0, '', 0, false, 'M', 'M');
10
        $this->Ln();
11
        $this->Cell(0, 15, 'Katie A Falk', 0, false, 'R', 0, '', 0, false, 'M', 'M');
12
    }
13
14
    public function Footer() 
15
    {
16
        $this->SetY(-15);
17
        $this->SetFont('helvetica', 'I', 15);
18
        $this->Cell(0, 10, 'Thank you for your business!', 0, false, 'C', 0, '', 0, false, 'T', 'M');
19
    }
20
21
    public function printTable($header, $data)
22
    {
23
        $this->SetFillColor(0, 0, 0);
24
        $this->SetTextColor(255);
25
        $this->SetDrawColor(128, 0, 0);
26
        $this->SetLineWidth(0.3);
27
        $this->SetFont('', 'B', 12);
28
29
        $w = array(110, 17, 25, 30);
30
        $num_headers = count($header);
31
        for($i = 0; $i < $num_headers; ++$i) {
32
            $this->Cell($w[$i], 7, $header[$i], 1, 0, 'C', 1);
33
        }
34
        $this->Ln();
35
36
        // Color and font restoration

37
        $this->SetFillColor(224, 235, 255);
38
        $this->SetTextColor(0);
39
        $this->SetFont('');
40
41
        // table data

42
        $fill = 0;
43
        $total = 0;
44
45
        foreach($data as $row) {
46
            $this->Cell($w[0], 6, $row[0], 'LR', 0, 'L', $fill);
47
            $this->Cell($w[1], 6, $row[1], 'LR', 0, 'R', $fill);
48
            $this->Cell($w[2], 6, number_format($row[2]), 'LR', 0, 'R', $fill);
49
            $this->Cell($w[3], 6, number_format($row[3]), 'LR', 0, 'R', $fill);
50
            $this->Ln();
51
            $fill=!$fill;
52
            $total+=$row[3];
53
        }
54
55
        $this->Cell($w[0], 6, '', 'LR', 0, 'L', $fill);
56
        $this->Cell($w[1], 6, '', 'LR', 0, 'R', $fill);
57
        $this->Cell($w[2], 6, '', 'LR', 0, 'L', $fill);
58
        $this->Cell($w[3], 6, '', 'LR', 0, 'R', $fill);
59
        $this->Ln();
60
61
        $this->Cell($w[0], 6, '', 'LR', 0, 'L', $fill);
62
        $this->Cell($w[1], 6, '', 'LR', 0, 'R', $fill);
63
        $this->Cell($w[2], 6, 'TOTAL:', 'LR', 0, 'L', $fill);
64
        $this->Cell($w[3], 6, $total, 'LR', 0, 'R', $fill);
65
        $this->Ln();
66
67
        $this->Cell(array_sum($w), 0, '', 'T');
68
    }
69
}

Es ist wichtig zu beachten, dass die CustomPdfGenerator-Klasse die TCPDF-Klasse erweitert, sodass wir alle von der TCPDF-Klasse bereitgestellten Dienstprogrammmethoden verwenden können, um PDF-Dokumente zu formatieren und zu generieren.

Der einzige Zweck der Erstellung unserer eigenen Klasse anstelle der direkten Verwendung der TCPDF-Klasse besteht darin, dass wir keine integrierten Kopf- und Fußzeilenkomponenten verwenden möchten. Daher haben wir die header und footer-Methoden in unserer Klasse überschrieben.

Die Header-Methode

In der Kopfzeile möchten wir ein Firmenlogo zusammen mit dem Namen des Eigentümers anzeigen. Lassen Sie uns die Header-Methode durchgehen, um zu verstehen, wie sie funktioniert.

1
public function Header() 
2
{
3
    $image_file = '/web/logo.png';
4
    $this->Image($image_file, 10, 3, 25, '', 'PNG', '', 'T', false, 300, '', false, false, 0, false, false, false);
5
    $this->SetFont('helvetica', 'B', 20);
6
    $this->Cell(0, 15, '', 0, false, 'C', 0, '', 0, false, 'M', 'M');
7
    $this->Ln();
8
    $this->Cell(0, 15, 'Katie A Falk', 0, false, 'R', 0, '', 0, false, 'M', 'M');
9
}

Zuerst haben wir die Image-Methode verwendet, um ein Firmenlogo auf der linken Seite zu zeichnen. Es ist wichtig, dass Sie einen absoluten Pfad des Logobilds an die Image-Methode übergeben müssen. Als Nächstes haben wir die SetFont-Methode verwendet, um die Schriftfamilie und die Schriftgröße des Textes festzulegen, der in der Kopfzeile hinzugefügt wird. Schließlich haben wir die Cell-Methode verwendet, um den Besitzernamen auf der rechten Seite zu drucken.

Sie werden feststellen, dass es viele Argumente gibt, die Sie in diese Methoden einbringen könnten, und ich möchte Sie ermutigen, sie im Detail zu untersuchen, da es nicht möglich ist, jedes einzelne Argument in diesem Artikel zu diskutieren.

Mit dem obigen Setup würde der Header so aussehen:

HeaderHeaderHeader

Die Fußzeilenmethode

In der Fußzeile möchten wir statischen Text anzeigen, daher ist die Footer-Methode ziemlich einfach, wie im folgenden Ausschnitt gezeigt.

1
public function Footer() 
2
{
3
    $this->SetY(-15);
4
    $this->SetFont('helvetica', 'I', 15);
5
    $this->Cell(0, 10, 'Thank you for your business!', 0, false, 'C', 0, '', 0, false, 'T', 'M');
6
}

Der Footer-Bereich würde so aussehen:

FooterFooterFooter

Schließlich gibt es noch die Methode printTable, auf die wir später zurückkommen. Die Methode printTable hat nichts mit der Klasse TCPDF zu tun. Stattdessen ist es unsere benutzerdefinierte Dienstprogrammmethode, mit der wir die Tabelle zeichnen, um die Artikelinformationen anzuzeigen.

Das ist also die CustomPdfGenerator-Klasse. Im nächsten Abschnitt werden wir sehen, wie Sie es zusammen mit einer Handvoll anderer Methoden verwenden können, um eine vollständige PDF-Rechnung zu erstellen!

Die Datei example.php

Im vorherigen Abschnitt haben wir die Wrapper-Klasse CustomPdfGenerator erstellt, mit der wir PDF-Dateien mit benutzerdefinierten Kopf- und Fußzeilen generieren können. In diesem Abschnitt zeigen wir Ihnen, wie Sie es verwenden können.

Fahren Sie fort und erstellen Sie die Datei example.php mit dem folgenden Inhalt.

1
<?php
2
require "./vendor/autoload.php";
3
require "./customPdfGenerator.php";
4
5
$pdf = new CustomPdfGenerator(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
6
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
7
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
8
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
9
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
10
$pdf->setFontSubsetting(true);
11
$pdf->SetFont('dejavusans', '', 12, '', true);
12
13
// start a new page

14
$pdf->AddPage();
15
16
// date and invoice no

17
$pdf->Write(0, "\n", '', 0, 'C', true, 0, false, false, 0);
18
$pdf->writeHTML("<b>DATE:</b> 01/01/2021");
19
$pdf->writeHTML("<b>INVOICE#</b>12");
20
$pdf->Write(0, "\n", '', 0, 'C', true, 0, false, false, 0);
21
22
// address

23
$pdf->writeHTML("84 Norton Street,");
24
$pdf->writeHTML("NORMANHURST,");
25
$pdf->writeHTML("New South Wales, 2076");
26
$pdf->Write(0, "\n", '', 0, 'C', true, 0, false, false, 0);
27
28
// bill to

29
$pdf->writeHTML("<b>BILL TO:</b>", true, false, false, false, 'R');
30
$pdf->writeHTML("22 South Molle Boulevard,", true, false, false, false, 'R');
31
$pdf->writeHTML("KOOROOMOOL,", true, false, false, false, 'R');
32
$pdf->writeHTML("Queensland, 4854", true, false, false, false, 'R');
33
$pdf->Write(0, "\n", '', 0, 'C', true, 0, false, false, 0);
34
35
// invoice table starts here

36
$header = array('DESCRIPTION', 'UNITS', 'RATE $', 'AMOUNT');
37
$data = array(
38
   array('Item #1','1','100','100'),
39
   array('Item #2','2','200','400')
40
);
41
$pdf->printTable($header, $data);
42
$pdf->Ln();
43
44
// comments

45
$pdf->SetFont('', '', 12);
46
$pdf->writeHTML("<b>OTHER COMMENTS:</b>");
47
$pdf->writeHTML("Method of payment: <i>PAYPAL</i>");
48
$pdf->writeHTML("PayPal ID: <i>katie@paypal.com");
49
$pdf->Write(0, "\n\n\n", '', 0, 'C', true, 0, false, false, 0);
50
$pdf->writeHTML("If you have any questions about this invoice, please contact:", true, false, false, false, 'C');
51
$pdf->writeHTML("Katie A Falk, (07) 4050 2235, katie@sks.com", true, false, false, false, 'C');
52
53
// save pdf file

54
$pdf->Output(__DIR__ . '/invoice#12.pdf', 'F');

Lassen Sie uns die wichtigen Ausschnitte in der obigen Datei durchgehen.

Zunächst haben wir die Datei autoload.php eingefügt, um sicherzustellen, dass die TCPDF-Klasse automatisch geladen wird. Als Nächstes haben wir die Datei customPdfGenerator.php eingefügt, um unsere benutzerdefinierte Klasse zu laden.

Als Nächstes haben wir die CustomPdfGenerator-Klasse zusammen mit den Standardeinstellungen instanziiert. Wir haben auch einige Methoden aufgerufen, um das Standard-Setup durchzuführen, bevor wir tatsächlich mit dem Schreiben in die PDF-Datei beginnen.

1
$pdf = new CustomPdfGenerator(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
2
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
3
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
4
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
5
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
6
$pdf->setFontSubsetting(true);
7
$pdf->SetFont('dejavusans', '', 12, '', true);

Die Konstanten, die wir im obigen Snippet verwendet haben, sind bereits in der Datei tcpdf_autoconfig.php definiert. Um eine dieser Konstanten zu überschreiben, müssen Sie sie nur in Ihrem Skript definieren und die TCPDF-Bibliothek verwendet Ihre Werte. Der Standardwert der PDF_PAGE_ORIENTATION-Konstante ist beispielsweise P (Hochformat), und wenn Sie ihn in L (Querformat) ändern möchten, müssen Sie nur define ('PDF_PAGE_ORIENTATION', 'L'); in deinem Skript.

Als nächstes gibt es einen wichtigen Ausschnitt, der die AddPage-Methode aufruft, die tatsächlich eine neue Seite im PDF-Dokument hinzufügt.

1
// start a new page

2
$pdf->AddPage();

Also haben wir jetzt eine Seite hinzugefügt und könnten anfangen, auf dieser Seite zu schreiben.

Als Nächstes haben wir die Methoden Write und writeHTML verwendet, um das Datum und die Rechnungsnummer auf der linken Seite zu drucken.

1
// date and invoice no

2
$pdf->Write(0, "\n", '', 0, 'C', true, 0, false, false, 0);
3
$pdf->writeHTML("<b>DATE:</b> 01/01/2021");
4
$pdf->writeHTML("<b>INVOICE#</b>12");
5
$pdf->Write(0, "\n", '', 0, 'C', true, 0, false, false, 0);

Die Write-Methode druckt Text ab der aktuellen Position, und Sie können damit Nur-Text drucken. Andererseits ermöglicht Ihnen die Methode writeHTML, die HTML-Formatierung im Text beizubehalten. Obwohl die Methode writeHTML eine begrenzte Unterstützung für die HTML-Formatierung bietet, deckt sie alle HTML-Tags ab, die in der täglichen Entwicklung häufig verwendet werden.

Ebenso haben wir die Adresse und die Rechnungsadresse mit Hilfe der writeHTML-Methode gedruckt.

1
// address

2
$pdf->writeHTML("84 Norton Street,");
3
$pdf->writeHTML("NORMANHURST,");
4
$pdf->writeHTML("New South Wales, 2076");
5
$pdf->Write(0, "\n", '', 0, 'C', true, 0, false, false, 0);
6
7
// bill to

8
$pdf->writeHTML("<b>BILL TO:</b>", true, false, false, false, 'R');
9
$pdf->writeHTML("22 South Molle Boulevard,", true, false, false, false, 'R');
10
$pdf->writeHTML("KOOROOMOOL,", true, false, false, false, 'R');
11
$pdf->writeHTML("Queensland, 4854", true, false, false, false, 'R');
12
$pdf->Write(0, "\n", '', 0, 'C', true, 0, false, false, 0);

Standardmäßig druckt die Methode writeHTML Text auf der linken Seite. Wenn Sie rechtsbündig ausgerichteten Text drucken möchten, können Sie R als letztes Argument der writeHTML-Methode übergeben, wie im obigen Ausschnitt gezeigt. In unserem Fall wollen wir die Rechnungsadresse rechtsbündig anzeigen.

Schauen wir uns kurz an, was wir bisher gebaut haben.

AddressAddressAddress

Als nächstes haben wir einen Ausschnitt, der das Drucken der Artikelinformationstabelle übernimmt.

1
// invoice table starts here

2
$header = array('DESCRIPTION', 'UNITS', 'RATE $', 'AMOUNT');
3
$data = array(
4
   array('Item #1','1','100','100'),
5
   array('Item #2','2','200','400')
6
);
7
$pdf->printTable($header, $data);
8
$pdf->Ln();

Erinnern Sie sich an die printTable-Methode, die wir in der Klasse customPdfGenerator.php definiert haben? Jetzt ist es an der Zeit, es im Detail zu erkunden. Ziehen wir den Code der printTable-Methode ein.

1
public function printTable($header, $data)
2
{
3
    $this->SetFillColor(0, 0, 0);
4
    $this->SetTextColor(255);
5
    $this->SetDrawColor(128, 0, 0);
6
    $this->SetLineWidth(0.3);
7
    $this->SetFont('', 'B', 12);
8
9
    $w = array(110, 17, 25, 30);
10
    $num_headers = count($header);
11
    for($i = 0; $i < $num_headers; ++$i) {
12
        $this->Cell($w[$i], 7, $header[$i], 1, 0, 'C', 1);
13
    }
14
    $this->Ln();
15
16
    // Color and font restoration

17
    $this->SetFillColor(224, 235, 255);
18
    $this->SetTextColor(0);
19
    $this->SetFont('');
20
21
    // table data

22
    $fill = 0;
23
    $total = 0;
24
25
    foreach($data as $row) {
26
        $this->Cell($w[0], 6, $row[0], 'LR', 0, 'L', $fill);
27
        $this->Cell($w[1], 6, $row[1], 'LR', 0, 'R', $fill);
28
        $this->Cell($w[2], 6, number_format($row[2]), 'LR', 0, 'R', $fill);
29
        $this->Cell($w[3], 6, number_format($row[3]), 'LR', 0, 'R', $fill);
30
        $this->Ln();
31
        $fill=!$fill;
32
        $total+=$row[3];
33
    }
34
35
    $this->Cell($w[0], 6, '', 'LR', 0, 'L', $fill);
36
    $this->Cell($w[1], 6, '', 'LR', 0, 'R', $fill);
37
    $this->Cell($w[2], 6, '', 'LR', 0, 'L', $fill);
38
    $this->Cell($w[3], 6, '', 'LR', 0, 'R', $fill);
39
    $this->Ln();
40
41
    $this->Cell($w[0], 6, '', 'LR', 0, 'L', $fill);
42
    $this->Cell($w[1], 6, '', 'LR', 0, 'R', $fill);
43
    $this->Cell($w[2], 6, 'TOTAL:', 'LR', 0, 'L', $fill);
44
    $this->Cell($w[3], 6, $total, 'LR', 0, 'R', $fill);
45
    $this->Ln();
46
47
    $this->Cell(array_sum($w), 0, '', 'T');
48
}

Zuerst haben wir einige Methoden aufgerufen, um die Schriftgröße, Füllfarbe, Linienbreite und Textfarbe festzulegen, bevor wir tatsächlich mit dem Drucken der Kopfzeile der Rechnungstabelle beginnen. Als Nächstes durchlaufen wir das $header-Array und drucken die Titel der Tabellenkopfzeilen mit Hilfe der Cell-Methode.

Mit der Cell-Methode können Sie eine Zelle (rechteckiger Bereich) mit optionalen Rahmen, Hintergrundfarbe und Zeichenfolge drucken. Sie können auch die Ausrichtung des Textes festlegen, der in der Zelle gedruckt wird. Daher ist die Cell-Methode ein perfekter Kandidat, um eine Tabelle zu erstellen.

Nachdem wir die Tabellenüberschriften gedruckt haben, durchlaufen wir das Array $data und geben es aus, um die gesamte Tabelle zu vervollständigen. Schließlich haben wir die Cell-Methode ein paar Mal aufgerufen, um den Gesamtbetrag zu drucken.

Eine kurze Vorschau der Tabelle sollte so aussehen:

Item Information TableItem Information TableItem Information Table

Kehren wir nun zur Datei example.php zurück, um die letzten paar Codezeilen durchzugehen.

Am Ende der Rechnung drucken wir einige Kommentare und Kontaktinformationen, wie im folgenden Snippet gezeigt.

1
// comments

2
$pdf->SetFont('', '', 12);
3
$pdf->writeHTML("<b>OTHER COMMENTS:</b>");
4
$pdf->writeHTML("Method of payment: <i>PAYPAL</i>");
5
$pdf->writeHTML("PayPal ID: <i>katie@paypal.com");
6
$pdf->Write(0, "\n\n\n", '', 0, 'C', true, 0, false, false, 0);
7
$pdf->writeHTML("If you have any questions about this invoice, please contact:", true, false, false, false, 'C');
8
$pdf->writeHTML("Katie A Falk, (07) 4050 2235, katie@sks.com", true, false, false, false, 'C');

Schließlich haben wir die Methode Output verwendet, um die PDF-Datei auf der Festplatte zu speichern. Wenn Sie die PDF-Datei nicht auf der Festplatte speichern möchten, sondern nur an den Browser senden möchten, müssen Sie I im zweiten Argument der Output-Methode verwenden.

Fahren Sie fort und führen Sie die Datei example.php aus, und sie sollte die PDF-Datei generieren, wie im folgenden Screenshot gezeigt.

Full PreviewFull PreviewFull Preview

Abschluss

So können Sie die TCPDF-Bibliothek verwenden, um PDF-Dokumente in PHP zu erstellen. Wir haben ein reales Beispiel erstellt, um einige der verschiedenen APIs zu demonstrieren, die von der TCPDF-Bibliothek bereitgestellt werden.

Die offizielle TCPDF-Dokumentation bietet viele vorgefertigte Vorlagen, die Sie erkunden können, um die integrierten APIs zu verstehen, und ich möchte Sie ermutigen, sie zu erkunden!

Wenn Sie mehr über das Einbinden von PDFs in Ihre Website erfahren möchten, sehen Sie sich die folgenden Links an: