Сравнения

gPdf vs QuestPDF для генерации PDF в .NET

QuestPDF — сильная C# библиотека для PDF. gPdf — хостинговый API на edge. Сравниваем лицензии, владение средой выполнения, работу с шаблонами, соответствие требованиям, штрихкоды и сценарии выбора.

Кратко

Выбирайте по границе доверия. QuestPDF создает PDF и обрабатывает данные документа внутри .NET-процесса, но шрифты, штрихкоды, масштабирование и инфраструктура соответствия требованиям остаются на вашей стороне. gPdf сводит генерацию к одному HTTP-вызову из любого языка программирования, но данные документа передаются стороннему рендереру и зависят от его доступности. .NET-приложение с упором на локальный контроль, приватность и офлайн-работу обычно выбирает QuestPDF; многостековые команды, которым нужна PDF-инфраструктура на edge с оплатой за страницы, чаще выбирают gPdf.

Бок о бок

Критерий gPdf QuestPDF Преимущество
Граница продукта
Выбор зависит от того, хотите ли вы покупать сервис или владеть кодовым путем рендера.
Хостинговый API на edge для JSON Render, Template Render и E-Invoice Render. Локальная C# / .NET библиотека из NuGet, вызываемая из кода приложения. Поровну
Основная интеграция HTTPS POST из Node, Python, Go, .NET, Ruby, PHP, Java, воркеров, фоновых задач или фронтенд-прокси. Fluent C# API со строгой типизацией, поддержкой IDE и привычными .NET-конструкциями. Поровну
Где выполняется рендерер Рендерер на edge в Cloudflare Workers; в вашем стеке не нужен PDF-сервис, настройка шрифтов или кластер развертывания. Работает там же, где ваше .NET-приложение; команда владеет CPU, памятью, нативными и пакетными зависимостями, развертыванием, мониторингом и масштабированием. gPdf
Работа со штрихкодами Нативный элемент `barcode` для 1D, 2D и GS1 форматов (`gs1128`, `sscc`, `gtin8/12/13/14`, `gs1datamatrix`, `gs1qrcode`, Aztec, PDF417, MaxiCode) со встроенным размещением человекочитаемой строки. Официальная документация подключает ZXing.Net — отдельная установка из NuGet и вывод в SVG; идентификаторы применения GS1 и FNC1 настраиваются вручную. gPdf
Шрифты и многоязычный текст Шрифты входят в сервис: авто-выбор, режимы `prefer` / `strict` и CJK-подстановка по письменности (KR, JP, SC); приложениям не нужно упаковывать файлы шрифтов. Поставляет Lato и умеет загружать системные шрифты, шрифты из каталога развертывания и пользовательские шрифты с цепочками подстановки, но собственная документация предупреждает, что в большинстве облачных развертываний доступно мало шрифтов или их нет вовсе. gPdf
Пароли и права при генерации
QuestPDF поддерживает те же уровни шифрования и пароли пользователя / владельца, но как шаг после генерации уже созданного файла, а не сразу во время рендера.
Задаются прямо в запросе рендера — `settings.security` применяет шифрование AES-128/256, пароли открытия и владельца, а также восемь флагов прав в том же вызове `/api/v1/pdf/render`. Сначала генерирует документ, затем шифрует отдельной Document Operation — `DocumentOperation.LoadFile(...).Encrypt(new Encryption256Bit { ... }).Save(...)`. gPdf
Итерации шаблонов gPdf Studio проектирует те же JSON-шаблоны, которые боевой рендер использует через `template_id + data`. QuestPDF Companion дает предпросмотр с hot reload, инспекцию иерархии, координатные инструменты и переход к исходному C# коду документа. Поровну
Коммерческая цена
Цены QuestPDF проверены по публичным страницам лицензирования 2026-06-02. .NET-командам с большим объемом стоит сравнить лицензию + хостинг с постраничной ценой gPdf.
Basic за 5 USD/мес. включает 100 000 страниц; перерасход начинается с 0,00005 USD за страницу, с одинаковой опубликованной постраничной моделью во всех публичных материалах. Бесплатно по условиям Community MIT для компаний с годовой валовой выручкой ниже 1 млн USD; бессрочные коммерческие лицензии: Professional за 999 USD для команд до 10 разработчиков и Enterprise за 2 999 USD на всю организацию без подсчета разработчиков, плюс местные налоги, в обоих случаях один год обновлений. Поровну
Расходы на серверы и деплой Для публичного API не нужен парк серверов; оплата идет по плану и страницам. Коммерческие условия обещают неограниченные проекты, серверы и развертывания; инфраструктура все равно остается у клиента. Поровну
PDF/A и электронные счета Шесть профилей PDF/A (1b/2b/3b/4/2u/3u) плюс PDF/UA-1, а также хостинговый эндпоинт Factur-X / ZUGFeRD с EN 16931 CII XML внутри PDF/A-3b, серверной валидацией и размещением данных в ЕС или глобально. Сильная поддержка PDF/A, PDF/UA-1 и ZUGFeRD 2.1 / Factur-X в коде; валидацию veraPDF и Mustang вы подключаете сами. Поровну
Куда уходят данные документа
QuestPDF держит данные внутри процесса; gPdf передает тело запроса, но ничего не сохраняет — операционные логи содержат только HTTP-статус и длительность, без тел запросов.
Публичный API передает тело запроса, но рендерер работает без хранения: JSON запроса живет в изоляте Cloudflare Workers только во время рендера (обычно ~4 ms), не хранится, не логируется и не используется для обучения. Размещение данных в ЕС / глобально и on-prem / частное развертывание дополнительно сужают или закрывают внешний контур. Байты создаются внутри процесса; данные документа не пересекают вашу границу доверия и не уходят третьей стороне. Поровну
Офлайн / изолированная работа
QuestPDF работает офлайн без настройки; gPdf приходит к тому же через частное enterprise-развертывание.
Публичный API требует сеть; enterprise on-prem / частное развертывание запускает рендерер внутри вашей инфраструктуры для офлайн- или изолированных от сети сценариев. Работает локально без лицензионного ключа, сервера активации и сетевых вызовов во время выполнения — тип лицензии задается одной строкой кода по модели доверия. Поровну
Операции с существующими PDF Создает новые PDF из структурированных запросов; не загружает, не объединяет, не расшифровывает и не редактирует существующие файлы. Document Operations над существующими PDF: объединение, перестановка / разворот / фильтрация страниц, оверлеи, шифрование и расшифровка 40/128/256-bit, вложения, XMP-метаданные и веб-линеаризация. QuestPDF
Графики и визуализация данных
Обе модели используют библиотеку визуализации, чтобы превратить данные в график; QuestPDF рендерит его внутри документа, gPdf размещает созданный вами SVG / PNG. QuestPDF сильнее во встроенных графиках, картах и canvas.
Рисует векторную графику через элемент `path` (SVG path data) и фигуры или встраивает SVG / PNG-график, созданный любой библиотекой визуализации, но не имеет встроенного движка графиков, карт или canvas API. Встроенные интеграции библиотек графиков (ScottPlot, LiveCharts, Microcharts), карты Mapbox и SkiaSharp canvas API для пользовательской графики. QuestPDF
Лучший сценарий по умолчанию Production-бизнес-документы, общие для нескольких команд: транспортные этикетки, счета, квитанции, выписки, билеты и электронные счета. C# приложения, которым нужна локальная генерация документов, полный контроль над кодом и отсутствие зависимости от внешней службы во время выполнения. Поровну

