QuestPDF jest świetny, gdy granicą produktu jest C#
QuestPDF zasługuje na uczciwe porównanie. To nowoczesna biblioteka do generowania PDF dla programistów C#, z płynnym API, mocnym typowaniem, rozbudowaną dokumentacją, Companion App do podglądu i debugowania oraz modelem licencyjnym, który jak na PDF SDK jest wyjątkowo przejrzysty.
Pytanie produktowe nie brzmi “który z nich umie stworzyć PDF?”. Oba umieją. Przydatniejsze pytanie brzmi: gdzie ma mieszkać granica PDF — wewnątrz aplikacji .NET, która posiada układ, bajty i cykl życia dokumentu, czy jako warstwa infrastruktury wywoływana przez wiele produktów i języków.
Szybki przewodnik decyzyjny
- Wybierz QuestPDF, gdy C# jest źródłem odniesienia dokumentu, aplikacja musi działać offline albo potrzebne są lokalne operacje na istniejących PDF-ach.
- Wybierz gPdf, gdy jedna warstwa PDF ma obsługiwać Node, Python, Go, .NET, zadania i systemy regionalne przez to samo HTTP API.
- Wybierz gPdf, gdy zmiany układu mają być rewizjami szablonu, a nie rebuildami C# i ponownymi wdrożeniami usługi.
Ta sama rodzina dokumentów, inny model własności
W QuestPDF aplikacja posiada generowanie PDF — to realna zaleta: C# pozostaje blisko modelu domenowego, działa i debuguje się lokalnie, bez wywołania w czasie działania do zewnętrznego API.
Koszt kompromisu jest taki, że zespół posiada też cały produkcyjny obszar:
- CPU i pamięć do renderowania.
- Odkrywanie fontów i dobór fontów zastępczych w każdym środowisku wdrożeniowym.
- Integrację biblioteki kodów kreskowych oraz kontroli jakości wydruku.
- Pakiety natywne i ryzyka wdrożeniowe dla wykresów albo integracji własnej grafiki.
- Monitoring, ponowienia i obsługę awarii.
- Wdrożenie regionalne, gdy użytkownicy lub magazyny są globalne.
- Wdrożenia przy każdej zmianie układu dokumentu.
W gPdf ten obszar przesuwa się na zewnątrz: aplikacja wysyła DocumentRequest albo template_id + data, a usługa posiada generator, środowisko uruchomieniowe na edge, fonty, prymitywy kodów kreskowych, wyjście PDF/A i pakietowanie e-faktury. To mniej atrakcyjne, jeśli chcecie mieć każdy szczegół w C#, ale bardziej atrakcyjne, gdy generowanie PDF ma być warstwą narzędziową dostępną z dowolnego stosu.
Trzy kompromisy, na które hostowane API musi odpowiedzieć wprost
Większość argumentów “biblioteka kontra API” pomija trzy pytania, które architekt .NET zadaje jako pierwsze. Uczciwe porównanie wypowiada je głośno.
1. Dokąd trafiają dane dokumentu. Ta strona dotyczy głównie faktur, zestawień i e-faktur — dokumentów pełnych nazwisk, adresów, identyfikatorów podatkowych i kwot. W QuestPDF te bajty powstają wewnątrz Państwa procesu i go nie opuszczają. Publiczne API gPdf przesyła dane żądania do generatora, ale generator działa bez retencji: JSON żądania jest trzymany w izolacie V8 Cloudflare Workers wyłącznie przez czas generowania (zwykle ~4 ms) i zwalniany po zakończeniu odpowiedzi — nigdy nie jest przechowywany, logowany, próbkowany ani używany do trenowania; logi operacyjne ograniczają się do statusu HTTP i czasu trwania (security, DPA). Wybór rezydencji danych w UE / globalnie oraz enterprise on-prem / wdrożenie prywatne dodatkowo zawężają albo zamykają ekspozycję. Mimo to generowanie w procesie bez dodatkowej konfiguracji jest uzasadnionym — czasem decydującym — powodem, dla którego zespół finansowy albo sektora publicznego wybiera QuestPDF.
2. Tryb awarii. Biblioteka nie ma strony trzeciej, która może przestać działać; generowanie może zawieść tylko na infrastrukturze, którą już posiadacie. Hostowane API dodaje zależność od dostępności poza Państwa kontrolą. Właściwy sposób adopcji gPdf to traktowanie wywołań generowania jak każdego wywołania zewnętrznego — limit czasu, ponowienie, kolejka i najlepiej tryb awaryjny z degradacją. Jeśli generowanie dokumentów znajduje się na krytycznej ścieżce synchronicznej, porównujcie “utrzymujemy to samodzielnie” z “zależymy od dostępności dostawcy”.
3. Profil opóźnień. Generowanie w procesie to wywołanie funkcji bez sieci. Wywołanie hostowane to pełne przejście przez sieć. Dla zadań wsadowych i asynchronicznych to szum. Dla scenariusza “użytkownik klika, PDF musi pojawić się teraz” generowanie w procesie jest strukturalnie szybsze — punkty PoP na edge w gPdf skracają skok, ale nadal jest to TLS plus przejście przez sieć, podczas gdy QuestPDF to wywołanie metody.
Żaden z tych punktów nie czyni gPdf złym wyborem; definiują one kiedy jest wyborem właściwym — dla zespołów, których dane dokumentów mogą opuścić proces, których przepływy tolerują skok sieciowy i które wolą zależeć od dostępności dostawcy niż samodzielnie prowadzić flotę renderującą.
Licencjonowanie i model ceny
Publiczna strona licencyjna QuestPDF mówi, że licencja komercyjna jest wymagana tylko dla firm powyżej 1 mln USD rocznego przychodu brutto. Poziom Community jest bezpłatny na warunkach MIT dla uprawnionych osób fizycznych, projektów open source, organizacji non-profit i firm poniżej tego progu. Ta sama publiczna strona podaje dwa bezterminowe poziomy komercyjne: Professional za 999 USD plus lokalny podatek dla zespołów do 10 programistów oraz Enterprise za 2 999 USD plus lokalny podatek dla całej organizacji, bez liczenia programistów. Oba obejmują rok aktualizacji oraz nielimitowane projekty, serwery i wdrożenia, a licencja nie wygasa dla ostatniej otrzymanej wersji.
Model egzekwowania też jest wyjątkowo lekki. Licencję ustawia jedna linia — QuestPDF.Settings.License = LicenseType.Community; — bez klucza licencyjnego ani serwera aktywacji i, według własnej strony konfiguracji QuestPDF, bez wywołań sieciowych i bez danych opuszczających maszynę. To model oparty na zaufaniu: wybiera się poziom, do którego organizacja ma prawo. Nie ma rachunku od dostawcy za każdy dokument, a płatna licencja działa wszędzie, także w pełni offline.
gPdf wycenia bezpośrednio usługę generowania. Publiczny plan Basic zaczyna się od 5 USD/miesiąc za 100 000 stron, a nadwyżki od 0,00005 USD za stronę. To rachunek od dostawcy, ale usuwa też osobny projekt utrzymania generowania PDF: brak klastra renderowania, brak ścieżki wdrożenia NuGet, brak regionalnej puli rozgrzewkowej, brak pakietów fontów na aplikację i brak usługi PDF do patchowania.
Dlatego porównanie kosztu nie brzmi “USD 999 vs USD 5” — licencja to mała pozycja. Prawdziwe porównanie wygląda tak:
QuestPDF razem = licencja (jednorazowo) + własny hosting + czas inżynierów + dyżury
gPdf razem = rachunek za strony (infrastruktura, fonty, skalowanie i edge w cenie)
Według publicznej matematyki za stronę nadwyżka gPdf kosztuje 0,05 USD za 1000 stron (50 USD za 1 mln, 500 USD za 10 mln). Jednorazowa licencja Enterprise za 2 999 USD zrówna się z takim rachunkiem dopiero w okolicach ~60 mln stron — i ta liczba pomija hosting QuestPDF oraz miesiące pracy inżynierów, które przesuwają realny punkt opłacalności jeszcze dalej na korzyść gPdf, chyba że już tanio utrzymujecie infrastrukturę generowania. Reguła praktyczna: jeśli trzeba zbudować i obsadzić usługę renderowania tylko po to, aby użyć biblioteki, gPdf zwykle wygrywa na całkowitym koszcie dużo wcześniej, niż rachunek za strony dogoni licencję; jeśli ta infrastruktura już istnieje i jest dla Państwa prawie darmowa, licencja bezterminowa wygrywa przy skali.
Proces pracy: Fluent C# kontra szablony
Fluent API QuestPDF dobrze pasuje, gdy programiści posiadają kształt dokumentu. Silne typowanie, łańcuchy metod, komponenty C# wielokrotnego użytku, refaktoryzacje w IDE i Companion App mają sens, gdy PDF jest częścią bazy kodu aplikacji.
gPdf pasuje do innego procesu pracy. Programiści nadal mogą pisać JSON bezpośrednio, ale systemy produkcyjne zwykle przechodzą w stronę szablonów. Projektant, operator albo inżynier poprawia układ w gPdf Studio. Zatwierdzony układ staje się szablonem, a usługa serwerowa dalej generuje przez template_id + data.
Ta różnica ma znaczenie, gdy dokument często się zmienia. Jeśli układ etykiety przewoźnika, faktury, listu przewozowego albo zestawienia się zmienia, gPdf może utrzymać środowisko uruchomieniowe bez zmian i przesunąć tylko szablon. W QuestPDF układ jest kodem C#, więc typowa ścieżka to zmiana kodu, test, build, wdrożenie i plan rollbacku.
Żaden proces nie jest uniwersalnie lepszy: QuestPDF optymalizuje pod programistów C#, którzy chcą dokument jako kod; gPdf pod szablony operacyjne współdzielone między systemami.
Compliance: oba produkty traktują standardy poważnie
To nie jest porównanie, w którym gPdf wygrywa, mówiąc, że konkurent nie ma funkcji zgodności. Aktualne publiczne materiały QuestPDF pokazują mocne wsparcie standardów, w tym PDF/A, PDF/UA-1 oraz e-fakturowanie EN 16931 przez przykład ZUGFeRD 2.1 / Factur-X oparty na standardzie UN/CEFACT Cross Industry Invoice (CII). Ten przykład ustawia PdfA = true, osadza factur-x.xml przez AddAttachment(), rozszerza dokument o metadane XMP i waliduje wynik przez veraPDF (dla PDF/A-3b) oraz Mustang Project (dla ZUGFeRD). To kompletna, uczciwa recepta — a Państwa pipeline posiada każdy jej krok.
gPdf pakuje te same standardy jako kontrakt API. JSON Render udostępnia sześć profili PDF/A (1b, 2b, 3b, 4, 2u, 3u) plus PDF/UA-1 przez settings.profile, Template Render używa tego samego modelu dokumentu, a E-Invoice Render udostępnia dedykowany punkt końcowy POST /api/v1/e-invoice/render, który tworzy pakiety Factur-X / ZUGFeRD PDF/A-3b z osadzonym EN 16931 CII XML. Różnica względem przepisu QuestPDF polega na tym, co usługa robi za Państwa: gPdf uruchamia PDF/A-3b i walidację e-faktury po stronie serwera, obsługuje synchroniczne inline albo dostarczanie obiektu po odpytywaniu i oferuje rezydencję danych w UE albo globalnie jako ustawienia żądania, a nie kroki, które samodzielnie składacie i utrzymujecie. QuestPDF pasuje, gdy walidacja ma mieszkać we własnym pipeline .NET; gPdf wtedy, gdy ma to być hostowany kontrakt współdzielony przez wiele systemów.
Fonty i kody kreskowe: liczy się wysiłek integracji
QuestPDF ma mocny model fontów. Dostarcza Lato 2.015 domyślnie, automatycznie ładuje fonty systemowe i fonty z katalogu wdrożenia, pozwala rejestrować własne fonty przez FontManager i obsługuje łańcuchy fontów zastępczych. To daje programistom kontrolę. Ale ta sama dokumentacja uczciwie opisuje haczyk: “in most cloud deployments, few or no fonts are available, which may lead to unexpected results,” i zaleca wyłączenie fontów środowiskowych oraz jawne rejestrowanie tego, czego potrzebujecie. Innymi słowy: w kontenerze albo środowisku bezserwerowym środowisko fontów jest Państwa obszarem planowania, dostarczenia i testów — a brakujący glif staje się znakiem zastępczym albo, po włączeniu CheckIfAllTextGlyphsAreAvailable, rzuconym wyjątkiem.
gPdf czyni fonty częścią granicy usługi. Generator zawiera zestaw wieloskryptowy — Latin, Greek, Cyrillic, Arabic, Hebrew, Bengali, Tamil, Thai, Vietnamese, monospace oraz CJK z doborem zastępczym per skrypt do Noto KR / JP / SC. Ciche wybory fontów rozwiązuje przez niejawny automatyczny wybór, a jawne przez prefer albo strict. Wywołujący nie dostarczają fontu CJK, nie rejestrują zasobów Noto w aplikacji .NET i nie stroją fontów zastępczych dla każdego celu wdrożenia. Wysyłają dane; generator posiada środowisko fontów, takie samo w każdym regionie.
Porównanie kodów kreskowych ma podobny kształt. Dokumentacja QuestPDF pokazuje solidne podejście z ZXing.Net generowanym jako wektorowe SVG i jasno mówi, że ZXing.Net nie jest częścią pakietu QuestPDF — instalujecie go z NuGet i podpinacie:
// 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.
W gPdf generowanie kodów kreskowych jest pełnoprawnym elementem schematu. Żądanie deklaruje format, treść, rozmiar fizyczny i opcjonalną linię czytelną dla operatora — a formaty GS1 są natywne, więc identyfikatory zastosowania trafiają prosto do 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" }
}
Dla jednej aplikacji .NET instalacja ZXing.Net i test wyjścia może być prosta. Dla wielu usług i szablonów — szczególnie w obciążeniach logistycznych i retailowych, które potrzebują GS1-128, SSCC, GTIN, GS1 DataMatrix albo GS1 QR z linią interpretacji czytelną dla operatora — utrzymanie zachowania kodów kreskowych w API dokumentu jest prostsze niż powtarzanie tego samego podpięcia ZXing w każdej usłudze.
Gdzie QuestPDF wyraźnie wygrywa
Poza pracą offline, trzymaniem danych dokumentów w Państwa perymetrze i sytuacją, w której kod PDF sam jest częścią produktu, QuestPDF ma dwa obszary możliwości, które leżą poza zakresem gPdf:
- Operacje na istniejących PDF-ach. QuestPDF potrafi ładować istniejące pliki i scalać je, wybierać, przestawiać, odwracać i filtrować strony, nakładać warstwy, dodawać załączniki, ustawiać metadane XMP, linearyzować pod dostarczanie webowe oraz zarówno szyfrować, jak i odszyfrowywać z zabezpieczeniami 40/128/256-bitowymi. gPdf potrafi zabezpieczać hasłem i ograniczać uprawnieniami PDF-y, które generuje, ale nie otwiera, nie scala ani nie odszyfrowuje plików, których nie stworzył.
- Wykresy, mapy i grafika własna. QuestPDF integruje biblioteki wykresów (ScottPlot, LiveCharts, Microcharts), osadza mapy Mapbox i udostępnia SkiaSharp canvas do dowolnego rysowania 2D. gPdf może rysować grafikę wektorową elementem
path(dane ścieżki SVG) albo osadzić wykres SVG / PNG przygotowany wcześniej, ale nie ma wbudowanego silnika wykresów, map ani canvas — jeśli więc wykresy oparte na danych są centralne dla dokumentu, to narzędzie pozostaje po stronie QuestPDF.
Gdzie gPdf wyraźnie wygrywa
gPdf wygrywa, gdy organizacja nie chce, aby każdy zespół produktowy posiadał własną usługę PDF — stosy oparte na wielu językach programowania, globalne procesy oraz systemy ERP / OMS / WMS / ecommerce / fintech / ticketing, które generują dokumenty z danych strukturalnych, z szablonami zmieniającymi się niezależnie od kodu. W takich środowiskach lokalna biblioteka często zaczyna się tanio, a potem staje się flotą: jedna usługa na język programowania, jedna ścieżka wdrożenia na region, jeden plan fontów na kontener, jeden zestaw regresji kodów kreskowych na zespół. gPdf zmienia tę flotę w jeden kontrakt HTTP.
Architektura serverless pokazuje tę granicę najczytelniej. Na AWS Lambda, Cloud Run albo Azure Functions QuestPDF nadal działa wewnątrz aplikacji — Państwa zespół pakuje środowisko uruchomieniowe .NET, fonty, zależności natywne oraz wystarczające CPU / pamięć na szczytowe prace PDF i posiada zimne starty. gPdf już jest usługą generowania: funkcja wysyła małe żądanie template_id + data na edge i dostaje z powrotem bajty PDF, bez rozgrzewania generatora i bez workerów skalowanych w każdym regionie.
Jak wygląda migracja
Migracja z QuestPDF do gPdf nie jest przepisaniem linia po linii. To zmiana granicy: kod C#, który buduje PDF, staje się albo żądaniem dokumentu JSON, albo opublikowanym szablonem.
Przed / po — C# wywołanie budowania dokumentu sprowadza się do jednego HTTP POST (kliknij, aby rozwinąć)
- // 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();
Po przesunięciu tej granicy zmiany układu mogą stać się rewizjami szablonów zamiast wdrożeniami aplikacji. Aplikacja nadal posiada dane biznesowe i decyzje dotyczące procesu; gPdf posiada warstwę generowania.
Nota o cenach i źródłach
Informacje o QuestPDF na tej stronie sprawdzono 2026-06-02 w oficjalnych źródłach QuestPDF: License and Pricing, License configuration, Features Overview, Companion App features, Barcodes, Font management oraz ZUGFeRD example. Ceny i strony funkcji mogą się zmieniać; zespoły zakupowe powinny ponownie sprawdzić stronę dostawcy przed decyzją zakupową. QuestPDF i powiązane znaki należą do ich właścicieli, a to porównanie nie jest przez nich zatwierdzone.
Powiązane scenariusze generowania PDF
Zespoły porównujące QuestPDF i gPdf zwykle rozstrzygają, czy PDF ma pozostać lokalnym kodem C#, czy wspólną usługą dla wielu systemów. Dla wariantu API warto zobaczyć API JSON do PDF, API PDF faktur, API etykiet wysyłkowych, API PDF/A, API Factur-X oraz API kodów kreskowych GS1.
FAQ
Czy gPdf zastępuje QuestPDF?
Nie. gPdf zastępuje potrzebę utrzymywania usługi generowania PDF dla ustrukturyzowanych dokumentów biznesowych. QuestPDF pozostaje mocną lokalną biblioteką C#, gdy PDF ma być generowany wewnątrz aplikacji.
Czy QuestPDF jest bezpłatny?
Publiczna strona licencyjna QuestPDF mówi, że poziom Community jest bezpłatny na warunkach MIT dla uprawnionych osób fizycznych, projektów open source, organizacji non-profit i firm poniżej 1 mln USD rocznego przychodu brutto. Firmy powyżej tego progu potrzebują bezterminowej licencji komercyjnej: Professional za 999 USD plus lokalny podatek dla maksymalnie 10 programistów albo Enterprise za 2 999 USD plus lokalny podatek dla całej organizacji, każda z rokiem aktualizacji.
Czy gPdf może generować wykresy albo mapy jak QuestPDF?
Nie jako wbudowany silnik. QuestPDF integruje biblioteki wykresów (ScottPlot, LiveCharts, Microcharts), mapy Mapbox i SkiaSharp canvas generujące grafikę w dokumencie. gPdf nadal może rysować wykresy wektorowe elementem path (akceptuje dane ścieżki SVG) i kształtami albo osadzać SVG / PNG wytworzone przez dowolną bibliotekę wykresów jako image. Różnica polega na tym, że QuestPDF liczy i generuje wykres w procesie, a w gPdf przygotowujecie grafikę wykresu, który gPdf umieszcza. Jeśli wykresy oparte na danych albo mapy są kluczowe dla dokumentu, QuestPDF jest lepszym wyborem.
Który produkt jest tańszy?
To zależy od granicy. QuestPDF może być tańszy dla zespołów .NET kwalifikujących się do warunków Community albo już utrzymujących infrastrukturę generowania. gPdf może być tańszy, gdy alternatywą jest budowa, hosting i utrzymanie usługi PDF dla wielu produktów albo regionów.
Czy gPdf przechowuje albo loguje dane moich dokumentów?
Nie. JSON wysyłany do gPdf i PDF zwracany przez gPdf nie są przechowywane. Każde żądanie jest obsługiwane wewnątrz pojedynczego izolatu V8 Cloudflare Workers, trzymane w pamięci tylko przez czas generowania — zwykle około 4 ms — i zwalniane po zakończeniu strumienia odpowiedzi; gPdf nie przechowuje, nie loguje, nie próbkuje ani nie trenuje na treści DocumentRequest. Logi operacyjne przechowują tylko status HTTP i czas trwania przez 30 dni i nie zawierają ciał żądań. Zobacz security policy, privacy policy i DPA. Dla obciążeń, które w ogóle nie mogą przesyłać danych, on-prem / wdrożenie prywatne utrzymuje je w Państwa perymetrze.
Czy QuestPDF może działać bez dostępu do internetu?
Tak. Strona konfiguracji licencji QuestPDF mówi, że nie ma klucza licencyjnego ani serwera aktywacji, a obliczenia są wykonywane lokalnie. To jeden z najjaśniejszych powodów, aby wybrać QuestPDF.
Czy gPdf może generować dowolne układy C# QuestPDF?
Nie. gPdf nie wykonuje kodu układu C#. Migracja oznacza przełożenie kształtu dokumentu na żądanie JSON gPdf albo zapisany szablon gPdf.