Comparisons

gPdf vs QuestPDF for .NET document generation

QuestPDF is an excellent C# PDF library. gPdf is a hosted edge API. Compare licensing, runtime ownership, template workflow, compliance, barcodes, and when each product is the better fit.

TL;DR

Pick the product that matches your trust boundary. QuestPDF keeps document generation, and the data inside each document, inside your .NET process — in exchange for owning fonts, barcodes, scaling, and compliance plumbing. gPdf turns generation into one HTTP call any language can make — in exchange for sending document data to a third-party renderer and depending on its uptime. A .NET app that values local control, data privacy, and offline operation usually picks QuestPDF; polyglot teams that want edge-hosted PDF infrastructure with per-page pricing usually pick gPdf.

Side by side

Axis gPdf QuestPDF Edge
Product boundary
The right choice depends on whether you want to buy a service or own the rendering code path.
Hosted edge API for JSON Render, Template Render, and E-Invoice Render. Local C# / .NET library installed from NuGet and called from application code. Even
Primary integration HTTPS POST from Node, Python, Go, .NET, Ruby, PHP, Java, workers, jobs, or frontend proxies. Fluent C# API with strong typing, IDE support, and familiar .NET constructs. Even
Runtime placement Cloudflare Workers edge renderer; no PDF service, font setup, or deployment cluster in your stack. Runs wherever your .NET app runs; your team owns CPU, memory, native/package dependencies, deployment, monitoring, and scale. gPdf
Barcode workflow Native `barcode` element covering 1D, 2D, and GS1 formats (`gs1128`, `sscc`, `gtin8/12/13/14`, `gs1datamatrix`, `gs1qrcode`, Aztec, PDF417, MaxiCode) with built-in human-readable text placement. Official docs integrate ZXing.Net — installed separately from NuGet and rendered to SVG; GS1 Application Identifiers and FNC1 framing are hand-wired. gPdf
Fonts and multilingual text Service-owned bundled fonts with implicit auto selection, explicit `prefer` / `strict` modes, and per-script CJK fallback (KR, JP, SC); callers package no font files into any application. Ships Lato and can load environment, deployment-directory, and custom fonts with fallback chains — but its own docs warn that 'in most cloud deployments, few or no fonts are available.' gPdf
Password & permissions at generation
QuestPDF supports the same encryption strengths and user / owner passwords, but as a post-generation step on the rendered file rather than inline at render time.
Set inline in the render request — `settings.security` applies AES-128/256 encryption, open and owner passwords, and eight permission flags in the same `/api/v1/pdf/render` call. Generated first, then encrypted in a separate Document Operation — `DocumentOperation.LoadFile(...).Encrypt(new Encryption256Bit { ... }).Save(...)`. gPdf
Template iteration gPdf Studio designs the same JSON templates production renders through `template_id + data`. QuestPDF Companion provides hot-reload preview, hierarchy inspection, coordinate tools, and source navigation for C# documents. Even
Commercial pricing
QuestPDF pricing was checked against public licensing pages on 2026-06-02. High-volume .NET teams should compare license + hosting against gPdf page pricing.
$5/month Basic includes 100K pages; overage from $0.00005/page, with the same published per-page math on every surface. Free under Community MIT terms below $1M USD annual revenue; perpetual commercial licenses list Professional at $999 (up to 10 developers) and Enterprise at $2,999 (organization-wide, no developer counting), plus local tax, each with one year of updates. Even
Server and deployment fees No server fleet to deploy for the public API; usage is billed by plan and pages. Commercial license terms advertise unlimited projects, servers, and deployments; infrastructure remains customer-owned. Even
PDF/A and e-invoice Six PDF/A profiles (1b/2b/3b/4/2u/3u) plus PDF/UA-1, and a hosted Factur-X / ZUGFeRD endpoint with EN 16931 CII XML in PDF/A-3b, server-side validation, and EU / global data residency. Strong PDF/A, PDF/UA-1, and ZUGFeRD 2.1 / Factur-X support in code; you wire veraPDF and Mustang validation yourself. Even
Where document data goes
QuestPDF keeps data in-process; gPdf transmits but retains nothing — operational logs hold HTTP status and duration only, never request bodies.
Public API transmits the payload, but the renderer is zero-retention — request JSON lives in a Cloudflare Workers isolate only for the render (~4 ms typical), never stored, logged, or trained on. EU / global data residency and on-prem / private deployment narrow or close the exposure further. Bytes are produced in-process; document data never crosses your trust boundary to a third party. Even
Offline / air-gapped operation
QuestPDF runs offline with zero setup; gPdf reaches the same place through an enterprise private deployment.
Public API requires network access; enterprise on-prem / private deployment runs the renderer inside your own infrastructure for offline or air-gapped operation. Runs locally with no license key, no activation server, and no runtime network calls — the license type is set in one line of code on an honor-system basis. Even
Existing PDF operations Generates new PDFs from structured requests; does not load, merge, decrypt, or edit existing files. Document Operations on existing PDFs: merge, page reorder / reverse / filter, overlays, 40/128/256-bit encrypt and decrypt, attachments, XMP metadata, and web linearization. QuestPDF
Charts and data visualization
Both rely on a charting library to turn data into a plot; QuestPDF renders it in-document, gPdf renders the SVG / PNG you produce. QuestPDF leads on built-in charting, maps, and canvas.
Draws vector art via the `path` element (SVG path data) and shapes, or embeds an SVG / PNG chart produced by any charting library — but has no built-in charting engine, maps, or canvas API. First-class chart integrations (ScottPlot, LiveCharts, Microcharts), Mapbox maps, and a SkiaSharp canvas API for custom graphics. QuestPDF
Best default use case Production business documents shared across teams: labels, invoices, receipts, statements, tickets, and e-invoices. C# applications that want local document generation with full code ownership and no runtime service dependency. Even

