Как стать автором
Обновить

Генерация документов в doc, excel, pdf и других форматах на сервере

PHPПрограммирование
Выгрузка отчетов в различных форматах — типовая задача для многих проектов. И сейчас есть немало инструментов для этого. Среди них есть интересный вариант, который применяется, как мне кажется, не часто, но он однозначно стоит внимания. Потому что позволяет получить документ в нужном формате буквально одной командой. О нем и расскажу.

image


Я буду не многословен и сразу скажу, что речь идет о конвертере, встроенном в пакет 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

Чтобы было удобно работать с утилитой из PHP, я написал обертку.

Обертка позволяет вам не думать о работе с временными файлами, подставляет в команду некоторые параметры по умолчанию, содержит константы с описанием доступных форматов, а также дает возможность задать таймаут на выполнение конвертации.

Для работы с оберткой подключаем ее к своему проекту через 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('<html>My html file</html>')
    // В каком формате нужен результат
    ->setOutputFormat(Format::TEXT_DOCX)
    // Файл для сохранения результата
    ->setOutputFile('path-to-result-docx.docx');

// Запускаем конвертацию
$converter->convert($parameters);

В результате будет сформирован docx файл. Больше примеров можно найти на гитхабе.

Разумеется, в качестве бонуса можно запускать конвертацию в другую сторону — из doc в html и отображать содержимое офисных документов в браузере. Качество конвертации будет не всегда на высоте, но для каких-то случаев вполне подойдет.

Несколько граблей


Будет полезно рассказать про несколько особенностей, с которыми я столкнулся при работе с этой утилитой.

1. Применение CSS стилей. При преобразовании html в нужный формат имейте ввиду, что такая запись воспринимается корректно:

<p class=”someclass”></p>

А такие записи будут обработаны точно так же, как если бы class мы совсем не указали:

<p class=”some_class”>Some text</p>
<p class=”class1 class2”>Some text</p>

2. При преобразовании html в нужный формат не всегда срабатывают описания стилей и иногда приходится экспериментировать, чтобы заработало. Например, так не работает:

td, th {
    border: 1px solid black;
}

Но так работает:

.td {
    border: 1px solid black;
}
...
<td class=”td”>...</td>

3. Одно и то же преобразование можно выполнять с помощью разных конвертеров. При этом результат будет существенно отличаться. Если у вас на выходе получится не очень красивый документ, попробуйте принудительно задать используемый модуль, например:

$parameters = (new LowrapperParameters())
    ->setDocumentType(DocumentType::WRITER);

4. Можно ли настроить ширину строк в таблице — для меня пока загадка. И в целом со стилизацией таблицы при преобразовании html в docx или pdf у меня возникли затруднения. Поэтому на мой взгляд подход трудно будет применять для генерации сложных печатных форм, таких как счет-фактура.

Вывод


Инструмент универсален и очень хорош, если на входе у вас не очень сложные по верстке документы. Тогда на выходе вы получаете документы в нужных форматах написав всего несколько строк кода.
Теги:officepdfdocxxls
Хабы: PHP Программирование
Всего голосов 36: ↑33 и ↓3 +30
Просмотры35.9K

Похожие публикации

Researcher/Junior Recruiter/Младший специалист по подбору персонала
от 40 000 ₽IntellaСанкт-ПетербургМожно удаленно
Программист поддержки 1С
от 92 000 ₽ГК АБЗ-1Санкт-Петербург
Middle PHP-Developer
от 120 000 до 150 000 ₽DKLINEСанкт-Петербург
Разработчик бизнес-приложений на low-code платформе
от 70 000 до 150 000 ₽2050-ИнтеграторМоскваМожно удаленно
PHP-разработчик
от 150 000 до 190 000 ₽Laptop.ruМоскваМожно удаленно

Лучшие публикации за сутки