Генерирование документов на сервере в doc, pdf, excel и прочих форматах
Для многих проектов часто необходимо в различных форматах делать выгрузку отчетов. На рынке предлагается разные инструменты, позволяющие решать эти задачи. В этой массе есть привлекательная утилита, на которую нужно обратить внимание разработчикам. Она дает возможность с помощью одной команды создавать документы в определенном формате.
Речь идет об универсальном конвертере, который интегрирован в пакете LibreOffice. Можно увидеть, как он функционирует, запустив конвертацию в консоли:
libreoffice --headless --writer --convert-to pdf html.htmlДанная команда позволяет конвертировать html.html прямо в формат pdf файла. В этом пакете просто удивляет число поддерживаемых форматов. Бесспорна выгода применения данного инструментария. Достаточно просто создавать обычные html-представления, вместо написания кодов генерации документов для каждого из требуемых форматов. После этого сгенерированная страница тут же прогоняется через конвертер.
Пуск конвертера из PHP
Необходима инсталляция пакета libreoffice-core для того, чтобы установить конвертер на сервере:
sudo apt-get install libreoffice-core --no-install-recommendsДля удобства работы с утилитой из РНР написана удобная «обертка». Она позволяет разработчику не задумываться об обработке временных файлов. В ней содержатся константы с разными описаниями доступных форматов, есть возможность по умолчанию подставлять в команды некоторые из параметров. Данная доработка позволяет задавать таймаут для выполнения процесса конвертации.
Подключаем через composer эту «обертку» к своему проекту:
composer require mnvx/lowrapperПрименить ее можно следующим образом:
use Mnvx\Lowrapper\Converter;use Mnvx\Lowrapper\LowrapperParameters;
use Mnvx\Lowrapper\Format;
// Создаем объекты для конвертера
$converter = new Converter();
// Описываем нужные параметры для конвертера
$parameters = (new LowrapperParameters())
// На входе подается строка с HTML
->setInputData(' My html file ')
// Задаем формат для результата
->setOutputFormat(Format::TEXT_DOCX)
// Файл для созданного результата
->setOutputFile('path-to-result-docx.docx');
// Запускаем процесс конвертации
$converter->convert($parameters);
Данный фрагмент позволит сформировать docx файл. На Гитхабе можно отыскать больше примеров. Конечно, как бонус, можно запустить процесс конвертации в обратную сторону. Есть возможность отобразить содержимое документов из Office в браузере, преобразуя doc в html. Качество такого преобразования оставляет желать лучшего, но для простых задач вполне подходящее.
Возможные «грабли»
В работе с данной утилитой мне пришлось столкнуться с некоторыми особенностями.
1. Во время конвертирования в нужные форматы из html не всегда проходит срабатывание описание стилей. В некоторых случаях, чтобы все работало, пришлось поэкспериментировать. К примеру, так не будет работать:
td, th {border: 1px solid black;
}
А так прекрасно выполняется:
.td {
border: 1px solid black;
}
...
2. Использование CSS стилей. Во время конвертации html в необходимый формат, нужно понимать, что корректно будет восприниматься только следующая запись.
3. Используя разные конверторы модно проводить один и тот же вид преобразований. К тому же итоговые результаты будут очень разными. Когда на выходе формируется не слишком «красивый» документ, можно принудительно задать конкретно название нужного модуля. К примеру:
$parameters = (new LowrapperParameters())->setDocumentType(DocumentType::WRITER);
4. Остается загадкой, есть ли возможность этой утилитой в таблице настраивать нужную ширину строк. Во время конвертирования html в формат pdf либо в docx также возникают затруднения в стилизации таблицы. По моему мнению, такую утилиту довольно затруднительно будет использовать при генерировании сложных печатных форм (например счетов-фактур)
Выводы
Данная утилита универсальна и хорошо работает, если на выходе нужно получать не очень сложные в верстке документы. Написание всего нескольких строк такого кода позволяет создавать необходимые документы в заданном формате.