Когда что выбрать

Выбирайте gPdf, если
  • Генерация PDF — это инфраструктура, общая для нескольких сервисов или языков программирования, а не функция одного .NET-приложения.
  • Вы хотите убрать рендеринг PDF, управление шрифтами, геометрию штрихкодов и региональное масштабирование из стека приложения.
  • Команда хочет менять шаблоны как `template_id + data`, а не через развертывание C# кода.
  • Нужен рендер на edge рядом со складами, клиентами или бэкенд-задачами без развертывания .NET PDF-сервиса в каждом регионе.
  • Вам нужна опубликованная цена за страницу и отсутствие закупки коммерческой лицензии до первого боевого рендера.
Выбирайте QuestPDF, если
  • Ваш продукт прежде всего .NET, и C# код — естественный источник истины для макета документа.
  • Данные документа должны оставаться внутри вашего периметра, а частное enterprise-развертывание gPdf не рассматривается.
  • Нужна офлайн- или изолированная от сети генерация из коробки, без развертывания частного рендерера.
  • Генерация находится на критическом синхронном пути, где вызов внутри процесса быстрее любого сетевого обмена туда-обратно.
  • Нужны операции над существующими PDF — объединение, извлечение страниц, оверлеи, расшифровка или вложения — в той же библиотеке.
  • Вы рендерите графики, карты или пользовательскую SkiaSharp-графику внутри документа (ScottPlot, LiveCharts, Microcharts, Mapbox).
  • Вы подходите под условия Community MIT или хотите разовую бессрочную лицензию, а локальная эксплуатация рендерера не является нагрузкой.
