QuestPDF rất đáng chọn khi C# là ranh giới sản phẩm
QuestPDF xứng đáng được so sánh một cách tôn trọng. Đây là một PDF generation thư viện hiện đại cho C# kỹ sư, có fluent API, strong typing, bộ documentation rộng, Companion App để preview và debugging, cùng licensing model rõ ràng hiếm thấy trong nhóm PDF SDK.
Câu hỏi không phải là sản phẩm nào tạo được PDF. Cả hai đều làm được. Câu hỏi hữu ích hơn là ranh giới PDF nên nằm ở đâu: bên trong một .NET application sở hữu layout, bytes và lifecycle, hay thành một hạ tầng service để nhiều products và languages cùng gọi.
Hướng dẫn chọn nhanh
- Chọn QuestPDF khi C# là document nguồn chuẩn, app phải chạy offline, hoặc bạn cần local operations trên PDFs có sẵn.
- Chọn gPdf khi một PDF layer phải phục vụ Node, Python, Go, .NET, jobs và regional systems qua cùng HTTP API.
- Chọn gPdf khi layout changes nên là mẫu revisions, không phải C# rebuilds và service redeploys.
Cùng nhóm tài liệu, khác mô hình sở hữu
Với QuestPDF, application sở hữu PDF generation. Đó là điểm mạnh thật sự: C# ở gần domain model, chạy và debug local, không có runtime call ra external API.
Đổi lại, nhóm của bạn cũng sở hữu phần còn lại của production surface:
- CPU và memory cho tạo PDF.
- font discovery và dự phòng trong từng triển khai environment.
- Barcode thư viện integration và print QA.
- tích hợp sẵn package và triển khai concerns cho charting hoặc custom graphics integrations.
- monitoring, retry và failure handling.
- Regional triển khai khi users hoặc warehouses phân tán toàn cầu.
- Rollouts mỗi khi document layout thay đổi.
Với gPdf, surface đó được đẩy ra ngoài. Application gửi DocumentRequest hoặc template_id + data, còn service sở hữu bộ tạo PDF, edge runtime, font, barcode primitives, PDF/A output và e-hóa đơn packaging. Cách này kém hấp dẫn nếu bạn muốn mọi chi tiết nằm trong C#, nhưng hấp dẫn hơn khi PDF generation nên là utility layer mà stack nào cũng gọi được.
Ba trade-off mà API được vận hành sẵn phải trả lời thẳng
Nhiều bài pitch “thư viện vs API” bỏ qua 3 câu hỏi đầu tiên của .NET architect. So sánh công bằng phải nói rõ.
1. Document data đi đâu. Trang này chủ yếu nói về hóa đơn, sao kê và e-hóa đơn, tức các tài liệu chứa names, addresses, tax IDs và amounts. Với QuestPDF, bytes đó được tạo trong process của bạn và không rời khỏi đó. Public gPdf API truyền dữ liệu gửi lên đến bộ tạo PDF, nhưng bộ tạo PDF là không lưu giữ: request JSON chỉ được giữ trong Cloudflare Workers V8 isolate trong lúc render (typical khoảng 4 ms), rồi được thả khi response hoàn tất. Không stored, logged, sampled hay trained on; operational logs chỉ giới hạn ở HTTP status và duration (security, DPA). EU / global data-residency selection và enterprise on-prem / triển khai riêng giúp giảm hoặc đóng hẳn exposure. Dù vậy, giữ generation in-process với zero setup là lý do hợp lệ, đôi khi quyết định, khiến nhóm finance hoặc khu vực công chọn QuestPDF.
2. Chế độ lỗi. Thư viện không có third party để down; generation chỉ fail trên hạ tầng bạn đã sở hữu. API được vận hành sẵn thêm availability dependency ngoài tầm kiểm soát trực tiếp. Cách đúng để dùng gPdf là coi render calls như mọi external call khác: timeout, retry, hàng đợi và tốt nhất có degraded-mode dự phòng. Nếu tạo tài liệu nằm trên luồng synchronous critical, hãy cân nhắc giữa tự vận hành và phụ thuộc vào vendor uptime.
3. Độ trễ profile. In-process generation là function call không có network. Hosted call là network round-trip. Với lô và async jobs, điều này thường không đáng kể. Với trải nghiệm user click và PDF phải hiện ngay, in-process nhanh hơn về cấu trúc. Edge PoPs của gPdf làm hop ngắn hơn, nhưng vẫn còn TLS plus round-trip; QuestPDF chỉ là method call.
Những điểm này không làm gPdf thành lựa chọn sai. Chúng định nghĩa khi nào gPdf là lựa chọn đúng: document data có thể rời process, flow chịu được network hop, và nhóm muốn phụ thuộc vào vendor uptime hơn là tự vận hành render fleet.
Model license và giá
Public licensing page của QuestPDF nói commercial license chỉ cần cho companies có annual gross revenue trên USD 1 triệu. Community tier miễn phí theo MIT terms cho eligible individuals, open-source projects, non-profits và companies dưới revenue threshold đó. Cùng public page liệt kê 2 perpetual commercial tiers: Professional giá USD 999 plus local tax cho nhóm tối đa 10 kỹ sư, và Enterprise giá USD 2,999 plus local tax cho toàn tổ chức, không đếm kỹ sư. Cả hai gồm 1 năm updates, unlimited projects, servers và deployments; license không hết hạn cho version cuối cùng đã nhận.
Enforcement model cũng rất nhẹ. license được set bằng một dòng: QuestPDF.Settings.License = LicenseType.Community;. Không license key, không activation server, và theo configuration page của QuestPDF, không network calls hay data rời khỏi machine. Đây là honor-system model: bạn tự chọn tier phù hợp. Không có vendor bill theo từng document, và paid license chạy ở mọi nơi, kể cả fully offline.
gPdf định giá trực tiếp tạo PDF service. Gói Basic công khai bắt đầu ở 5 USD/tháng cho 100.000 trang, overage từ 0,00005 USD mỗi trang. Đó là vendor bill, nhưng nó cũng loại bỏ project riêng để vận hành PDF generation: không render cluster, không NuGet deployment path, không regional warm pool, không font package theo từng app, và không PDF service cần patch.
Vì vậy cost comparison không phải là “USD 999 vs USD 5”. license chỉ là một dòng nhỏ. So sánh thật sự là:
QuestPDF total = license (one-time) + your hosting + your engineer-time + on-call
gPdf total = page bill (infrastructure, fonts, scaling, and edge included)
Theo public per-page math, gPdf overage là USD 0.05 cho 1 nghìn pages (USD 50 cho 1 triệu, USD 500 cho 10 triệu). One-time USD 2,999 Enterprise license chỉ break even với riêng page bill đó quanh mốc 60 triệu pages, và con số này bỏ qua hosting cùng engineer-months của QuestPDF. Trừ khi bạn đã có render hạ tầng rất rẻ, crossover thực tế thường nghiêng xa hơn về gPdf. Quy tắc thực dụng: nếu bạn phải build và staff dịch vụ tạo PDF chỉ để dùng thư viện, gPdf thường thắng về total cost rất lâu trước khi per-page bill bắt kịp license; nếu hạ tầng đó đã có và gần như miễn phí, perpetual license thắng khi scale.
Quy trình phát triển: Fluent C# vs templates
Fluent API của QuestPDF phù hợp khi kỹ sư sở hữu document shape. Strong typing, method chains, reusable C# components, IDE refactors và Companion App đều hợp lý khi PDF là một phần của application codebase.
gPdf hợp với quy trình khác. kỹ sư vẫn có thể author JSON trực tiếp, nhưng production systems thường dịch chuyển về mẫu. Designer, người vận hành hoặc engineer chỉnh layout trong gPdf Studio. Layout đã duyệt trở thành mẫu, còn backend tiếp tục render bằng template_id + data.
Khác biệt này quan trọng khi document thay đổi thường xuyên. Nếu carrier nhãn, hóa đơn, packing slip hoặc sao kê layout thay đổi, gPdf có thể giữ runtime ổn định và chỉ chuyển mẫu. Với QuestPDF, layout là C# code, nên đường đi bình thường là code change, test, build, triển khai và rollback plan.
Không quy trình nào luôn tốt hơn. QuestPDF tối ưu cho C# kỹ sư muốn document as code; gPdf tối ưu cho operational mẫu dùng chung giữa systems.
Compliance: cả hai sản phẩm đều nghiêm túc
Đây không phải so sánh kiểu gPdf thắng vì nói competitor thiếu tuân thủ features. Tài liệu công khai hiện tại của QuestPDF liệt kê standards support mạnh, gồm PDF/A, PDF/UA-1 và EN 16931 e-invoicing qua ví dụ ZUGFeRD 2.1 / Factur-X dựa trên UN/CEFACT Cross Industry hóa đơn (CII) standard. Ví dụ đó set PdfA = true, embed factur-x.xml dữ liệu gửi lên bằng AddAttachment(), mở rộng document với XMP siêu dữ liệu và validate kết quả bằng veraPDF (cho PDF/A-3b) cùng Mustang Project (cho ZUGFeRD). Đó là recipe đầy đủ, trung thực, và pipeline của bạn sở hữu từng bước.
gPdf package cùng standards đó thành hợp đồng API. JSON Render expose 6 PDF/A profiles (1b, 2b, 3b, 4, 2u, 3u) plus PDF/UA-1 qua settings.profile; mẫu Render dùng lại cùng document model; E-hóa đơn Render expose dedicated POST /api/v1/e-invoice/render endpoint để tạo Factur-X / ZUGFeRD PDF/A-3b packages có embedded EN 16931 CII XML. Khác biệt với QuestPDF recipe là service làm gì thay bạn: gPdf chạy PDF/A-3b và e-hóa đơn validation server-side, hỗ trợ synchronous inline hoặc polled object delivery, và cung cấp EU hoặc global nơi lưu trú dữ liệu dưới dạng request settings thay vì các bước bạn phải tự lắp và vận hành. QuestPDF hợp khi validation phải sống trong .NET pipeline của bạn; gPdf hợp khi nó nên là hosted contract dùng chung cho nhiều systems.
font và barcodes: so sánh thật sự là công sức tích hợp
QuestPDF có font model tốt. Nó bundle Lato 2.015 theo default, auto-load system và triển khai-directory font, cho phép register custom font qua FontManager, và hỗ trợ dự phòng chains. Điều này trao quyền kiểm soát cho kỹ sư. Nhưng cùng documentation cũng nói thẳng điểm khó: “in most cloud deployments, few or no font are available, which may lead to unexpected results,” và khuyên disabling environment font rồi explicitly registering những font cần dùng. Nói cách khác, trên container hoặc serverless target, font environment là thứ bạn phải plan, ship và test. Missing glyph có thể thành placeholder character, hoặc nếu bật CheckIfAllTextGlyphsAreAvailable, thành thrown exception.
gPdf đưa font vào ranh giới service. Bộ tạo PDF bundle multi-script set: Latin, Greek, Cyrillic, Arabic, Hebrew, Bengali, Tamil, Thai, Vietnamese, monospace và CJK có dự phòng theo script sang Noto KR / JP / SC. Silent font choices được xử lý bằng implicit auto selection, còn lựa chọn rõ ràng dùng prefer hoặc strict. Callers không ship CJK font, không register Noto assets trong .NET app, cũng không tune dự phòng theo từng triển khai target. Họ gửi data; bộ tạo PDF sở hữu font environment giống nhau ở mọi region.
Barcode comparison cũng có cùng hình dạng. Barcode tài liệu của QuestPDF đưa ra cách làm chắc chắn với ZXing.Net render thành vector SVG, và nói rõ ZXing.Net không nằm trong QuestPDF package. Bạn phải install từ NuGet và wire vào:
// 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.
Với gPdf, barcode generation là first-class schema element. request khai báo format, content, physical size và optional human-readable line. GS1 formats là tích hợp sẵn, nên Application Identifiers đi thẳng vào 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" }
}
Với một .NET app, install ZXing.Net rồi test output có thể đơn giản. Với nhiều services và mẫu, nhất là logistics và retail workload cần GS1-128, SSCC, GTIN, GS1 DataMatrix hoặc GS1 QR kèm human-readable interpretation line, đẩy barcode behavior vào document API dễ bảo trì hơn việc lặp lại cùng ZXing wiring trong từng service.
QuestPDF thắng rõ ở đâu
Ngoài việc chạy offline và giữ document data trong perimeter của bạn như đã nói ở trên, QuestPDF cũng rất mạnh khi chính PDF code là một phần của product và nhóm cần inspect, extend hoặc own đường tạo PDF đó. Nó còn có 2 capability areas nằm ngoài phạm vi của gPdf:
- vận hành trên PDFs có sẵn. QuestPDF có thể load existing files rồi merge, select / reorder / reverse / filter pages, apply overlays, add attachments, set XMP siêu dữ liệu, linearize cho web delivery, và cả encrypt lẫn decrypt với 40/128/256-bit security. gPdf có thể password-protect và permission-gate PDFs do nó tạo, nhưng không open, merge hoặc decrypt files mà nó không tạo.
- Charts, maps và custom graphics. QuestPDF tích hợp charting libraries (ScottPlot, LiveCharts, Microcharts), Mapbox maps và SkiaSharp canvas cho arbitrary 2D drawing. gPdf có thể vẽ vector art bằng
pathelement (SVG path data) hoặc embed SVG / PNG chart tạo upstream, nhưng không có built-in charting engine, maps hay canvas. Nếu data-driven charting là trung tâm của document, tooling đó nằm ở QuestPDF.
gPdf thắng rõ ở đâu
gPdf thắng khi organization không muốn mỗi nhóm sản phẩm tự sở hữu một PDF service: polyglot stacks, global workflows và ERP / OMS / WMS / ecommerce / fintech / ticketing systems render documents từ structured data, với mẫu thay đổi độc lập với code. Trong môi trường đó, local thư viện ban đầu có vẻ rẻ nhưng dễ thành fleet: một service cho mỗi language, một deployment path cho mỗi region, một font plan cho mỗi container, một bộ barcode regressions cho mỗi nhóm. gPdf biến fleet đó thành một HTTP contract.
Serverless làm ranh giới này rõ nhất. Trên AWS Lambda, Cloud Run hoặc Azure Functions, QuestPDF vẫn chạy bên trong application. Nhóm của bạn phải package .NET runtime, font, tích hợp sẵn dependencies và đủ CPU / memory cho peak PDF work, đồng thời sở hữu cold starts. gPdf đã là dịch vụ tạo PDF: function POST một request nhỏ template_id + data đến edge và nhận PDF bytes về, không có bộ tạo PDF cần warm hay per-region worker cần scale.
Hình dạng chuyển đổi
Chuyển đổi từ QuestPDF sang gPdf không phải line-for-line rewrite. Đó là thay đổi ranh giới: C# code dựng PDF trở thành JSON document request hoặc published mẫu.
Before / after — document-build call trong C# thu lại thành một HTTP POST (bấm để mở)
- // 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();
Khi ranh giới đã chuyển, layout changes có thể trở thành mẫu revisions thay vì application deployments. Application vẫn sở hữu business data và workflow decisions; gPdf sở hữu tạo PDF.
Ghi chú về giá và nguồn
Thông tin QuestPDF trên trang này được kiểm tra ngày 2026-06-02 theo official QuestPDF sources: License and Pricing, License configuration, Features Overview, Companion App features, Barcodes, Font management và ZUGFeRD example. Giá và trang tính năng có thể thay đổi; bộ phận mua sắm nên re-check vendor page trước khi quyết định mua. QuestPDF và related marks thuộc về chủ sở hữu tương ứng; comparison này không được họ chứng thực.
Các tình huống PDF generation liên quan
Nếu bạn đang so sánh QuestPDF và gPdf, hãy xem thêm .NET-friendly JSON to PDF API, invoice PDF generation, shipping label PDF API, GS1 barcode API, PDF/A API, ZUGFeRD API và Factur-X API. QuestPDF mạnh khi C# và local process là ranh giới đúng; gPdf hợp hơn khi nhiều ngôn ngữ cần dùng chung một render layer.
FAQ
gPdf có thay thế QuestPDF không?
Không. gPdf thay thế nhu cầu tự vận hành PDF generation service cho structured tài liệu nghiệp vụ. QuestPDF vẫn là local C# thư viện mạnh khi PDF nên được tạo bên trong application.
QuestPDF có miễn phí không?
Public licensing page của QuestPDF nói Community tier miễn phí theo MIT terms cho eligible individuals, open-source projects, non-profits và companies có annual gross revenue dưới USD 1 triệu. Companies vượt threshold đó cần perpetual commercial license: Professional USD 999 plus local tax cho tối đa 10 kỹ sư, hoặc Enterprise USD 2,999 plus local tax cho toàn tổ chức, mỗi license gồm 1 năm updates.
gPdf có tạo charts hoặc maps như QuestPDF không?
Không như một built-in engine. QuestPDF tích hợp charting libraries (ScottPlot, LiveCharts, Microcharts), Mapbox maps và SkiaSharp canvas render ngay trong document. gPdf vẫn có thể vẽ vector charts bằng path element (nhận SVG path data) và shapes, hoặc embed SVG / PNG do bất kỳ charting thư viện nào tạo dưới dạng image. Khác biệt là QuestPDF tính toán và render chart in-process, còn với gPdf bạn tạo chart art rồi gPdf đặt nó vào tài liệu. Nếu data-driven charting hoặc maps là trọng tâm của document, QuestPDF phù hợp hơn.
Sản phẩm nào rẻ hơn?
Tùy ranh giới. QuestPDF có thể rẻ hơn cho nhóm .NET đủ điều kiện Community terms hoặc đã vận hành render hạ tầng. gPdf có thể rẻ hơn khi lựa chọn thay thế là build, host và bảo trì PDF service qua nhiều products hoặc regions.
gPdf có lưu hoặc log document data của tôi không?
Không. JSON bạn gửi và PDF gPdf trả về không được lưu. Mỗi request render trong một Cloudflare Workers V8 isolate, chỉ giữ trong memory khi render, thường khoảng 4 ms, rồi được thả khi response stream hoàn tất. gPdf không retain, log, sample hay train trên DocumentRequest content. Operational logs chỉ giữ HTTP status và duration trong 30 ngày, không có request bodies. Xem security policy, privacy policy và DPA. Với workload không thể truyền data ra ngoài, on-prem / triển khai riêng giữ nó trong perimeter của bạn.
QuestPDF có chạy được khi không có internet access không?
Có. license configuration page của QuestPDF nói không có license key hay activation server, và computations được thực hiện local. Đây là một trong những lý do rõ nhất để chọn QuestPDF.
gPdf có render được bất kỳ C# QuestPDF layout nào không?
Không. gPdf không execute C# layout code. chuyển đổi nghĩa là chuyển document shape thành gPdf JSON request hoặc saved gPdf mẫu.