When to pick which

Pick gPdf when
  • PDF generation is infrastructure shared by several services or languages, not a feature owned by one .NET application.
  • You want to remove PDF rendering, font management, barcode geometry, and regional scaling from your application stack.
  • Your team wants templates to change as `template_id + data` rather than C# code deployments.
  • You need edge rendering near warehouses, customers, or backend jobs without deploying a .NET PDF service in every region.
  • You prefer a published per-page price and no commercial license procurement before the first production render.
Pick QuestPDF when
  • Your product is .NET-first and C# code is the natural source of truth for document layout.
  • Document data must stay inside your perimeter, and an enterprise private gPdf deployment is not on the table.
  • You need offline or air-gapped generation out of the box, without setting up a private render deployment.
  • Generation sits on a latency-critical synchronous path where an in-process call beats any network round-trip.
  • You need document operations on existing PDFs — merge, page extraction, overlays, decryption, or attachments — inside the same library.
  • You render charts, maps, or custom SkiaSharp graphics inside the document (ScottPlot, LiveCharts, Microcharts, Mapbox).
  • You are eligible for the Community MIT terms, or want a one-time perpetual license, and operating the renderer locally is not a burden.
Capabilities

gPdf is an edge-native JSON-to-PDF API built for high-volume invoices, documents, shipping labels, barcodes, PDF/A, and e-invoices. Millisecond-class PDF rendering at global edge scale — optimized for predictable, industrial-grade document generation. Infrastructure-level pricing, low enough to replace building and operating your own PDF infrastructure.

Capabilities

QuestPDF is excellent when C# is the product boundary

QuestPDF deserves a respectful comparison. It is a modern PDF generation library for C# developers, with a fluent API, strong typing, a large documentation surface, a Companion App for preview and debugging, and a licensing model that is unusually clear for a PDF SDK.

The product question is not “which one can create a PDF?” Both can. The useful question is where the PDF boundary should live: inside a .NET application that owns the layout, bytes, and lifecycle, or as an infrastructure service that multiple products and languages call.

Quick decision guide

  • Pick QuestPDF when C# is the document source of truth, the app must run offline, or you need local operations on existing PDFs.
  • Pick gPdf when one PDF layer should serve Node, Python, Go, .NET, jobs, and regional systems through the same HTTP API.
  • Pick gPdf when layout changes should be template revisions, not C# rebuilds and service redeploys.

Same document family, different ownership model

With QuestPDF the application owns PDF generation — a real strength: C# kept near your domain model, run and debugged locally, with no runtime call to an external API.

The trade-off is that your team also owns the rest of the production surface:

  • CPU and memory for rendering.
  • Font discovery and fallback in each deployment environment.
  • Barcode library integration and print QA.
  • Native package and deployment concerns for charting or custom graphics integrations.
  • Monitoring, retries, and failure handling.
  • Regional deployment when users or warehouses are global.
  • Rollouts whenever the document layout changes.