Возможности

gPdf — это edge-native API преобразования JSON в PDF для больших объёмов счетов, документов, транспортных этикеток, штрихкодов, PDF/A и электронных счетов. PDF-рендеринг миллисекундного класса в глобальной edge-сети — оптимизирован для предсказуемой генерации документов промышленного уровня. Цены уровня инфраструктуры, достаточно низкие, чтобы заменить создание и эксплуатацию собственной PDF-инфраструктуры.

Возможности

QuestPDF силен, когда граница продукта — C#

QuestPDF заслуживает уважительного сравнения. Это современная библиотека генерации PDF для C#-разработчиков: fluent API, строгая типизация, большая документация, Companion App для предпросмотра и отладки, а также необычно понятная для PDF SDK модель лицензирования.

Вопрос не в том, какой продукт умеет создавать PDF. Оба умеют. Полезный вопрос — где должна проходить граница PDF: внутри .NET-приложения, которое владеет макетом, байтами и жизненным циклом, или на уровне инфраструктурного сервиса, к которому обращаются разные продукты и языки программирования.

Быстрый выбор

  • Выбирайте QuestPDF, если C# является источником истины для документа, приложение должно работать офлайн или нужны локальные операции над существующими PDF.
  • Выбирайте gPdf, если один PDF-слой должен обслуживать Node, Python, Go, .NET, фоновые задачи и региональные системы через один HTTP API.
  • Выбирайте gPdf, если изменения макета должны быть версиями шаблона, а не пересборкой C# и повторным развертыванием сервиса.

Одна семья документов, разные модели владения

С QuestPDF приложение владеет генерацией PDF — это сильная сторона: C# находится рядом с доменной моделью, все запускается и отлаживается локально, без вызова внешнего API во время выполнения.

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

  • CPU и памятью для рендера.
  • Поиском шрифтов и цепочками подстановки в каждой среде развертывания.
  • Интеграцией библиотеки штрихкодов и проверкой печати.
  • Нативными пакетами и вопросами развертывания для графиков или пользовательской графики.
  • Мониторингом, повторами и обработкой отказов.
  • Региональным развертыванием, если пользователи или склады распределены по миру.
  • Выпусками при каждом изменении макета документа.

С gPdf эта область выносится наружу: приложение отправляет DocumentRequest или template_id + data, а сервис отвечает за рендерер, среду выполнения на edge, шрифты, примитивы штрихкодов, вывод PDF/A и упаковку электронных счетов. Это менее привлекательно, если вы хотите держать каждую деталь в C#, но лучше подходит, когда генерация PDF должна быть общим служебным слоем, вызываемым из любого стека.

Три компромисса, на которые хостинговый API должен отвечать честно

Большинство сравнений библиотеки и API обходят три вопроса, которые .NET-архитектор задает первыми. Честное сравнение проговаривает их напрямую.

1. Куда уходят данные документа. Эта страница в основном про счета, выписки и электронные счета — документы с именами, адресами, налоговыми идентификаторами и суммами. В QuestPDF эти байты создаются внутри вашего процесса и не покидают его. Публичный API gPdf передает тело запроса рендереру, но рендерер работает без хранения: JSON запроса находится в V8-изоляте Cloudflare Workers только во время рендера (обычно ~4 ms) и освобождается после завершения ответа — не сохраняется, не логируется, не попадает в выборки и не используется для обучения; операционные логи ограничены HTTP-статусом и длительностью (security, DPA). Выбор размещения данных в ЕС / глобально и enterprise on-prem / частное развертывание дополнительно сужают или закрывают внешний контур. Тем не менее генерация внутри процесса без настройки — вполне законная, иногда решающая причина, по которой финансовая или государственная команда выбирает QuestPDF.

