Производительность wkhtmltopdf

Мы собираемся использовать wkhtmltopdf для преобразования html в pdf, но нас беспокоит масштабируемость wkhtmltopdf. Кто-нибудь знает, как он масштабируется? Наше веб-приложение потенциально может попытаться преобразовать сотни тысяч (относительно сложных) html, поэтому нам важно иметь какое-то представление. У кого-нибудь есть информация по этому поводу?


person rajadhi    schedule 24.07.2012    source источник
comment
Закругленные углы CSS приводили к увеличению времени рендеринга в 20 раз. Удаление их снизило мой рендеринг с ~ 6 секунд до ~ 0,3 секунды на относительно простой HTML-странице. например. border-radius: 8px; и border-top-left-radius: 6px;   -  person T. Brian Jones    schedule 01.09.2016
comment
В моем случае после долгих расследований у меня был URL-адрес для получения QR-кода от третьей стороны, которая держала создание моих билетов.   -  person shareef    schedule 26.01.2018


Ответы (5)


Прежде всего, ваш вопрос довольно общий; есть много переменных, которые следует учитывать, когда вы спрашиваете о масштабируемости любого проекта. Очевидно, что есть разница между преобразованием «сотни тысяч» файлов HTML в течение недели и ожиданием сделать это за день или час. Кроме того, «относительно сложный» HTML может означать разные вещи для других людей.

При этом я подумал, что, поскольку я сделал что-то подобное, преобразовав примерно 450 000 html-файлов, используя wkhtmltopdf; Я бы поделился своим опытом.

Вот мой сценарий:

  • 450,000 HTML files
    • 95% of the files were one page in length
    • обычно содержит 2 изображения (относительный путь, локальная система)
    • табличные данные (иногда содержащие вложенные таблицы)
    • простая разметка в другом месте (сильный, курсив, подчеркивание и т. д.)
  • A spare desktop PC
    • 8GB RAM
    • Двухъядерный процессор с тактовой частотой 2,4 ГГц
    • 7200 об/мин HD

Я использовал простой однопоточный скрипт, написанный на PHP, для перебора папок и передачи пути к файлу html в wkhtmltopdf. Процесс преобразования всех файлов занял около 2,5 дней с минимальным количеством ошибок.

Я надеюсь, что это даст вам представление о том, что вы можете ожидать от использования wkhtmltopdf в своем веб-приложении. Некоторые очевидные улучшения были бы достигнуты за счет запуска этого на более качественном оборудовании, но в основном за счет использования многопоточного приложения для одновременной обработки файлов.

person Alistair Ronan    schedule 25.07.2012
comment
К вашему сведению для тех, кто не любит заниматься математикой, это в среднем 480 мс на документ. - person Derek Dahmer; 03.09.2014
comment
Или 2 страницы в секунду. - person xyres; 24.02.2018
comment
По моему опыту работы с четырехъядерным процессором с гиперпоточностью, я смог сгенерировать около 4000 простых счетов за ~ 30 минут, но только путем разделения счетов на 4 пакета и одновременной отправки их на веб-сервер. Затем 4 запроса обрабатываются одновременно. Увеличение количества запросов больше, чем это, может привести к сбою веб-сервера для меня. - person Ciaran Gallagher; 14.05.2020

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

Следующая цитата взята из списка рассылки wkhtmltopdf:

Я использую wkHtmlToPDF для преобразования около 6000 электронных писем в день в PDF. Все это делается на четырехъядерном сервере с 4 Гб памяти... этого более чем достаточно.

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


Изменить: добавив к этому, я просто повеселился, играя с wkhtmltopdf. В настоящее время на Intel Centrino 2 с памятью 4 ГБ я генерирую PDF-файл с 57 страницами контента (смешанный p, ul, table), ~ 100 изображений, а toc постоянно занимает ‹ 7 секунд. Я также использую визуальную студию, браузер, http-сервер и другое программное обеспечение, которое может замедлить его работу. Я использую stdin и stdout напрямую вместо файлов.