With gPdf, that surface moves outward: the application sends a DocumentRequest or template_id + data, and the service owns the renderer, edge runtime, fonts, barcode primitives, PDF/A output, and e-invoice packaging — less attractive if you want every detail in C#, more attractive if PDF generation should be a utility layer callable from any stack.

Three trade-offs a hosted API has to answer honestly

Most “library vs API” pitches skip the three questions a .NET architect asks first. A fair comparison answers them out loud.

1. Where the document data goes. This page is largely about invoices, statements, and e-invoices — documents full of names, addresses, tax IDs, and amounts. With QuestPDF those bytes are built inside your process and never leave. The public gPdf API transmits the payload to the renderer, but the renderer is zero-retention: the request JSON is held in a Cloudflare Workers V8 isolate only for the render (~4 ms typical) and released when the response completes — never stored, logged, sampled, or trained on, with operational logs limited to HTTP status and duration (security, DPA). EU / global data-residency selection and enterprise on-prem / private deployment narrow or close the exposure further. Even so, keeping generation in-process with zero setup is a legitimate — sometimes decisive — reason a finance or public-sector team picks QuestPDF.

2. The failure mode. A library has no third party that can go down; generation can only fail on infrastructure you already own. A hosted API adds an availability dependency you do not control. The right way to adopt gPdf is to treat render calls like any other external call — timeout, retry, queue, and ideally a degraded-mode fallback. If document generation sits on a critical synchronous path, weigh “operate it yourself” against “depend on a vendor’s uptime.”

3. The latency profile. In-process generation is a function call with no network. A hosted call is a network round-trip. For batch and async jobs this is noise. For “user clicks, the PDF must appear now,” in-process is structurally faster — gPdf’s edge PoPs make the hop small, but it is still TLS plus a round-trip, where QuestPDF’s is a method call.

None of these makes gPdf the wrong choice; they define when it is the right one — for teams whose document data can leave the process, whose flows tolerate a network hop, and who would rather depend on a vendor’s uptime than operate a render fleet themselves.

Licensing and price model

QuestPDF’s public licensing page says a commercial license is required only for companies above $1M USD in annual gross revenue. The Community tier is free for eligible individuals, open-source projects, non-profits, and companies below that revenue threshold, under MIT terms. The same public page lists two perpetual commercial tiers: Professional at $999 plus local tax for teams of up to 10 developers, and Enterprise at $2,999 plus local tax covering an entire organization with no developer counting. Both include one year of updates and unlimited projects, servers, and deployments, and the license never expires for the last version received.

The enforcement model is also unusually light. The license is set with a single line — QuestPDF.Settings.License = LicenseType.Community; — with no license key, no activation server, and, per QuestPDF’s own configuration page, no network calls and no data leaving the machine. It is an honor-system model: you select the tier you are eligible for. There is no per-document vendor bill, and a paid license runs anywhere, including fully offline.

gPdf prices the rendering service directly. The public Basic plan starts at $5/month for 100K pages, with overage starting at $0.00005/page. That is a vendor bill, but it also removes the separate project of operating PDF generation: no render cluster, no NuGet deployment path, no regional warm pool, no font package per app, and no PDF service to patch.

So the cost comparison is not “$999 vs $5” — the license is the small line. The real comparison is:

QuestPDF total = license (one-time) + your hosting + your engineer-time + on-call
gPdf total     = page bill (infrastructure, fonts, scaling, and edge included)

At the public per-page math, gPdf overage is $0.05 per 1,000 pages ($50 per 1M, $500 per 10M). A one-time $2,999 Enterprise license only breaks even against that bill near ~60M pages — and that figure ignores QuestPDF’s hosting and engineer-months, which push the real crossover much further in gPdf’s favour unless you already run the render infrastructure cheaply. The rule of thumb: if you would have to build and staff a render service just to use the library, gPdf usually wins on total cost long before the per-page bill catches the license; if that infrastructure already exists and is nearly free to you, the perpetual license wins at scale.

Development workflow: Fluent C# vs templates

QuestPDF’s fluent API is a good fit when developers own the document shape. Strong typing, method chains, reusable C# components, IDE refactors, and the Companion App all make sense when the PDF is part of the application codebase.

gPdf fits a different workflow. Developers can still author JSON directly, but production systems usually move toward templates. A designer, operator, or engineer adjusts layout in gPdf Studio. The approved layout becomes a template, and the backend keeps rendering with template_id + data.