2. Режим отказа. У библиотеки нет третьей стороны, которая может упасть; генерация может сломаться только на инфраструктуре, которой вы уже владеете. Хостинговый API добавляет зависимость от доступности поставщика, которую вы не контролируете. Правильный способ внедрять gPdf — относиться к вызовам рендера как к любому внешнему вызову: таймаут, повтор, очередь и, в идеале, деградированный резервный путь. Если генерация документов стоит на критическом синхронном пути, сравнивайте “эксплуатировать самим” с “зависеть от доступности поставщика”.

3. Профиль задержки. Генерация внутри процесса — это вызов функции без сети. Размещенный вызов — сетевой обмен туда-обратно. Для пакетных и асинхронных задач это шум. Для сценария “пользователь нажал кнопку, PDF должен появиться сейчас” генерация внутри процесса структурно быстрее; edge PoPs gPdf делают переход небольшим, но это все равно TLS плюс сетевой обмен, тогда как QuestPDF — вызов метода.

Это не делает gPdf неправильным выбором; это определяет, когда он правильный — для команд, чьи данные документов могут покидать процесс, чьи процессы выдерживают сетевой переход и которым выгоднее зависеть от доступности поставщика, чем самим эксплуатировать парк рендереров.

Лицензирование и модель цены

Публичная страница лицензирования QuestPDF говорит, что коммерческая лицензия требуется только компаниям с годовой валовой выручкой выше 1 млн USD. Уровень Community бесплатен по MIT-условиям для подходящих частных лиц, open-source-проектов, некоммерческих организаций и компаний ниже этого порога. На той же странице указаны два бессрочных коммерческих уровня: Professional за 999 USD плюс местные налоги для команд до 10 разработчиков и Enterprise за 2 999 USD плюс местные налоги на всю организацию без подсчета разработчиков. Оба тарифа включают один год обновлений и неограниченные проекты, серверы и развертывания, а лицензия не истекает для последней полученной версии.

Модель контроля тоже необычно легкая. Лицензия задается одной строкой — QuestPDF.Settings.License = LicenseType.Community; — без лицензионного ключа, сервера активации и, согласно собственной странице конфигурации QuestPDF, без сетевых вызовов и без вывода данных с машины. Это модель на доверии: вы выбираете уровень, на который имеете право. Нет счета поставщика за каждый документ, а платная лицензия работает где угодно, включая полностью офлайн.

gPdf тарифицирует сам сервис рендера. Публичный Basic plan начинается с 5 USD/мес. за 100 000 страниц, перерасход — от 0,00005 USD за страницу. Это счет поставщика, но он также убирает отдельный проект по эксплуатации генерации PDF: без кластера рендера, без пути развертывания NuGet, без регионального теплого пула, без пакета шрифтов для каждого приложения и без PDF-сервиса, который нужно патчить.

Поэтому сравнение стоимости — не “999 USD против 5 USD”; лицензия — малая строка. Реальное сравнение такое:

Стоимость QuestPDF = лицензия (разовая) + ваш хостинг + время инженеров + дежурства
Стоимость gPdf     = счет за страницы (инфраструктура, шрифты, масштабирование и edge включены)

По публичной постраничной модели gPdf перерасход стоит 0,05 USD за 1 000 страниц (50 USD за 1 млн, 500 USD за 10 млн). Разовая лицензия Enterprise за 2 999 USD сравняется с этим счетом только примерно на 60 млн страницах — и этот расчет не учитывает хостинг QuestPDF и инженерные месяцы, которые сдвигают реальную точку пересечения дальше в пользу gPdf, если у вас уже нет почти бесплатной инфраструктуры рендера. Практическое правило: если ради библиотеки нужно построить и укомплектовать сервис рендера, gPdf обычно выигрывает по полной стоимости задолго до того, как постраничный счет догонит лицензию; если эта инфраструктура уже есть и почти бесплатна, бессрочная лицензия выигрывает на масштабе.

Процесс разработки: Fluent C# против шаблонов

Fluent API QuestPDF хорошо подходит, когда разработчики владеют формой документа. Строгая типизация, цепочки методов, переиспользуемые C# компоненты, рефакторинг в IDE и Companion App логичны, если PDF является частью кодовой базы приложения.

gPdf подходит другому процессу. Разработчики могут писать JSON напрямую, но боевые системы обычно переходят к шаблонам. Дизайнер, операционный специалист или инженер настраивает макет в gPdf Studio. Утвержденный макет становится шаблоном, а бэкенд продолжает рендерить через template_id + data.

