Das Zend Framework bietet Komponenten für so ziemlich jede Aufgabe, die man als PHP Entwickler vorfinden kann. Doch einen Haken hat das Zend Framework – durch eine sehr individuelle Auslegung von „loose coupling“ steht man vor der Herausforderung die verschiedenen Komponenten zu integrieren. Nachdem ich von einem Freund gebeten wurde, mal ein Beispiel zu liefern, wie Zend_PDF verwendet werden kann, um mittels PHP und dem Zend Framework PDF Dateien auszugeben, findet sich nun hier ein entsprechendes Beispiel.

Als Vorlage PDF Datei wurde dabei mittels OpenOffice ein PDF erstellt, um zu demonstrieren, wie sich mittels Zend_PDF auch Vorlagen verwenden lassen. Dafür wurde bisher oft FPDF bzw. PDFi als PHP Bibliotheken verwendet. All diese PDF Funktionalität für PHP wird nun mittels der Zend_PDF Komponente abgebildet.

Hier nun die PDF Vorlage, und das Ergebnis nachdem der Beispiel-Quellcode ausgeführt wurde.

Die Verzeichnisstruktur (Netbeans Screenshot) sieht so aus: struktur

Und der Beispielquellcode:

public function pdfAction()
{
$logger = Zend_Registry::get('logger');
//if running as a module, find template there
$moduleDir = $this->getFrontController()->getModuleDirectory($this->getRequest()->getModuleName());
$source = $moduleDir . DIRECTORY_SEPARATOR . "views" . DIRECTORY_SEPARATOR . "pdf" . DIRECTORY_SEPARATOR . "zend-pdf.pdf";
$pdf = Zend_Pdf::load($source);
//now add some text
$page = $pdf->pages[0]; //get first page
$page->saveGS(); //save graphics context, always a good idea
$page->setFont(Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA), 20);
$page->drawText('Hello world:', 410, 580);
$page->setFont(Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA_BOLD), 20);
$page->drawText('Zend_PDF', 410, 550);
$page->restoreGS();
//this is the pdf as binary
$output = $pdf->render();
//send appropriate headers and the pdf - works with modern browsers. (Die, ie6!)
$response = new Zend_Controller_Response_Http();
$response->setHeader('Content-Disposition', 'attachment; filename="zend-pdf-example.pdf"');
$response->setHeader('Content-type', 'application/pdf');
$response->setHeader('Content-length', strlen($output)); //especially useful for http-pipeling and keep-alive connections
$response->setBody($output);
$response->sendResponse();
//make sure no other output is happening
//exit; would have done as well ;-)
$this->_helper->viewRenderer->setNoRender();
$this->_helper->layout->disableLayout();
}