Um ein PDF in CakePHP zu erstellen muss man zum Glück nicht auf ein Plugin oder ähnliches warten, sondern kann vorhandene Bibliotheken nutzen. In diesem kurzen Tutorial greifen wir auf TCPDF zurück.
Vorbereitungen
Zuerst lädt man TCPDF herunter und entpackt es ins Verzeichnis /vendors von cakephp, welches sich auf der gleichen Ebene wie /app und /cake befindet. Man sollte nun ein Verzeichnis /vendors/tcpdf finden.
Anpassungen am Controller
Einen Controller sollte man bereits erstellen können. Wir gehen hier lediglich auf die Methode ein, die man für die Darstellung hinzufügen sollte. Hier ändert sich eigentlich nichts, als wenn man seine Daten auch auf der Webseite anzeigen lassen würde, nur dass man das layout entsprechend anpasst. In dem Beispiel gehen wir davon aus, dass es ein Model namens Bill gibt.
function view($id = null) {
$data = $this->Bill->find('first', array('conditions' => array('Bill.id' => $id)));
$this->set('bill', $data);
$this->layout = 'pdf';
$this->render();
}
Ein Laden der TCPDF – Komponente ist im Controller nicht notwendig. Somit muss man sich nicht um Geschwindigkeitseinbußen sorgen oder einen extra Controller für die PDF-Anzeige erstellen.
Layout
Damit CakePHP nicht das normale Layout rendered, benötigen wir also neben dem default.ctp noch ein weiteres Layout, welches wir pdf.ctp nennen und unter /app/views/layouts/pdf.ctp zu finden sein sollte. In dem Controller haben wir TCPDF bereits mittels $this->layout = 'pdf';
mitgeteilt, dass er diese Datei nutzen soll:
<?php
header('Content-Type: application/pdf');
echo $content_for_layout;
?>
View
In der View wird nun endlich TCPDF geladen und mittels App::import('Vendor','tcpdf/tcpdf');
eingebunden. That’s it! Nun kann man beliebige PDFs erstellen und mittels $bill wie in einer normalen CakePHP-View auf die Daten zugreifen.
<?php
App::import('Vendor','tcpdf/tcpdf');
// ganz viel Code zum Erstellen von PDFs
// z.B. http://www.tecnick.com/pagefiles/tcpdf/example_001.phps
$pdf->Output('bill.pdf', 'I');
?>
Wieder einmal erkennt man das CakePHP eine gute Lösung zum Umgang mit externen Ressources gefunden hat. Die Codeänderungen bleiben übersichtlich und man kommt schnell zum gewünschten Resultat.
Und wie gibt man das ganze aus?
$this->set(‘bill’, $data);
Ich hab da keine Idee…
kann man auch den inhalt dynamisch anzeigen lassen?
also ich hab ein search.ctp mit den den suchergebnissen und diese suchergebnisse möchte ich in der pdf ausgeben lassen? ist das möglich, wenn ja wie?
lg basti
Hallo Julia, Hallo Basti,
in dem Controller werden die “dynamischen” Informationen mittels $this->set gesetzt (CakePHP-Standard).
Auf diese Daten kann man in der .ctp – Datei, die letztendlich das PDF erstellt, wieder zugreifen, so wie man es auch in einer “normalen” ctp umsetzen würde. Statt nun HTML-Code auszugeben, nutzt man die Ausgabemethoden von TCPDF, wie z.B.
$pdf->Write( float $h, string $txt, [mixed $link = ”], [boolean $fill = false], [string $align = ”], [boolean $ln = false], [int $stretch = 0], [boolean $firstline = false], [boolean $firstblock = false], [float $maxh = 0], [float $wadj = 0], [array $margin = ”]);
Ausgegeben wird die PDF-Datei letztendlich in der ctp mittels $pdf->Output(‘bill.pdf’, ‘I’);
Vielen Dank für die Anleitung. Leider bekomme ich es nicht hin, wenn ich wie beschrieben vorgehe, wird eine normale HTML-Seite mit der Meldung “Undefined variable: pdf” angezeigt. Hast Du eine Idee?
Hallo Thorsten,
in der View muss man den Kommentar beachten. Du musst die Variable pdf erst erstellen (dazu einfach in die Dokumentation von TCPDF schauen).
Z.B.: $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, ‘UTF-8’, false);
Erste Anlaufstelle für dich: http://www.tcpdf.org/examples.php
Da man dies unterschiedlichst implementieren kann (sollte), habe ich hier nur einen entsprechenden Kommentar reingeschrieben.
Wenn es gar nicht klappt, schreib noch mal kurz.
Bye und viel Erfolg.