Эта разница важна, когда документ часто меняется. Если меняется этикетка перевозчика, счет, упаковочный лист или макет выписки, gPdf может оставить среду выполнения стабильной и изменить только шаблон. В QuestPDF макет — это C# код, поэтому обычный путь: изменение кода, тест, сборка, развертывание и план отката.

Ни один процесс не лучше всегда: QuestPDF оптимизирован для C# разработчиков, которым нужен документ как код; gPdf — для операционных шаблонов, общих для нескольких систем.

Соответствие требованиям: оба продукта серьезные

Это не сравнение, где gPdf выигрывает заявлением, что у конкурента нет функций соответствия требованиям. Текущие публичные материалы QuestPDF перечисляют сильную поддержку стандартов, включая PDF/A, PDF/UA-1 и электронные счета EN 16931 через пример ZUGFeRD 2.1 / Factur-X на базе UN/CEFACT Cross Industry Invoice (CII). Этот пример включает PdfA = true, встраивает тело factur-x.xml через AddAttachment(), дополняет документ XMP-метаданными и валидирует результат через veraPDF (для PDF/A-3b) и Mustang Project (для ZUGFeRD). Это полный и честный рецепт — и ваш процесс владеет каждым его шагом.

gPdf упаковывает те же стандарты как API-контракт. JSON Render открывает шесть профилей PDF/A (1b, 2b, 3b, 4, 2u, 3u) плюс PDF/UA-1 через settings.profile, Template Render переиспользует ту же модель документа, а E-Invoice Render дает выделенный эндпоинт POST /api/v1/e-invoice/render, который создает пакеты Factur-X / ZUGFeRD PDF/A-3b со встроенным EN 16931 CII XML. Отличие от рецепта QuestPDF в том, что сервис делает за вас: gPdf выполняет PDF/A-3b и валидацию электронного счета на сервере, поддерживает синхронную выдачу в ответе или доставку через опрашиваемый объект и предлагает резидентность данных в ЕС или глобально как параметры запроса, а не как шаги, которые вы собираете и эксплуатируете. QuestPDF подходит, когда валидация должна жить внутри вашего .NET-процесса; gPdf — когда это должен быть хостинговый контракт, общий для многих систем.

Шрифты и штрихкоды: главное — усилия интеграции

У QuestPDF сильная модель шрифтов. Он поставляет Lato 2.015 по умолчанию, автоматически загружает системные шрифты и шрифты из каталога развертывания, позволяет регистрировать пользовательские шрифты через FontManager и поддерживает цепочки подстановки. Это дает разработчикам контроль. Но та же документация честно описывает проблему: “in most cloud deployments, few or no fonts are available, which may lead to unexpected results” и рекомендует отключать шрифты окружения и явно регистрировать нужные. Иначе говоря, в контейнере или бессерверной среде шрифтовое окружение — ваша зона планирования, упаковки и тестирования; отсутствующий глиф станет символом-заглушкой или, если включить CheckIfAllTextGlyphsAreAvailable, исключением.

gPdf делает шрифты частью границы сервиса. Рендерер включает набор для многих письменностей — латиницы, греческого, кириллицы, арабского, иврита, бенгальского, тамильского, тайского, вьетнамского, моноширинного текста и CJK с подстановкой по письменности на Noto KR / JP / SC. Он решает неявный выбор шрифта через авто-выбор, а явный выбор — через prefer или strict. Вызывающим приложениям не нужно отправлять CJK-шрифт, регистрировать ресурсы Noto в .NET-приложении или настраивать подстановку для каждой среды развертывания. Они отправляют данные; рендерер владеет шрифтовым окружением, одинаковым в каждом регионе.

Сравнение штрихкодов имеет похожую форму. Документация QuestPDF по штрихкодам показывает добротный подход с ZXing.Net, который рендерится как векторный SVG, и прямо отмечает, что ZXing.Net не входит в пакет QuestPDF — его устанавливают из NuGet и подключают отдельно:

// QuestPDF: add the separate ZXing.Net package, encode, render to SVG, embed.
//   dotnet add package ZXing.Net
var writer = new ZXing.BarcodeWriterSvg {
    Format  = ZXing.BarcodeFormat.CODE_128,
    Options = new ZXing.Common.EncodingOptions { Width = 320, Height = 80 }
};
string svg = writer.Write("INV-2026-001").Content;
container.Svg(svg);
// GS1-128 with Application Identifiers and FNC1 framing is hand-wired on top.

