Fellicht.nl
home :: posts :: Howto: Basis Html2ps and Html2pdf in CakePHP 1.3.x
Posted: 15-06-2010

Howto: Basis Html2ps and Html2pdf in CakePHP 1.3.x

Click for the English version.

Inleiding

Html2ps (html2pdf) is een handige PHP tool die het mogelijk maakt om webpagina's te converteren naar PDF bestanden. Denk bijvoorbeeld aan facturen van webwinkels, handleidingen van software of orderbevestigingen van klanten. In deze howto wordt uigelegd hoe je dit in CakePHP kan implementeren. Kalileo op de Cake Bakery heeft een tutorial geschreven voor TCPDF. Het voordeel van Html2pdf in tegenstelling tot TCPDF is de mogelijkheid om hele websites om te zetten inclusief afbeeldingen, css, tables, divs, etc.

Requirements

  • CakePHP 1.3
  • Html2ps op Tufat
  • Basis kennis van CakePHP

Stap 1: Download en installeer Html2ps / Html2pdf

  1. Ga naar http://www.tufat.com/s_html2ps_html2pdf.htm en download de laatste versie van Html2ps.
  2. Pak alle bestanden uit in de vendor map (app/vendors/html2ps/).
  3. Open pipeline.class.php en zoek naar: "$this->_dispatcher =& new Dispatcher();" en vervang dit door: "$this->_dispatcher =& new DispatcherPdf();".
  4. Open dispatcher.class.php en verander de volgende regels: "class Dispatcher {" in "class DispatcherPdf {" en "function Dispatcher() {" in "function DispatcherPdf() {".

Stap 2: De Pdf Component

Maak een bestand pdf.php aan in de /app/controllers/components/ aan en kopieer de volgende code.

<?php
class PdfComponent extends Object {

var $p; // The Pdf Class
var $media;
var $filename = 'invoice'; // Without the .pdf
var $output = 'browser'; // browser,file,download

function init() {

// Include the class file and create Html2ps instance
App::import('vendor', 'Html2PsConfig', array('file' => 'html2ps'.DS.'config.inc.php'));
App::import('vendor', 'Html2Ps', array('file' => 'html2ps'.DS.'pipeline.factory.class.php'));
parse_config_file(APP .'vendors'. DS .'html2ps'. DS .'html2ps.config');

global $g_config;
$g_config = array(
'cssmedia' => 'screen',
'renderimages' => true,
'renderforms' => false,
'renderlinks' => true,
'mode' => 'html',
'debugbox' => false,
'draw_page_border' => false
);

$this->media = Media::predefined('A4');
$this->media->set_landscape(false);
$this->media->set_margins(array('left' => 0,
'right' => 0,
'top' => 0,
'bottom' => 0));
$this->media->set_pixels(1024);
global $g_px_scale;
$g_px_scale = mm2pt($this->media->width() - $this->media->margins['left'] - $this->media->margins['right']) / $this->media->pixels;
global $g_pt_scale;
$g_pt_scale = $g_pt_scale * 1.43;
$this->p = PipelineFactory::create_default_pipeline("","");

switch ($this->output) {
case 'download':
$this->p->destination = new DestinationDownload($this->filename);
break;
case 'file':
$this->p->destination = new DestinationFile($this->filename);
break;
default:
$this->p->destination = new DestinationBrowser($this->filename);
break;
}

}

function process($url) {
$this->p->process($url, $this->media);
}
}
?>

Je kan bovenstaande code aanpassen zoals je wilt. Dit is een standaard configuratie voor normaal papierformaat (A4) zonder margins.

Stap 3: De PDF layout

Voor de PDF bestanden zullen we een andere layout gebruiken dan de default. Hiermee hebben we de mogelijkheid om de Pdf bestanden te scheiden van de website/applicatie. Maak een bestand pdf.ctp aan in /app/views/layouts/ en kopieer de volgende code.

<?php echo $content_for_layout; ?>

Uiteraard ben je vrij om eigen css files te includen of er een standaard layout om te maken. Voor dit voorbeeld houd ik een lege pagina aan.

Stap 4: De Controller functies

Het daadwerkelijke genereren van de Pdf's gebeurd in de Controllers. In het voorbeeld gebruik ik een "Invoices" controller met twee functies: "view()" en "download()". Het verschil tussen deze twee functies is dat de "view()" de html pagina output en de "download()" de Pdf zal aanbieden.
Kopieer en plak de volgende code in /app/controllers/invoices_controller.php (of een andere controller waar de Pdf gegenereerd moet worden.


<?php
class InvoicesController extends AppController {

var $name = 'Invoices';

function view($id = null) {
// Be sure that the current user can download this Invoice...
$this->set('invoiceNumber', '1234');
}

function download($id = null) {
// Include Component
App::import('Component', 'Pdf');
// Make instance
$Pdf = new PdfComponent();
// Invoice name (output name)
$Pdf->filename = 'your_invoice'; // Without .pdf
// You can use download or browser here
$Pdf->output = 'download';
$Pdf->init();
// Render the view
$Pdf->process(Router::url('/', true) . 'invoices/view/'. $id);
$this->render(false);
}
}
?>

Stap 5: That's it!

Ga naar http://www.jewebsite.nl/invoices/download/1 en je zult de vraag krijgen wat je met "your_invoice.pdf" wilt doen. Als je in de download() functie $Pdf->out = 'browser'; veranderd zal de pdf geladen worden in de browser. Nu kun je de opmaak bepalen van de facturen en kun je testen met afbeeldingen, css files, etc.
Mocht je nog vragen of problemen tegen komen laat een bericht achter en ik zal hier op antwoorden. Heb je verbeteringen aan de code dan hoor ik deze ook graag!

Tags
Howto: Basis Html2ps and Html2pdf in CakePHP 1.3.x

cakephp tutorials

Reacties

Reacties

Geen reacties nog...

Reply

Vertel me wat je denkt!

Home
Contact
Inloggen
Updates
Afbeeldingen
Projecten
Social
Twitter