Добавить в корзинуПозвонить
Найти в Дзене

Какие библиотеки в .NET лучше использовать для генерации PDF?

Недавно ресерчил поиск решения по генерации PDF файла.
Нашел несколько библиотек, которые используют в нашей компании, но полного обоснования - почему была выбрана та или иная не было, поэтому подготовил свой материал по выбору библиотеки. Эта библиотечка пришла к нам из NodeJS.
https://www.puppeteersharp.com/api/index.html Возможности: Так как библиотека написана для .NET, то в качестве шаблонов можно использовать Razor Pages (cshtml). Для работы папитера требуется Chromium (веб браузер) для рендеринга.
Поэтому нужно отдельно настраивать докер файл для его запуска дополнительно. Кто использует папитер часто жаловались на хромиум из-за утечки памяти, поэтому придется следить за ней. Нюансы выбора: Здесь чисто на c# создаем шаблоны, которые рендерятся в PDF без использования всяких браузеров. Получается нет никакой зависимости уже от Chromium. За счет отсутствия браузера он является самым производительным в плане генерации PDF, но не очень гибкий в плане дизайна как если бы мы испол
Оглавление

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

1) PuppeteerSharp

Эта библиотечка пришла к нам из NodeJS.
https://www.puppeteersharp.com/api/index.html

Возможности:

  • Генерация PDF файлов на основе HTML шаблона (+ кастомные настройки: формат, размеры)
  • Делать скриншот страниц
  • Поддержка JS скриптов
  • Ожидание появление элементов
    (например, если элемент динамически загружается - AJAX)
  • Ожидание выполнения JS скрипта
    (например, получение данных через API или пока ширина окна не станет меньше 100 пикселей)
  • Подключение и управление запущенным браузером.
    Можно использовать для тестов в CI.

Так как библиотека написана для .NET, то в качестве шаблонов можно использовать Razor Pages (cshtml).

Для работы папитера требуется Chromium (веб браузер) для рендеринга.
Поэтому нужно отдельно настраивать докер файл для его запуска дополнительно.

Кто использует папитер часто жаловались на хромиум из-за утечки памяти, поэтому придется следить за ней.

Нюансы выбора:

  • У нее не самая высокая скорость генерации из-за Chromium, поэтому если важна производительность, то возможно не лучшее решение.
  • Подойдет, если требуется полная поддержка CSS или сложных скриптов.
  • Также если необходима точная визуализация дизайна (верстка, тени, градиенты) или просто красивый дизайн файлов за счет рендеринга HTML/CSS.
  • И естественно идеально подойдет, если у вас есть уже готовые HTML-документы, которые нужно просто сгенерировать в PDF.

2) QuestPdf

Здесь чисто на c# создаем шаблоны, которые рендерятся в PDF без использования всяких браузеров. Получается нет никакой зависимости уже от Chromium.

За счет отсутствия браузера он является самым производительным в плане генерации PDF, но не очень гибкий в плане дизайна как если бы мы использовали PuppeteerSharp.

У него есть визуальный редактор, чтобы просматривать шаблоны файлов, но это требует запуска проекта и при изменениях кода шаблона применение изменений в IDE.
Список возможностей данного редактора.
Ранее был реализован
превьювер, но он уже не поддерживается, поэтому необходимо использовать именно "Companion". Его нужно скачать и установить, в настройках также можно переопределить порт данного приложения для подключения нашего проекта к нему.

Нюансы выбора:

  • QuestPdf имеет набор стилей, но не весь спектр CSS свойств.
    Например, "div > p:first-child { color: red; }".
    Поэтому нужно смотреть на то, есть ли какой-то функционал в ней или нет, если нет, то искать решения, возможно костыли писать.
  • Подойдет для стандартных отчетов, где не нужен сильно красивый визуал файлов.
  • У QuestPDF довольно хорошая производительность. Получается если работаем с какими-то большими и стандартными отчетами, то лучше использовать данную библиотеку.
  • Как мне кажется, разработка шаблона становится сложнее из-за использования какого-то кастомного редактора и написания только c# кода, а не HTML.
    Это явно замедляет разработку шаблона файла и его отладку.
    Также необходимо изучить как именно реализовывать шаблоны, что повышает порог входа для использования библиотеки.
  • Самый главный нюанс - лицензия. Для использования в коммерческих целях необходимо заплатить, если конечно хотите :)

3) IronPdf

Тоже платный, лицензия нужна.

Использует Chromium для генерации HTML в PDF, также как PuppeteerSharp, поэтому не вижу смысла его рассматривать когда можно использовать бесплатный папитер для тех же целей.

У них есть сайт, где они прям продвигают свой продукт сравнивая себя с конкурентами.

1,5к баксов за год на проект из трех разработчиков.
1,5к баксов за год на проект из трех разработчиков.

4) PDFsharp

Это низкоуровневая библиотека для работы с PDF.
Для неё не нужен браузер, шаблоны создаются написав код на C#, все нативно рендерится в PDF.

Использует System.Drawing и абстракцию XGraphics API – чтобы рисовать графику (линии, фигуры, текст).

У IronPdf также есть статья с сравнением PDFsharp.

Исходя из статьи PDFsharp предназначен больше для .NET Framework, WPF (Windows).
Есть ограниченная поддержка для .NET Core, как я понял, там не весь основной функционал имеется и она все еще в стадии разработки, но возможно это уже не актуальная информация.

Настройка шаблона выглядит примерно так:

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

Дополнительно

Есть еще другие библиотеки, но никто в компании их не использовал и они менее популярные, а значит будет ограниченная поддержка из-за маленького комьюнити:

  • iTextSharp
  • WkHtmlToPdf
  • и тд