Конвертация HTML в PDF.

При преобразовании HTML с помощью css в pdf люди часто сталкиваются с проблемами, такими как рендеринг шрифтов, css-float, позиционирование элементов для проблем с памятью на стороне сервера. Часто главный вопрос заключается в том, как мне действительно нужно писать CSS для PDF, есть ли в нем какие-то скрытые функции, которые заставят все работать.

Ответ таков: ярлыков нет. Некоторые библиотеки сделают большую часть работы за вас, если вы сохраните простой HTML, но когда вам нужно изменить что-то на более сложное, вы, вероятно, столкнетесь с разными результатами при рендеринге, преобразовании времени, использовании памяти и так далее.

Люди часто используют конвертеры на стороне сервера, потому что у него больше библиотек, и вы можете легко и напрямую хранить данные на сервере или передавать дополнительные заголовки для отображения содержимого PDF в браузере. Конвертеров на стороне клиента не так много. Поскольку конвертеры дороги, если вы используете простой HTML, было бы лучше использовать клиентский скрипт для освобождения ресурсов сервера. В этом примере мы рассмотрим только конвертеры на стороне сервера.

Давайте начнем.

Мы рассмотрим время преобразования, потребление памяти и внешний вид для пары модулей рендеринга HTML.
В этом примере мы будем использовать 3 шаблона. Один из них довольно прост, а два других более сложны в отношении структуры кода, css или количества данных, которые необходимо преобразовать. Мы будем оценивать результаты по шкале от 1 до 5, где 1 - плохой результат, 5 - отличный результат. Все тесты проводились на одной и той же машине (под управлением ОС Linux) несколько раз, и для каждой группы данных были взяты средние результаты. Мы будем оценивать только бесплатные конвертеры PDF с открытым исходным кодом.

Вы можете предварительно просмотреть HTML-шаблоны, которые мы использовали в наших тестах.
Простой HTML
Сложный HTML
Длинный HTML

Установка

DOMPDF:
(Ос: универсальный, работает на php) Очень простая установка (Менее одной минуты). Он использует композитор для загрузки и установки зависимостей. У него также есть zip-файл, если вы не хотите использовать его с композитором. Это в основном совместимый с CSS 2.1 механизм HTML-макета и рендеринга, написанный на PHP. Это средство визуализации на основе стиля: оно загружает и считывает внешние таблицы стилей, встроенные теги стилей и атрибуты стиля отдельных элементов HTML. Он также поддерживает большинство презентационных атрибутов HTML.

Wkhtmltopdf:
(ОС: windows, mac os, linux, SmartOS, OpenBSD). Легкая загрузка и установка менее чем за минуту. Использует движок рендеринга Qt WebKit. Они работают полностью« без головы и не требуют отображения или службы отображения». В этой демонстрации мы будем использовать 64-битную версию.

MPDF:
(os: универсальный, работает на php). Легкая загрузка и установка менее чем за минуту. Он использует композитор для загрузки и установки зависимостей. mPDF - это класс PHP, который генерирует файлы PDF из HTML в кодировке UTF-8. Он основан на FPDF и HTML2FPDF с рядом улучшений.

TCPDF:
(os: универсальный, работает на php). Легкая загрузка и установка менее чем за минуту. Для создания простого HTML не требуется никаких зависимостей. ПРИМЕЧАНИЕ. В стадии разработки находится новая версия TCPDF, но у меня возникли трудности с ее запуском.

Тестирование:

Вникание в подробности

Как видно из результатов, если вы собираетесь использовать простой HTML, например простые счета-фактуры для создания PDF, вы, вероятно, предпочтете mpdf. Он обеспечил отличные результаты, при использовании 16 МБ wkhtmltopdf тоже неплохо справился, создав половину времени mpdf, но потреблял вдвое больше памяти, чем mpdf. DOMPDF и tcpdf потребуют оптимизации html, чтобы добиться желаемых результатов.

Для сложного HTML мы определенно рекомендуем wkhtmltopdf. Несмотря на то, что он использует большой объем памяти, результаты были отличными. Возможно, запуск его как отдельной службы - хороший выбор, но это зависит от того, как часто вы планируете создавать сложные PDF-файлы. Кроме того, на создание PDF-файла потребовалось некоторое время, около 18 секунд, но если это стоимость, чтобы получить отличный результат, я возьму его. Mpdf изо всех сил пытался правильно отображать размеры столбцов, и ему не хватало некоторых деталей css, но эй, если они вам не нужны, вы тоже можете жить с mpdf, потому что он использовал только 23 МБ памяти по сравнению с wkhtmltopdf, который использовал 108. Другие библиотеки не так что стоит упомянуть здесь.

В длинном примере мы использовали довольно простой html, достаточный для создания около 15 страниц. Peple часто требуется создавать большие, но простые PDF-файлы. Например экспорт какой-то базы данных. И снова wkhtmltopdf и mpdf показали хорошие результаты. Wkhtmltopdf одержал победу в скорости и памяти, потребовав всего 654 мс для создания pdf и 21 МБ оперативной памяти, в то время как mpdf потребовалось около 7 секунд и немного больше памяти около 80 МБ, оба дали отличные результаты. Кажется, что tcpdf будет работать вечно, но около 2 минут выполнения дали хорошие результаты, используя всего 6 МБ оперативной памяти, но этого времени просто слишком много, чтобы кто-то мог ждать, и кажется забавным, когда мы смотрим на полсекунды для wkhtmltopdf. Dompdf создает исключение из памяти, что часто является проблемой DOMPDF, как я могу видеть в stackoverflow.

Стоит упомянуть, что wkhtmltopdf имеет некоторые другие функции, такие как запуск Javascript внутри, и вы можете получить номер страницы из wkhtmltopdf, где вы можете вставить номер страницы в определенный элемент html по вашему выбору. Вы также можете предоставить верхние и нижние колонтитулы, как в библиотеке tcpdf. Wkhtmltopdf дает еще больше переменных для игры.

Заключение

Хотя результаты во многом различаются, можно с уверенностью сказать, что mpdf и wkhtmltopdf доставят вас туда, где вам нужно, быстро и с хорошими результатами. Для DOMPDF вам понадобится некоторое время, чтобы добавить, например, шрифты в PDF, и чтобы удовлетворить html, чтобы получить красивый PDF-файл. Мы использовали dompdf в некоторых простых отрисовках, но мы быстро меняем его на wkhtmltopdf, когда дело доходит до более сложных решений. Конечно, в сети можно найти несколько лучших конвертеров PDF, но я бы сказал, что, погуглил, эти 4–5 конвертеры PDF в основном используются в разговорах.

Кредиты:

Https://www.nextstepwebs.com/open-source/invoice (простой пример)
https://datatables.net/examples/basic_init/scroll_y.html (Длинная таблица)
Stackoverflow для получения команд для проверки времени и использования памяти wkhtmltopdf

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: http://plavatvornica.com/how-to-efficiently-transfer-html-to-pdf/