That difference matters when the document changes often. If a carrier label, invoice, packing slip, or statement layout changes, gPdf can keep the runtime stable while only the template moves. With QuestPDF, the layout is C# code, so the normal path is a code change, test, build, deploy, and rollback plan.

Neither workflow is universally better: QuestPDF optimizes for C# developers who want the document as code; gPdf for operational templates shared across systems.

Compliance: both products are serious

This is not a comparison where gPdf wins by saying the competitor lacks compliance features. QuestPDF’s current public material lists strong standards support, including PDF/A, PDF/UA-1, and EN 16931 e-invoicing through a ZUGFeRD 2.1 / Factur-X example built on the UN/CEFACT Cross Industry Invoice (CII) standard. That example sets PdfA = true, embeds the factur-x.xml payload with AddAttachment(), extends the document with XMP metadata, and validates the result with veraPDF (for PDF/A-3b) and the Mustang Project (for ZUGFeRD). It is a complete, honest recipe — and your pipeline owns every step of it.

gPdf packages the same standards as an API contract. JSON Render exposes six PDF/A profiles (1b, 2b, 3b, 4, 2u, 3u) plus PDF/UA-1 through settings.profile, Template Render reuses the same document model, and E-Invoice Render exposes a dedicated POST /api/v1/e-invoice/render endpoint that produces Factur-X / ZUGFeRD PDF/A-3b packages with embedded EN 16931 CII XML. The difference from the QuestPDF recipe is what the service does for you: gPdf runs the PDF/A-3b and e-invoice validation server-side, supports synchronous inline or polled object delivery, and offers EU or global data residency as request settings rather than steps you assemble and operate. QuestPDF fits when that validation should live inside your own .NET pipeline; gPdf when it should be a hosted contract many systems share.

Fonts and barcodes: integration effort is the real comparison

QuestPDF has a capable font model. It ships Lato 2.015 by default, auto-loads system and deployment-directory fonts, lets you register custom fonts through FontManager, and supports fallback chains. That gives developers control. But the same documentation is candid about the catch: “in most cloud deployments, few or no fonts are available, which may lead to unexpected results,” and it recommends disabling environment fonts and explicitly registering what you need. In other words, on a container or serverless target the font environment is yours to plan, ship, and test — and a missing glyph either becomes a placeholder character or, if you enable CheckIfAllTextGlyphsAreAvailable, a thrown exception.

gPdf makes fonts part of the service boundary. The renderer bundles a multi-script set — Latin, Greek, Cyrillic, Arabic, Hebrew, Bengali, Tamil, Thai, Vietnamese, monospace, and CJK with per-script fallback to Noto KR / JP / SC. It resolves silent font choices through implicit auto selection, and explicit choices through prefer or strict. Callers do not ship a CJK font, register Noto assets in a .NET app, or tune fallback per deployment target. They send data; the renderer owns the font environment, the same in every region.

The barcode comparison has a similar shape. QuestPDF’s barcode docs show a solid approach using ZXing.Net rendered as vector SVG, and they explicitly note that ZXing.Net is not included in the QuestPDF package — you install it from NuGet and wire it in:

// 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.

With gPdf, barcode generation is a first-class schema element. The request declares the format, content, physical size, and an optional human-readable line — and GS1 formats are native, so Application Identifiers go straight into 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" }
}

For one .NET app, installing ZXing.Net and testing the output may be easy. For many services and templates — especially logistics and retail workloads that need GS1-128, SSCC, GTIN, GS1 DataMatrix, or GS1 QR with the human-readable interpretation line — pushing barcode behavior into the document API is simpler to maintain than re-implementing the same ZXing wiring in every service.

Where QuestPDF clearly wins

Beyond running offline and keeping document data inside your perimeter (covered above), and when the PDF code itself is part of the product — a team that needs to inspect, extend, or own the rendering path — QuestPDF holds two capability areas squarely outside gPdf’s scope:

  • Operations on existing PDFs. QuestPDF can load existing files and merge them, select / reorder / reverse / filter pages, apply overlays, add attachments, set XMP metadata, linearize for web delivery, and both encrypt and decrypt with 40/128/256-bit security. gPdf can password-protect and permission-gate the PDFs it generates, but it does not open, merge, or decrypt files it did not create.
  • Charts, maps, and custom graphics. QuestPDF integrates charting libraries (ScottPlot, LiveCharts, Microcharts), embeds Mapbox maps, and exposes a SkiaSharp canvas for arbitrary 2D drawing. gPdf can draw vector art with the path element (SVG path data) or embed an SVG / PNG chart produced upstream, but it has no built-in charting engine, maps, or canvas — so if data-driven charting is central, that tooling lives with QuestPDF.

