I don’t truly like Adobe PDF files, their negative attributes such as being slow to open, clumsy to edit if-at-all, inadequate and in-the-way security features, outweigh their positive attributes like being formatted, cross-platform, and transmittable.
Since they are the de-facto standard for formatted documents they are in-demand and remain useful. It’s often the case with complex operational systems that clients request and web application end-users would like to have access to PDF’s of internal reports as well as client/partner-destined documents like invoices, quotes, or sales reports. The reasons include the ability to email or print the document with the formatting intact – not always the case with a web page sent directly to the printer.
There are two approaches that I’m aware of for generating PDF’s from within an interactive web application:
- Create the entire PDF programmatically. An example of doing this using the TCPDF library might look like this:
require_once('../config/lang/eng.php'); require_once('../tcpdf.php'); // create new PDF document $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); // set document information $pdf->SetAuthor('Nicola Asuni'); $pdf->SetTitle('TCPDF Example 001'); // set default header data $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 001', PDF_HEADER_STRING); // set default monospaced font $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); //set margins $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); // Add a page $pdf->AddPage(); // Set some content to print $html = <<
VancouverWebDev.com Freelance Vancouver Contract Programming.
This is an example of printing PDF's from PHP without PDFLib. EOD; // --------------------------------------------------------- // Close and output PDF document $pdf->Output('example_001.pdf', 'I'); - Another means is to create an HTML page (or take an existing one) and render it into a PHP buffer (ob_start()) or save to a temporary file, and then pass this rendered HTML to a PHP class that generates PDF’s from HTML. An example using the TUFAT HTML2PS library follows:
PDF conversion with default settings * * Warning: if you have any files (like CSS stylesheets and/or images referenced by this file, * use absolute links (like http://my.host/image.gif). * * @param $path_to_html String path to source html file. * @param $path_to_pdf String path to file to save generated PDF to. */ function convert_to_pdf($path_to_html, $path_to_pdf) { /** * Handles the saving generated PDF to user-defined output file on server */ class MyDestinationFile extends Destination { /** * @var String result file name / path * @access private */ var $_dest_filename; function MyDestinationFile($dest_filename) { $this->_dest_filename = $dest_filename; } function process($tmp_filename, $content_type) { copy($tmp_filename, $this->_dest_filename); } } class MyFetcherLocalFile extends Fetcher { var $_content; function MyFetcherLocalFile($file) { $this->_content = file_get_contents($file); } function get_data($dummy1) { return new FetchedDataURL($this->_content, array(), ""); } function get_base_url() { return ""; } } $pipeline = PipelineFactory::create_default_pipeline("", // Attempt to auto-detect encoding ""); // Override HTML source $pipeline->fetchers = array(new MyFetcherLocalFile($path_to_html)); // Override destination to local file $pipeline->destination = new MyDestinationFile($path_to_pdf); $baseurl = ""; $media = Media::predefined("A4"); $media->set_landscape(false); $media->set_margins(array('left' => 0, 'right' => 0, 'top' => 0, 'bottom' => 0)); $media->set_pixels(1024); global $g_config; $g_config = array( 'cssmedia' => 'screen', 'renderimages' => true, 'renderlinks' => true, 'renderfields' => true, 'renderforms' => false, 'mode' => 'html', 'encoding' => '', 'debugbox' => false, 'pdfversion' => '1.4', 'draw_page_border' => false ); global $g_px_scale; $g_px_scale = mm2pt($media->width() - $media->margins['left'] - $media->margins['right']) / $media->pixels; global $g_pt_scale; $g_pt_scale = $g_px_scale * 1.43; $pipeline->process($baseurl, $media); } // The all-important call to convert the saved HTML file to PDF. convert_to_pdf("forms.html", "forms.pdf"); ?>
There are a number of PHP class libraries that don’t require the commercial PDFLib PECL extension in order to generate PDF’s in your PHP-based web application, here are some of the ones I’ve found that work.
- DOMPDF – Support UTF8. Supports headers and footers. Choice for creating PDF’s programmatically as in the first example above.
- HTML2PS – Works well for generating PDF’s from rendered HTML as in example two. Can be difficult to get the headers/footers to align as needed. Large number of support forums answers. Can generate PostScript or PDFs as output. Font configuration and support is somewhat under-documented/complicated.
- FPDF – perhaps the original free alternative to the commercial PDFLib. HTML2PS library is based on a modified version of this.
- Zend_PDF – A Zend Framework module that can programmatically create PDF files. No personal experience, others have commented that it’s not as powerful as DOMPDF.
One Response to “Programmatically Creating PDF files from HTML using PHP”