Генерирование документов на сервере в 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 также возникают затруднения в стилизации таблицы. По моему мнению, такую утилиту довольно затруднительно будет использовать при генерировании сложных печатных форм (например счетов-фактур)

Выводы
Данная утилита универсальна и хорошо работает, если на выходе нужно получать не очень сложные в верстке документы. Написание всего нескольких строк такого кода позволяет создавать необходимые документы в заданном формате.

К оглавлению Опубликовано: 13.07.2017