В gPdf генерация штрихкодов — полноценный элемент схемы. Запрос объявляет формат, содержимое, физический размер и опциональную человекочитаемую строку; форматы GS1 нативные, поэтому идентификаторы применения идут прямо в content:

{
  "type": "barcode",
  "format": "gs1_128",
  "content": "(01)00012345678905(21)SN12345",
  "x": 12, "y": 60, "width": 80, "height": 18,
  "barcode_text": { "enabled": true, "position": "bottom" }
}

Для одного .NET приложения установить ZXing.Net и протестировать вывод может быть легко. Для многих сервисов и шаблонов — особенно в логистике и рознице, где нужны GS1-128, SSCC, GTIN, GS1 DataMatrix или GS1 QR с человекочитаемой строкой интерпретации — проще поддерживать поведение штрихкодов внутри API документов, чем заново подключать ZXing в каждом сервисе.

Где QuestPDF явно выигрывает

Помимо офлайн-работы, удержания данных документа внутри вашего периметра и сценариев, где PDF-код сам является частью продукта, QuestPDF уверенно сильнее в двух областях возможностей, которые находятся вне области gPdf:

  • Операции с существующими PDF. QuestPDF может загружать существующие файлы и объединять их, выбирать / переставлять / разворачивать / фильтровать страницы, накладывать оверлеи, добавлять вложения, задавать XMP-метаданные, линеаризовать для web-доставки, а также шифровать и расшифровывать с безопасностью 40/128/256-bit. gPdf может ставить пароль и ограничивать права для PDF, которые он генерирует, но не открывает, не объединяет и не расшифровывает файлы, созданные не им.
  • Графики, карты и пользовательская графика. QuestPDF интегрирует библиотеки графиков (ScottPlot, LiveCharts, Microcharts), встраивает карты Mapbox и открывает SkiaSharp canvas для произвольного 2D-рисования. gPdf может рисовать векторную графику через элемент path (SVG path data) или встраивать SVG / PNG-график, созданный выше по процессу, но у него нет встроенного движка графиков, карт или canvas — поэтому если графики на данных являются центральной частью документа, этот инструментарий остается на стороне QuestPDF.

Где gPdf явно выигрывает

gPdf выигрывает, когда организация не хочет, чтобы каждая продуктовая команда владела собственным PDF-сервисом: стеки на нескольких языках программирования, глобальные процессы и ERP / OMS / WMS / ecommerce / fintech / ticketing-системы, которые рендерят документы из структурированных данных, с шаблонами, меняющимися независимо от кода. В таких условиях локальная библиотека часто начинается дешево, а затем превращается в парк: один сервис на язык программирования, один путь развертывания на регион, один план шрифтов на контейнер, один набор регрессий штрихкодов на команду. gPdf превращает этот парк в один HTTP-контракт.

Бессерверная архитектура делает границу особенно явной. На AWS Lambda, Cloud Run или Azure Functions QuestPDF все равно работает внутри приложения — команда пакует среду выполнения .NET, шрифты, нативные зависимости и достаточно CPU / памяти для пиковых PDF-задач, а также отвечает за холодные старты. gPdf уже является сервисом рендера: функция отправляет небольшой запрос template_id + data на edge и получает PDF-байты обратно, без рендерера, который нужно прогревать, и без воркера в каждом регионе, который нужно масштабировать.

Как выглядит миграция

Миграция с QuestPDF на gPdf — не построчная перепись. Это смена границы: C# код, строящий PDF, становится либо JSON-запросом документа, либо опубликованным шаблоном.

До / после — C# вызов сборки документа сводится к одному HTTP POST (нажмите, чтобы раскрыть)
- // Before: generate the PDF inside a .NET application.
- Document.Create(container =>
- {
-     container.Page(page =>
-     {
-         page.Size(PageSizes.A4);
-         page.Margin(30);
-         page.Header().Text("Invoice").FontSize(24).SemiBold();
-         page.Content().Column(column =>
-         {
-             column.Item().Text($"Invoice number: {invoice.Number}");
-             column.Item().Text($"Total: {invoice.Total:C}");
-         });
-     });
- })
- .GeneratePdf("invoice.pdf");
+
+ // After: render through the shared gPdf template from C#.
+ using System.Net.Http.Headers;
+ using System.Net.Http.Json;
+
+ using var client = new HttpClient();
+ client.DefaultRequestHeaders.Authorization =
+     new AuthenticationHeaderValue("Bearer", key);
+
+ var response = await client.PostAsJsonAsync(
+     "https://api.gpdf.com/api/v1/template-render",
+     new {
+         template_id = "invoice-v2",
+         data = new {
+             invoice_number = invoice.Number,
+             total = invoice.Total,
+             currency = invoice.Currency
+         }
+     });
+
+ response.EnsureSuccessStatusCode();
+ byte[] pdfBytes = await response.Content.ReadAsByteArrayAsync();

