PHPExcel сохранить в PDF

390
18 ноября 2017, 12:24

Здравствуйте! Есть шаблон xls файла, который я открываю через PHPExcel, произвожу редактирование и сохраняю. Но проблема вот в чем. Вычитал, что из PHPExcel можно сохранять прямо в PDF. Пробовал через mpdf (Уже было установлено на сервере). И затем установил DOMpdf. Для конвертации использую как указано в документации:

$rendererName = PHPExcel_Settings::PDF_RENDERER_DOMPDF;
//$rendererLibrary = 'domPDF0.6.0beta3';
$rendererLibrary = 'DomPDF.php';
$rendererLibraryPath = dirname(__FILE__). '../Classes/PHPExcel/Writer/PDF/' . $rendererLibrary;

И вызываю функцию:

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'
    );
}

Затем пытаюсь сохранить:

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');

Долгое время вообще функция PHPExcel_Settings::setPdfRenderer не отрабатывала, но теперь дает сохранить PDF файл, но при открытии пишет, что файл поврежден. Что я делаю не так и как исправить данную ошибку? Или есть какие-либо аналогичные решения для сохранения xls в pdf?

Прикладываю код файла, который изменяю, на основе примера библиотеки:

<?php
/**
 * PHPExcel
 *
 * Copyright (C) 2006 - 2014 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 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
 * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL
 * @version    1.8.0, 2014-03-02
 */
/** 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 dirname(__FILE__) . '/../Classes/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 = 'mPDF5.4';
//$rendererLibrary = 'domPDF0.6.0beta3';
//$rendererLibraryPath = '../Classes/PHPExcel/Writer/PDF/DomPDF.php';

// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
$rendererName = PHPExcel_Settings::PDF_RENDERER_DOMPDF;
//$rendererLibrary = 'domPDF0.6.0beta3';
//$rendererLibrary = 'DomPDF.php';
$rendererLibrary = 'Dompdf.php';
$rendererLibraryPath = '../dompdf/src/' . $rendererLibrary;
// 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);
//$objPHPExcel->setSheetIndex(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->setSheetIndex(0);
$objWriter->save('php://output');
exit;

Upd: Если изменить вывод на сохранение файла и написать:

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF');
$objWriter->save('TORG.pdf');

Соответственно убрав все "header", Тогда при этом выдает ошибку:

Fatal error: Uncaught exception 'PHPExcel_Writer_Exception' with message 'Unable to load PDF Rendering library' in /var/www/PHPExcel_1.8.0_doc/Classes/PHPExcel/Writer/PDF/mPDF.php on line 34 PHPExcel_Writer_Exception: Unable to load PDF Rendering library in /var/www/PHPExcel_1.8.0_doc/Classes/PHPExcel/Writer/PDF/mPDF.php on line 34 Call Stack: 0.0009 301144 1. {main}() /var/www/php/c_invoice/new_invoice.php:0 0.3588 6395720 2. PHPExcel_IOFactory::createWriter() /var/www/php/c_invoice/new_invoice.php:203 0.3590 6407192 3. PHPExcel_Writer_PDF->__construct() /var/www/PHPExcel_1.8.0_doc/Classes/PHPExcel/IOFactory.php:141 0.3590 6408224 4. PHPExcel_Autoloader::Load() /var/www/PHPExcel_1.8.0_doc/Classes/PHPExcel/IOFactory.php:0 0.3593 6439208 5. require('/var/www/PHPExcel_1.8.0_doc/Classes/PHPExcel/Writer/PDF/mPDF.php') /var/www/PHPExcel_1.8.0_doc/Classes/PHPExcel/Autoloader.php:82
Answer 1

Спасибо за все ответы на мой вопрос! Проблема была решена, все было намного проще. Необходимо было использовать версии, которые указаны в PHPexcel. А ошибки были из-за того, что PHPexcel не мог найти необходимые файлы.

READ ALSO
Ошибка С2550 и как её обойти

Ошибка С2550 и как её обойти

Выпадает ошибка(ошибка: C2550: MainWindow::MyClient: список инициализации конструктора должен использоваться только в месте определения конструктора)...

358
Шаблоны. Спецализации. С++

Шаблоны. Спецализации. С++

ПриветИзучаю C++(книга: С

223