building php documents with cakepdf - cakefest 2012
DESCRIPTION
Tech talk given by Jelle Henkens at CakeFest 2012 in Manchester, UK. Integrating the CakePdf plugin to generate PDF documents in your CakePHP applications using WkHtmlToPdf. PDF Version of http://www.slideshare.net/jellehenkens/building-php-documents-with-cakepdf-cakefest-2012TRANSCRIPT
BUILDING PHP DOCUMENTS WITH CAKEPDF
CakeFest Manchester, 2012
ABOUT ME
• Jelle Henkens
• LemonBE on IRC, @lemonit on Twitter
• Belgian in the UK
• Lead Developer at Geneo Software
• CakePHP Core Team Developer
• Founder of followmy.tv
WHAT IS CAKEPDF
• Generate PDF documents from HTML
• Easily pick which library to render the PDF
• PDF Encryption
• Layouts, views, helpers and more
• Use your own encryption / render engine
WHY IT WAS BUILT• Massive differences in API between pdf libraries
// Using DomPdf
require_once("dompdf_config.inc.php");
$html = '<html><body>'. '<p>Put your html here.</p>'. '</body></html>';
$dompdf = new DOMPDF();$dompdf->set_paper('A4', 'landscape');$dompdf->$dompdf->load_html($html);$dompdf->render();$pdfData = $dompdf->output();
// Tcpdf example
require_once('config/lang/eng.php');require_once('tcpdf.php');
$html = '<html><body>'. '<p>Put your html here.</p>'. '</body></html>';
$tcpdf = new TCPDF('portrait', 'mm', 'A4');$tcpdf->AddPage();$tcpdf->writeHTML($html);$pdfData = $tcpdf->Output('', 'S');
WHY IT WAS BUILT• And now with CakePdf// Using DomPdf
App::uses('CakePdf', 'CakePdf.Pdf');
$html = '<html><body>'. '<p>Put your html here.</p>'. '</body></html>';
$cakePdf = new CakePdf(array( 'engine' => 'CakePdf.DomPdf', 'orientation' => 'portrait', 'pageSize' => 'A4'));
$pdfData = $cakePdf->output($html);
// Tcpdf example
App::uses('CakePdf', 'CakePdf.Pdf');
$html = '<html><body>'. '<p>Put your html here.</p>'. '</body></html>';
$cakePdf = new CakePdf(array( 'engine' => 'CakePdf.Tcpdf', 'orientation' => 'portrait', 'pageSize' => 'A4'));
$pdfData = $cakePdf->output($html);
BUILT IN RENDER ENGINESWkHtmlToPdf stable
External BinaryUses WebKit
DomPdf alpha PHP Based
Mpdf alpha PHP Based
Tcpdf alpha PHP Based
Very Nice!
CONFIGURATION
CakePlugin::load('CakePdf', array( 'bootstrap' => true, 'routes' => true));
Add in Config/bootstrap.php
Setup
class AppController extends Controller { public $components = array('RequestHandler');}
Needs RequestHandlerComponent
CONFIGURATION
CakePlugin::load('CakePdf', array( 'bootstrap' => true));
Config/bootstrap.php
Special case for CakePHP 2.1.x
Router::parseExtensions('pdf');
Config/routes.php
CONFIGURATION
// Config/bootstrap.phpConfigure::write('CakePdf', array( 'engine' => 'CakePdf.WkHtmlToPdf', 'pageSize' => 'A4', 'orientation' => 'portrait'));
Global settingsSettings
public function view($id) { $this->pdfConfig = array( 'orientation' => 'landscape', 'download' => true, 'filename' => 'invoice-2005.pdf' ); .. Rest of action logic ..}
Inside the controller
TO VIEW OR NOT TO VIEW
• Generating PDF files with the .pdf extension in the URL• Viewing PDF documents in the browser
• Download to disk
• Smaller files
• Stand-alone to generate raw PDF data• Email attachments
• Offline processing
• Larger files
REQUESTHANDLER FLOW
• Layout file App/View/Layout/pdf/default.ctp
• View file App/View/Orders/pdf/invoice.ctp
• All the CakePHP goodies to your disposal
• Helpers
• Blocks
• Elements
View in browser or download to disk
STAND-ALONE FLOWApp::uses('CakePdf', 'CakePdf.Pdf');
$CakePdf = new CakePdf(array( 'engine' => 'CakePdf.Tcpdf', 'pageSize' => 'A5', 'orientation' => 'landscape', 'margin' => 10));
$html = '<html><head></head><body><p>CakeFest is the best</p></body></html>';
$rawPdfData = $CakePdf->output($html);
ENCRYPTING PDF FILES
• Protect against viewing, printing, editing and more
• pdftk binary from PDFLabs
• 128 bit encryption
• Second pass encryption
• Encrypt existing PDF documents
PASSWORD TYPES
• Owner password
• Unlock protected permissions
• Cannot be the same as the user password
• User password
• Will prompt before opening the PDF Document
• Cannot exist without an owner password
CRYPTO CONFIGURATION
//Default configurationConfigure::write('CakePdf', array( 'engine' => 'CakePdf.WkHtmlToPdf', 'crypto' => 'CakePdf.Pdftk'));
Add in Config/bootstrap.php
USING ENCRYPTING
//Action configurationpublic function view($id) { $this->pdfConfig = array( 'orientation' => 'landscape', 'protect' => true, 'userPassword' => 'foo', 'ownerPassword' => 'bar', 'permissions' => array( 'print' ) ); .. Rest of action logic ..}
TECHNICAL DEMO