Задача сохранении 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"
Результат был такой:
Сам код:
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
Результат получился лучше, но все равно не тот:
При тестоах выяснилось, что проблема именно в 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
Первый Вариант, оказался не очень:
В заключении
Лучший вариант был у библиотеки 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);