Когда эта граница переносится, изменения макета могут стать версиями шаблона вместо развертываний приложения. Приложение по-прежнему владеет бизнес-данными и решениями процесса; gPdf владеет рендерингом.

Примечание о ценах и источниках

Информация о QuestPDF на этой странице проверена 2026-06-02 по официальным источникам QuestPDF: License and Pricing, License configuration, Features Overview, Companion App features, Barcodes, Font management и ZUGFeRD example. Цены и страницы возможностей могут меняться; закупочным командам стоит перепроверить страницу поставщика перед решением о покупке. QuestPDF и связанные обозначения принадлежат их владельцам, это сравнение ими не одобрено.

Связанные сценарии генерации PDF

Если вы сравниваете QuestPDF и gPdf, рядом обычно возникают задачи API JSON в PDF, PDF счетов, API транспортных этикеток, GS1-128 и штрихкодов в PDF, API PDF/A, API Factur-X и генерации PDF без эксплуатации собственного сервиса рендера. Также полезно посмотреть отдельный разбор стоимости транспортных этикеток на iText и gPdf, если ваш сценарий ближе к логистике.

FAQ

Заменяет ли gPdf QuestPDF?

Нет. gPdf заменяет необходимость эксплуатировать сервис генерации PDF для структурированных бизнес-документов. QuestPDF остается сильной локальной C# библиотекой, когда PDF должен генерироваться внутри приложения.

QuestPDF бесплатен?

Публичная страница лицензирования QuestPDF говорит, что уровень Community бесплатен по MIT-условиям для подходящих частных лиц, open-source-проектов, некоммерческих организаций и компаний с годовой валовой выручкой ниже 1 млн USD. Компаниям выше этого порога нужна бессрочная коммерческая лицензия: Professional за 999 USD плюс местные налоги для команд до 10 разработчиков или Enterprise за 2 999 USD плюс местные налоги на всю организацию, каждый вариант включает один год обновлений.

Может ли gPdf генерировать графики или карты как QuestPDF?

Не как встроенный движок. QuestPDF интегрирует библиотеки графиков (ScottPlot, LiveCharts, Microcharts), карты Mapbox и SkiaSharp canvas, которые рендерятся внутри документа. gPdf все еще может рисовать векторные графики через элемент path (принимает SVG path data) и фигуры или встраивать SVG / PNG, созданный любой библиотекой визуализации, как image. Разница в том, что QuestPDF вычисляет и рендерит график внутри процесса, а с gPdf вы создаете графику, и gPdf размещает ее. Если графики на данных или карты являются центральными для документа, QuestPDF подходит лучше.

Какой продукт дешевле?

Зависит от границы. QuestPDF может быть дешевле для .NET-команд, которые подходят под условия Community или уже эксплуатируют инфраструктуру рендера. gPdf может быть дешевле, когда альтернатива — построить, разместить и обслуживать PDF-сервис для нескольких продуктов или регионов.

Хранит или логирует ли gPdf данные моих документов?

Нет. JSON, который вы отправляете, и PDF, который возвращает gPdf, не сохраняются. Каждый запрос рендерится внутри одного V8-изолята Cloudflare Workers, держится в памяти только во время рендера — обычно около 4 ms — и освобождается после завершения потока ответа; gPdf не сохраняет, не логирует, не берет выборки и не обучается на содержимом DocumentRequest. Операционные логи хранят только HTTP-статус и длительность 30 дней и не содержат тел запросов. См. security policy, privacy policy и DPA. Для нагрузок, которые вообще не могут передавать данные наружу, on-prem / частное развертывание удерживает их внутри вашего периметра.

Может ли QuestPDF работать без доступа к интернету?

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

Может ли gPdf рендерить произвольные C# макеты QuestPDF?

Нет. gPdf не выполняет C# код макета. Миграция означает перевод формы документа в gPdf JSON-запрос или сохраненный gPdf шаблон.