PDFs in TYPO3 mit Fluid und FPDF erstellen

veröffentlicht in Software Engineering am 22. Mrz. 2012 Tags: , , , ,

Bei einem aktuellen Kundenprojekt gab es den Feature-Wunsch, die bestehende Extbase/Fluid -Extension um einen PDF-Export der entsprechenden Daten zu erweitern. Ein Teammitglied ist auf die Idee gekommen FPDF zu verwenden, was es erlaubt, unter PHP schnell PDFs zu erstellen. Die ersten Versuche endeten dann aber darin, dass wir sehr große PHP-Dateien mit zu viel Code hatten. Da haben wir uns gedacht, das muss irgendwie besser gehen und sind auf die Idee gekommen, Fluid zu verwenden und den Code in ViewHelper auszulagern.

Der HauptViewHelper sieht dann so aus:

require('fpdf/fpdf.php');
 
class Tx_Initos_ViewHelpers_FpfdViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {
 
    public function render() {
        $pdf = new FPDF();
 
        $this->templateVariableContainer->add('fpdf', $pdf);        
 
        $this->renderChildren();
 
        $pdf->Output('Report', 'I');
 
        $this->templateVariableContainer->remove('fpdf');
 
        exit();
    }
}

Danach braucht man einen einfachen Helper, um Seiten anzulegen:

class Tx_Initos_ViewHelpers_P_PageViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {
 
    public function render(){
        $fpdf = $this->templateVariableContainer->get('fpdf');
        $fpdf->AddPage();
 
        $this->renderChildren();
    }
 
}

Und einen ViewHelper, um den Text zu erzeugen:

class Tx_Initos_ViewHelpers_P_TextViewHelper extends cTx_Fluid_Core_ViewHelper_AbstractViewHelper {
 
    /**
     * 
     * @param string $text
     * @param int $width
     * @param int $height
     */
    public function render($text, $width, $height){
        $pdf = $this->templateVariableContainer->get('fpdf');
 
        $pdf->SetFont('Times','I',30);
        $pdf->SetTextColor(0,0,0);
        $pdf->Ln(10);
        $pdf->Cell($width, $height, utf8_decode($text)c, 0, 1, 'L');
 
        $this->renderChildren();
    }
 
}

Danach kann man sich ein FluidTemplate bauen:

<f:section name="main">
    {namespace initos=Tx_Initos_ViewHelpers}
    <initos:fpdf>
       <initos:p.page>
            <initos:p.text text="Hallo World!" width="120" height="20" />
       </initos:p.page>
    </initos:fpdf>
</f:section>

So kann man die gewohnte Fluid-Syntax verwenden, um PDFs zu erstellen, erhält ein übersichtliches Template und vermeidet Code-Doppelungen. Auf zum Weiteren FPDF-ViewHelper bauen.

Über Markus Schneider

Als Analytiker und Informatiker ist Markus Schneider Experte für Shop- und ERP-Systeme. Dabei setzt er sein fundiertes Wissen insbesondere im Bereich der Open Source Software ein und kann verschiedene
Anwendungssysteme, z.B. Oxid eSales, OTRS, und Solr Suche, darin integrieren. Auch mit der Onlineshopsoftware Magento kennt sich Herr Schneider bestens aus. Zudem greift er auf gesammelte Erfahrungen unterschiedlicher Systeme wie Sage, SAP und speziell OpenERP / Odoo zurück.

2 Kommentare zu 'PDFs in TYPO3 mit Fluid und FPDF erstellen'

Kommentare als RSS

  1. Markus sagt,

    am 29. Mai. 2012

    Großartige Anleitung & Idee! Nachdem ich vor einigen Jahren schon einmal versucht habe, PDF-Generierung in TYPO3 mit den vorhandenen Extensions zu lösen und dabei ein eher ungenügendes Gesamtpaket herauskam, habe ich es diesmal ähnlich dem hier beschriebenen Weg realisiert und bin mit dem Ergebnis sehr zufrieden.
    Vielen Dank!

  2. Stefan sagt,

    am 6. Jul. 2012

    Wow, vielen Dank – so macht FPDF Spaß!
    (Auch ich hatte es schon etwas sperriger im Einsatz 😉

    Stefan.