0
votes

I am using PHPExcel library to generate excel reports and PDF reports. Excel reports are generated fine and browser lets the user save the report. But when I use PHPExcel writer to generate a PDF using the tcpdf library, it doesnt prompt the user to save the PDF and shows binary characters on screen as shown below:

%PDF-1.7 %���� 8 0 obj << /Type /Page /Parent 1 0 R /LastModified (D:20130417151157+05'30') /Resources 2 0 R /MediaBox [0.000000 0.000000 792.000000 612.000000] /CropBox [0.000000 0.000000 792.000000 612.000000] /BleedBox [0.000000 0.000000 792.000000 612.000000] /TrimBox [0.000000 0.000000 792.000000 612.000000] /ArtBox [0.000000 0.000000 792.000000 612.000000] /Contents 9 0 R /Rotate 0 /Group << /

If I save the PDF on server, I can access it and view the report correctly using document viewer. Hence the PDF itself is not corrupt.

The code am using is

$rendererName = PHPExcel_Settings::PDF_RENDERER_TCPDF;
$rendererLibraryPath = 'library/tcpdf';
PHPExcel_Settings::setPdfRenderer(
$rendererName,
$rendererLibraryPath
);

$fullReportName = $reportName.".pdf";
$path = '/tmp/'.$fullReportName;
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF');
$objWriter->save($path);

header('Content-Type: application/pdf');
header('Content-Length: ' . filesize($path));  // File size
header('Content-Disposition: attachment;filename="'.$fullReportName.'"');

readfile($path);

Same behavior is seen if I use php://output directly from writer, instead of readfile as shown:

$objWriter->save('php://output');

How do I stop the binary from showing up and prompt the user for the file download?

1
Are you getting a headers already sent error at all? Otherwise those headers should tell the browser to display the open/save dialogue box. If headers have already been sent as a result of an echo statement (or similar) then the file will be displayed in the browser.Mark Baker
If the problem applies to IE with ssl, then the additional headers listed in stackoverflow.com/questions/12174887/… may help; though it isn't likely to have this effectMark Baker

1 Answers

0
votes
<?php
/**
 * PHPExcel
 *
 * Copyright (c) 2006 - 2015 PHPExcel
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category   PHPExcel
 * @package    PHPExcel
 * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
 * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL
 * @version    ##VERSION##, ##DATE##
 */

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

define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');

date_default_timezone_set('Europe/London');


/** PHPExcel_IOFactory */
require_once ('/Library/WebServer/Documents/library/excel/PHPExcel/IOFactory.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 = 'mPDF5.4';
$rendererLibrary = 'dompdf';
$rendererLibraryPath = '/Library/WebServer/Documents/library/'.$rendererLibrary;

$objPHPExcel = new PHPExcel();
// Set 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");

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment; filename="swap.pdf');
       header('Cache-Control: max-age=0');
// 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', 'éàèùâêîôûëïüÿäöüç');

echo date('H:i:s') , " Hide grid lines" , EOL;
$objPHPExcel->getActiveSheet()->setShowGridLines(true);

echo date('H:i:s') , " Set orientation to landscape" , EOL;
$objPHPExcel->getActiveSheet()->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE);


echo date('H:i:s') , " Write to PDF format using {$rendererName}" , EOL;

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


$callStartTime = microtime(true);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF');
$objWriter->setSheetIndex(0);
//$objWriter->save('phpexcel_pdf.pdf');
$objWriter->save('php://output');
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
echo date('H:i:s') , " File written to " , str_replace('.php', '_'.$rendererName.'.pdf', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL;
echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL;
// Echo memory usage
echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL;


// Echo memory peak usage
echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL;

// Echo done
echo date('H:i:s') , " Done writing files" , EOL;
echo 'File has been created in ' , getcwd() , EOL;

    enter code here