Конвертирование экселевских файлов в PDF на php

18.01.2019

Задача сохранении XLSX в PDF на php

Библиотека phpoffice/phpspreadsheet (подробнее в статье Работа с XLSX), среди всего прочего позволяет сохранять документы в нужном формате.

Для начала установил phpspreadsheet:

 
composer require phpoffice/phpspreadsheet

Но при первом же тесте, взятом из документации, получил ошибку
Fatal error: Uncaught PhpOffice\PhpSpreadsheet\Writer\Exception: No writer found for type Pdf,
дело в том, что работу с PDF phpoffice/phpspreadsheet производит через сторонние библиотеки и их нужно ставить отдельно.

Для первого теста выбрал mPDF

Установил ее:

 
composer require mpdf/mpdf

И сразу получил сообщение open_basedir restriction in effect. File(/tmp) is not within the allowed path, а также выяснилось, что съедалось любое количество выделенной оперативной памяти.
Решилось проблема редактированием файла настроек хоста: php_admin_value open_basedir "/home/public/NAME.ru/:/tmp"

Результат был такой:

pic1

Сам код:

 
require_once('vendor/autoload.php');

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Writer\Pdf;

$oReader = new Xlsx();
$oSpreadsheet = $oReader->load('i_Акт.xlsx');
$oWriter = IOFactory::createWriter($oSpreadsheet, 'Mpdf');

$oWriter->save('i_Акт.pdf');

Вторым выбрал Dompdf

Установка:

 
 composer require dompdf/dompdf

Изменение кода:

 
$oWriter = IOFactory::createWriter($oSpreadsheet, 'Dompdf'); // Mpdf => Dompdf

Результат получился лучше, но все равно не тот:

pic1

При тестоах выяснилось, что проблема именно в Dompdf:

 
use Dompdf\Dompdf;

$dompdf = new Dompdf();
//$dompdf->set_option('defaultFont', 'dejavu sans');
//$dompdf->loadHtml( iconv("UTF-8", "windows-1251", 'Супер тест!' . rand(-10, 10) ) );

$dompdf->loadHtml( '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <h1>Супер</h1> тест!'. rand(-10, 10), 'UTF-8' );

// (Optional) Setup the paper size and orientation
$dompdf->setPaper('A4', 'landscape');

// Render the HTML as PDF
$dompdf->render();

// Output the generated PDF to Browser
$dompdf->stream();

- тоже выдает не верную кодировку.

Попробовал заменить его стандартные шрифты на такие же, но с поддержкой кириллиц - результат не получил.

Временно отложил эту библиотеку.

Третий тест был для TCPDF

Установка:

 
composer require tecnickcom/tcpdf

Изменение кода:

 
$oWriter = IOFactory::createWriter($oSpreadsheet, 'Tcpdf'); // Tcpdf

Первый Вариант, оказался не очень:

pic1

В заключении

Лучший вариант был у библиотеки mPDF

Для остальных нужно тестировать разные настройки, как это сделать описывается в документации в разделе Custom implementation or configuration

 

class My_Custom_TCPDF extends TCPDF
{
    // ...
}

class My_Custom_TCPDF_Writer extends \PhpOffice\PhpSpreadsheet\Writer\Pdf\Tcpdf
{
    protected function createExternalWriterInstance($orientation, $unit, $paperSize)
    {
        $instance = new My_Custom_TCPDF($orientation, $unit, $paperSize);

        // more configuration of $instance

        return $instance;
    }
}

\PhpOffice\PhpSpreadsheet\IOFactory::registerWriter('Pdf', MY_TCPDF_WRITER::class);


Категории: PHP
Яндекс.Метрика