PDF in CakePHP

March 12th, 2010 by author Leave a reply »

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.



VN:F [1.9.22_1171]
Rating: 8.0/10 (5 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 2 votes)
PDF in CakePHP, 8.0 out of 10 based on 5 ratings
Advertisement

5 comments

  1. Julia says:

    Und wie gibt man das ganze aus?
    $this->set(‘bill’, $data);
    Ich hab da keine Idee…

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  2. basti says:

    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

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: +1 (from 1 vote)
  3. author says:

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

    VN:F [1.9.22_1171]
    Rating: 1.0/5 (1 vote cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  4. Thorsten says:

    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?

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  5. author says:

    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.

    VN:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VN:F [1.9.22_1171]
    Rating: +1 (from 1 vote)

Leave a Reply