Where gPdf clearly wins

gPdf wins when an organization does not want every product team to own its own PDF service — polyglot stacks, global workflows, and ERP / OMS / WMS / ecommerce / fintech / ticketing systems rendering documents from structured data, with templates that change independently of code. In those environments a local library often starts cheap and becomes a fleet: one service per language, one deployment path per region, one font plan per container, one set of barcode regressions per team. gPdf turns that fleet into one HTTP contract.

Serverless makes the boundary clearest. On AWS Lambda, Cloud Run, or Azure Functions, QuestPDF still runs inside the application — your team packages the .NET runtime, fonts, native dependencies, and enough CPU / memory for peak PDF work, and owns the cold starts. gPdf is already the render service: the function POSTs a small template_id + data request to the edge and gets PDF bytes back, with no renderer to warm or per-region worker to scale.

Migration shape

The migration from QuestPDF to gPdf is not a line-for-line rewrite. It is a boundary change: the C# code that builds the PDF becomes either a JSON document request or a published template.

Before / after — the C# document-build call collapses to one HTTP POST (click to expand)
- // 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();

After that boundary moves, layout changes can become template revisions instead of application deployments. The application still owns business data and workflow decisions; gPdf owns rendering.

Pricing and sourcing note

QuestPDF information on this page was checked on 2026-06-02 against official QuestPDF sources: License and Pricing, License configuration, Features Overview, Companion App features, Barcodes, Font management, and ZUGFeRD example. Pricing and feature pages can change; procurement teams should re-check the vendor page before making a buying decision. QuestPDF and related marks belong to their respective owners, and this comparison is not endorsed by them.

Teams comparing QuestPDF and gPdf often search for QuestPDF alternatives, QuestPDF commercial license cost, .NET PDF generation API, C# invoice PDF generation, hosted PDF API for .NET, JSON to PDF API, PDF/A API, ZUGFeRD API, Factur-X API, GS1-128 barcode API, barcode PDF generation, QuestPDF cloud fonts, shipping label PDF API, and PDF generation without operating a render service.

FAQ

Does gPdf replace QuestPDF?

No. gPdf replaces the need to operate a PDF generation service for structured business documents. QuestPDF remains a strong local C# library when the PDF should be generated inside the application.

Is QuestPDF free?

QuestPDF’s public licensing page says the Community tier is free under MIT terms for eligible individuals, open-source projects, non-profits, and companies under $1M USD annual gross revenue. Companies above that threshold need a perpetual commercial license: Professional at $999 plus local tax for up to 10 developers, or Enterprise at $2,999 plus local tax organization-wide, each including one year of updates.

Can gPdf generate charts or maps like QuestPDF?

Not as a built-in engine. QuestPDF integrates charting libraries (ScottPlot, LiveCharts, Microcharts), Mapbox maps, and a SkiaSharp canvas that render in-document. gPdf can still draw vector charts with the path element (which accepts SVG path data) and shapes, or embed an SVG / PNG produced by any charting library as an image. The difference is that QuestPDF computes and renders the chart in-process, whereas with gPdf you produce the chart art and gPdf places it. If data-driven charting or maps are central to the document, QuestPDF is the better fit.

Which product is cheaper?

It depends on the boundary. QuestPDF can be cheaper for .NET teams that are eligible for Community terms or that already operate the render infrastructure. gPdf can be cheaper when the alternative is building, hosting, and maintaining a PDF service across products or regions.

Does gPdf store or log my document data?

No. The JSON you send and the PDF gPdf returns are not stored. Each request renders inside a single Cloudflare Workers V8 isolate, held in memory only for the render — about 4 ms typically — and released when the response stream completes; gPdf does not retain, log, sample, or train on DocumentRequest content. Operational logs keep only HTTP status and duration for 30 days and contain no request bodies. See the security policy, privacy policy, and DPA. For workloads that cannot transmit data at all, on-prem / private deployment keeps it inside your perimeter.

Can QuestPDF run without internet access?

Yes. QuestPDF’s license configuration page says there is no license key or activation server, and computations are performed locally. That is one of the clearest reasons to pick QuestPDF.

Can gPdf render arbitrary C# QuestPDF layouts?

No. gPdf does not execute C# layout code. A migration means converting the document shape into a gPdf JSON request or a saved gPdf template.