Редактировать: я не пробовал это, но если вы связали CSS, попробуйте встроить его в файл HTML (не забудьте выполнить тест до и после, чтобы правильно увидеть эффекты!). Улучшение здесь, скорее всего, зависит от таких вещей, как кеширование и где обслуживается CSS - если он читается с диска каждый раз или, не дай Бог, регенерируется из scss, это может быть довольно медленным, но если результат кешируется веб-сервером (я не думаю wkhtmltopdf кэширует что-либо между экземплярами), это может не иметь большого эффекта. YMMV.

person Joel Peltonen    schedule 24.07.2012
comment
ПЛЮС ОДИН для изображений с диска вместо промежуточного веб-сервера. Я только что протестировал его и сэкономил 70% времени генерации! - person np87; 31.03.2014
comment
Я бы добавил к этому ответу одну вещь: если вы связали CSS, попробуйте встроить его в файл HTML. Это также должно сэкономить время. - person xyres; 24.02.2018
comment
Хорошие советы! Я также использую WKHTML через ProcessStart для обработки около 10 HTML-страниц (+ настроенные нижние колонтитулы). Обработал чуть более 22 миллионов PDF-файлов, и каждый PDF-файл занимает до 2 секунд, что иногда мне кажется многовато. - person Moons; 30.07.2021

wkhtmltopdf --print-media-type быстро вспыхивает. Но при этом вы теряете обычный стиль CSS.

Это НЕ может быть идеальным решением для экспорта сложных html-страниц. Но это сработало для меня, потому что мое html-содержимое довольно простое и имеет табличную форму.

Проверено на версии wkhtmltopdf 0.12.2.1

person Ish    schedule 03.03.2015
comment
Как ни странно, я испытал ухудшение производительности, когда попробовал это. Это заняло почему-то в два раза больше времени. - person Ciaran Gallagher; 14.05.2020

Мы стараемся использовать wkhtmltopdf в любых реализациях. Мои объекты представляют собой огромные таблицы для сгенерированных координатных точек. Обычно объем моего pdf = 500 страниц

Мы пытаемся использовать порт wkhtmltopdf для .net. Результаты

- Pechkin - Pro: don't need other app. Contra: slow. 500 pages generated about 5 minutes
- PdfCodaxy - only contra: slow. Slower than pure wkhtmltopdf. Required installed wkhtmltopdf. Problems with non unicode text
- Nreco - only contra: slow. Slower than pure wkhtmltopdf. Required installed wkhtmltopdf. Incorrect unlock libs after use (for me)

Мы пытаемся использовать бинарный wkhtmltopdf, вызываемый из кода C#.

Pro: easy to use, faster that libs
Contra: need temporary files (cannot use Stream objects). Break with very huge (100MB+)html files as like as other libs
person badma    schedule 10.09.2014
comment
Что касается NReco.PdfGenerator, я понятия не имею, как он может быть медленнее, чем чистый WkHtmlToPdf (внутри он вызывает WkHtmlToPdf.exe в отдельном процессе). Также НЕ требует установленного WkHtmlToPdf: все файлы встраиваются в DLL и извлекаются автоматически, если пропущены. - person Vitaliy Fedorchenko; 10.09.2014
comment
@VitaliyFedorchenko Возможно, badma повторно использует один дочерний процесс, отправляя задания через стандартный ввод (--read-args-from-stdin), избегая штрафа за запуск процесса, тогда как [спитбол здесь] Nreco запускает процесс wkhtmltopdf для каждый PDF-файл. - person timmi4sa; 25.08.2020
comment
@timmi4sa NReco.PdfGenerator также может использовать --read-args-from-stdin с API BeginBatch/EndBatch (обратите внимание, что этот API доступен только для коммерческих пользователей с лицензионным ключом). - person Vitaliy Fedorchenko; 25.08.2020

Вы можете создать собственный пул движков wkhtmltopdf. Я сделал это для простого варианта использования, вызывая API напрямую вместо того, чтобы каждый раз запускать процесс wkhtmltopdf.exe. API wkhtmltopdf не является потокобезопасным, поэтому сделать это непросто. Также не стоит забывать о совместном использовании нативного кода между AppDomains.

person Alexn    schedule 16.03.2020
comment
Можете ли вы привести какой-либо пример кода, а не просто общую идею? - person lacostenycoder; 12.06.2020