1

I'm trying to generate a PDF file using the PHPExcel library.

I'm using the example file and so far I have changed only the paths to the libraries.

Here is my code:

<?php

/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Europe/London');

if (PHP_SAPI == 'cli')
    die('This example should only be run from a Web Browser');

/** Include PHPExcel */
require_once '../excelHelper/PHPExcel.php';


//  Change these values to select the Rendering library that you wish to use
//      and its directory location on your server
$rendererName = PHPExcel_Settings::PDF_RENDERER_TCPDF;
//$rendererName = PHPExcel_Settings::PDF_RENDERER_MPDF;
//$rendererName = PHPExcel_Settings::PDF_RENDERER_DOMPDF;
//$rendererLibrary = 'tcPDF5.9';
$rendererLibrary = 'tcPDF.php';
//$rendererLibrary = 'DomPDF.php';
$rendererLibraryPath = '../excelHelper/PHPExcel/Writer/PDF/' . $rendererLibrary;


// Create new PHPExcel object
$objPHPExcel = new PHPExcel();

// Set document properties
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
                             ->setLastModifiedBy("Maarten Balliauw")
                             ->setTitle("PDF Test Document")
                             ->setSubject("PDF Test Document")
                             ->setDescription("Test document for PDF, generated using PHP classes.")
                             ->setKeywords("pdf php")
                             ->setCategory("Test result file");


// Add some data
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A1', 'Hello')
            ->setCellValue('B2', 'world!')
            ->setCellValue('C1', 'Hello')
            ->setCellValue('D2', 'world!');

// Miscellaneous glyphs, UTF-8
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A4', 'Miscellaneous glyphs')
            ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç');

// Rename worksheet
$objPHPExcel->getActiveSheet()->setTitle('Simple');
$objPHPExcel->getActiveSheet()->setShowGridLines(false);

// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);


if (!PHPExcel_Settings::setPdfRenderer(
        $rendererName,
        $rendererLibraryPath
    )) {
    die(
        'NOTICE: Please set the $rendererName and $rendererLibraryPath values' .
        '<br />' .
        'at the top of this script as appropriate for your directory structure'
    );
}


// Redirect output to a client’s web browser (PDF)
header('Content-Type: application/pdf');
header('Content-Disposition: attachment;filename="01simple.pdf"');
header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF');
$objWriter->save('php://output');
exit;

But it throws a scary error. I tried to fix it the past hour without any luck. Here it is:

[21-Dec-2015 14:47:02 Europe/London] PHP Fatal error:  Uncaught exception 'PHPExcel_Writer_Exception' with message 'Unable to load PDF Rendering library' in /home/notiogrg/public_html/dev/excelHelper/PHPExcel/Writer/PDF/tcPDF.php:35
Stack trace:
#0 /home/notiogrg/public_html/dev/excelHelper/PHPExcel/Autoloader.php(82): require()
#1 [internal function]: PHPExcel_Autoloader::Load('PHPExcel_Writer...')
#2 /home/notiogrg/public_html/dev/excelHelper/PHPExcel/Writer/PDF.php(70): spl_autoload_call('PHPExcel_Writer...')
#3 /home/notiogrg/public_html/dev/excelHelper/PHPExcel/IOFactory.php(141): PHPExcel_Writer_PDF->__construct(Object(PHPExcel))
#4 /home/notiogrg/public_html/dev/approvalRequest/generatePDF.php(102): PHPExcel_IOFactory::createWriter(Object(PHPExcel), 'PDF')
#5 {main}
  thrown in /home/notiogrg/public_html/dev/excelHelper/PHPExcel/Writer/PDF/tcPDF.php on line 35

Can you give me a clue? I'm sure that I messed something with the imports, or the $rendererLibrary variable, but I really can't find a solution.

Slim
  • 1,708
  • 5
  • 37
  • 60

2 Answers2

2

https://github.com/PHPOffice/PHPExcel/blob/develop/Documentation/markdown/Overview/10-Reading-and-Writing.md#pdf

You need to install tcPDF first, its not bundled with PHPExcel. Then you need to configure PHPExcel properly, and maybe you even need to configure tcPDF.

user5542121
  • 1,051
  • 12
  • 28
1

Reading the PHPExcel documentation should really be your first option before asking a question here.

PDF

PHPExcel allows you to write a spreadsheet into PDF format, for fast distribution of represented data.

PDF limitations Please note that PDF file format has some limits regarding to styling cells, number formatting, ...

PHPExcel_Writer_PDF

PHPExcel’s PDF Writer is a wrapper for a 3rd-Party PDF Rendering library such as tcPDF, mPDF or DomPDF. Prior to version 1.7.8 of PHPExcel, the tcPDF library was bundled with PHPExcel; but from version 1.7.8 this was removed. Instead, you must now install a PDF Rendering library yourself; but PHPExcel will work with a number of different libraries.

Currently, the following libraries are supported:

|---------|---------|-----------------------------------------|----------------------------| | | Version | | | | Library | tested | Downloadable from | PHPExcel Internal Constant | |---------|---------|-----------------------------------------|----------------------------| | tcPDF | 5.9 | http://www.tcpdf.org/ | PDF_RENDERER_TCPDF | | mPDF | 5.4 | http://www.mpdf1.com/mpdf/ | PDF_RENDERER_MPDF | | domPDF | 0.6.0 | beta 3 http://code.google.com/p/dompdf/ | PDF_RENDERER_DOMPDF | |---------|---------|-----------------------------------------|----------------------------|

The different libraries have different strengths and weaknesses. Some generate better formatted output than others, some are faster or use less memory than others, while some generate smaller .pdf files. It is the developers choice which one they wish to use, appropriate to their own circumstances.

Before instantiating a Writer to generate PDF output, you will need to indicate which Rendering library you are using, and where it is located.

$rendererName = PHPExcel_Settings::PDF_RENDERER_MPDF;
$rendererLibrary = 'mPDF5.4';
$rendererLibraryPath = dirname(__FILE__).'/../../../libraries/PDF/' . $rendererLibrary;

if (!PHPExcel_Settings::setPdfRenderer(
    $rendererName,
    $rendererLibraryPath
    )) {
    die(
        'Please set the $rendererName and $rendererLibraryPath values' .
        PHP_EOL .
        ' as appropriate for your directory structure'
    );
}

You don't set the $rendererLibraryPath to point to PHPExcel's wrapper for whichever PDF rendering library you've installed (PHPExcel already knows that); you set it to point to the folder where you've installed tcPdf (or whichever library you're using).

Mark Baker
  • 209,507
  • 32
  • 346
  • 385