QuestPDF é excelente quando C# é a fronteira do produto
QuestPDF merece uma comparação respeitosa. É uma biblioteca moderna de geração de PDF para desenvolvedores C#, com API fluente, tipagem forte, documentação ampla, Companion App para prévia e depuração, e um modelo de licenciamento incomumente claro para um SDK PDF.
A pergunta de produto não é “qual deles cria um PDF?”. Ambos criam. A pergunta útil é onde a fronteira do PDF deve morar: dentro de uma aplicação .NET que possui diagramação, bytes e ciclo de vida, ou como um serviço de infraestrutura chamado por vários produtos e linguagens.
Guia rápido de decisão
- Escolha QuestPDF quando C# for a fonte de referência do documento, a aplicação precisar rodar offline ou você precisar de operações locais em PDFs existentes.
- Escolha gPdf quando uma única camada PDF deve atender Node, Python, Go, .NET, jobs e sistemas regionais pela mesma HTTP API.
- Escolha gPdf quando mudanças de diagramação devem ser revisões de modelo, não recompilações C# e reimplantações de serviço.
Mesma família de documentos, modelo de propriedade diferente
Com QuestPDF, a aplicação é responsável pela geração de PDF. É uma força real: C# fica perto do seu modelo de domínio, roda e depura localmente, sem chamada em tempo de execução para uma API externa.
A contrapartida é que sua equipe também assume o restante da superfície de produção:
- CPU e memória para renderização.
- Descoberta de fontes e substituição em cada ambiente de implantação.
- Integração de biblioteca de código de barras e QA de impressão.
- Pacotes nativos e preocupações de implantação para gráficos ou integrações visuais personalizadas.
- Monitoramento, retentativas e tratamento de falhas.
- Implantação regional quando usuários ou armazéns são globais.
- Lançamentos de versão sempre que a diagramação do documento muda.
Com gPdf, essa superfície se move para fora: a aplicação envia um DocumentRequest ou template_id + data, e o serviço assume o gerador, o ambiente no edge, as fontes, as primitivas de código de barras, a saída PDF/A e o empacotamento de fatura eletrônica. É menos atraente se você quer cada detalhe em C#; mais atraente se a geração de PDF deve ser uma camada utilitária chamável por qualquer pilha.
Três trade-offs que uma API hospedada precisa responder honestamente
A maioria dos argumentos “biblioteca vs API” pula as três perguntas que um arquiteto .NET faz primeiro. Uma comparação justa responde a elas em voz alta.
1. Para onde vão os dados do documento. Esta página fala principalmente de faturas, extratos e faturas eletrônicas: documentos cheios de nomes, endereços, IDs fiscais e valores. Com QuestPDF, esses bytes são montados dentro do seu processo e nunca saem. A API pública do gPdf transmite a carga útil ao gerador, mas o gerador é sem retenção: o JSON da requisição fica em um isolate V8 do Cloudflare Workers apenas durante a geração (típico de ~4 ms) e é liberado quando a resposta termina; nunca é armazenado, registrado em logs, amostrado ou usado para treinamento, com logs operacionais limitados a status HTTP e duração (security, DPA). A seleção de residência de dados UE / global e a implantação empresarial local / privada reduzem ou fecham ainda mais a exposição. Mesmo assim, manter a geração dentro do processo sem configuração é uma razão legítima, às vezes decisiva, para uma equipe financeira ou do setor público escolher QuestPDF.
2. O modo de falha. Uma biblioteca não tem um terceiro que possa ficar indisponível; a geração só falha na infraestrutura que você já possui. Uma API hospedada adiciona uma dependência de disponibilidade que você não controla. A forma correta de adotar gPdf é tratar chamadas de geração como qualquer chamada externa: tempo limite, nova tentativa, fila e, idealmente, alternativa em modo degradado. Se a geração de documentos está em um caminho síncrono crítico, pese “operar por conta própria” contra “depender da disponibilidade de um fornecedor”.
3. O perfil de latência. Geração dentro do processo é uma chamada de função sem rede. Uma chamada hospedada é uma ida e volta de rede. Para lotes e tarefas assíncronas, isso é ruído. Para “o usuário clicou e o PDF precisa aparecer agora”, dentro do processo é estruturalmente mais rápido. Os PoPs edge do gPdf reduzem o salto, mas ainda é TLS mais uma ida e volta; no QuestPDF, é uma chamada de método.
Nada disso torna gPdf a escolha errada; isso define quando ele é a escolha certa: equipes cujos dados de documento podem sair do processo, cujos fluxos toleram um salto de rede e que preferem depender da disponibilidade de um fornecedor a operar uma frota de geração.
Licenciamento e modelo de preço
A página pública de licenciamento do QuestPDF diz que uma licença comercial só é exigida para empresas acima de 1 milhão de USD em receita bruta anual. O nível Community é gratuito, sob termos MIT, para indivíduos elegíveis, projetos open source, organizações sem fins lucrativos e empresas abaixo desse limite. A mesma página pública lista dois níveis comerciais perpétuos: Professional por 999 USD mais impostos locais para equipes de até 10 desenvolvedores, e Enterprise por 2.999 USD mais impostos locais cobrindo a organização inteira sem contar desenvolvedores. Ambos incluem um ano de atualizações e projetos, servidores e implantações ilimitados; a licença nunca expira para a última versão recebida.
O modelo de fiscalização também é incomumente leve. A licença é definida com uma única linha: QuestPDF.Settings.License = LicenseType.Community;. Não há chave de licença, servidor de ativação e, segundo a própria página de configuração do QuestPDF, não há chamadas de rede nem dados saindo da máquina. É um modelo baseado em confiança: você seleciona o nível para o qual se qualifica. Não há conta por documento do fornecedor, e uma licença paga roda em qualquer lugar, inclusive totalmente offline.
gPdf precifica diretamente o serviço de geração. O plano Basic público começa em 5 USD/mês para 100.000 páginas, com excedente a partir de 0,00005 USD por página. Isso é uma conta de fornecedor, mas também remove o projeto separado de operar geração de PDF: sem cluster de geração, sem caminho de implantação NuGet, sem pool aquecido regional, sem pacote de fontes por app e sem serviço PDF para corrigir.
Então a comparação de custo não é “999 USD vs 5 USD”; a licença é a linha pequena. A comparação real é:
QuestPDF total = licença (pagamento único) + sua hospedagem + tempo de engenharia + plantão
gPdf total = conta por página (infraestrutura, fontes, escala e edge incluídos)
Pela conta pública por página, o excedente do gPdf é 0,05 USD por 1.000 páginas (50 USD por 1 milhão, 500 USD por 10 milhões). Uma licença Enterprise única de 2.999 USD só empata com essa conta perto de ~60 milhões de páginas, e esse número ignora hospedagem e meses de engenharia do QuestPDF, que empurram o ponto real de cruzamento muito mais a favor do gPdf, a menos que você já opere a infraestrutura de geração a custo muito baixo. Regra prática: se você teria que construir e manter uma equipe para um serviço de geração apenas para usar a biblioteca, gPdf costuma ganhar em custo total muito antes de a conta por página alcançar a licença; se essa infraestrutura já existe e é quase gratuita para você, a licença perpétua vence em escala.
Fluxo de desenvolvimento: C# fluente vs modelos
A API fluente do QuestPDF encaixa bem quando desenvolvedores são responsáveis pela forma do documento. Tipagem forte, cadeias de métodos, componentes C# reutilizáveis, refatorações no IDE e Companion App fazem sentido quando o PDF faz parte do código da aplicação.
gPdf encaixa em outro fluxo. Desenvolvedores ainda podem escrever JSON diretamente, mas sistemas de produção geralmente avançam para modelos. Um designer, operador ou engenheiro ajusta a diagramação no gPdf Studio. A diagramação aprovada vira modelo, e o servidor continua gerando com template_id + data.
Essa diferença importa quando o documento muda com frequência. Se uma etiqueta de transportadora, fatura, romaneio ou extrato muda, gPdf pode manter o ambiente de execução estável enquanto apenas o modelo muda. Com QuestPDF, a diagramação é código C#, então o caminho normal é mudança de código, teste, build, implantação e plano de reversão.
Nenhum fluxo é universalmente melhor: QuestPDF otimiza para desenvolvedores C# que querem o documento como código; gPdf para modelos operacionais compartilhados entre sistemas.
Conformidade: os dois produtos são sérios
Esta não é uma comparação em que gPdf vence dizendo que o concorrente não tem recursos de conformidade. O material público atual do QuestPDF lista forte suporte a padrões, incluindo PDF/A, PDF/UA-1 e faturamento eletrônico EN 16931 por meio de um exemplo ZUGFeRD 2.1 / Factur-X baseado no padrão UN/CEFACT Cross Industry Invoice (CII). Esse exemplo define PdfA = true, embute a carga factur-x.xml com AddAttachment(), estende o documento com metadados XMP e valida o resultado com veraPDF (para PDF/A-3b) e Mustang Project (para ZUGFeRD). É uma receita completa e honesta, e seu pipeline possui cada etapa.
gPdf empacota os mesmos padrões como contrato de API. JSON Render expõe seis perfis PDF/A (1b, 2b, 3b, 4, 2u, 3u) mais PDF/UA-1 via settings.profile, Template Render reutiliza o mesmo modelo de documento, e E-Invoice Render expõe um endpoint dedicado POST /api/v1/e-invoice/render que produz pacotes Factur-X / ZUGFeRD PDF/A-3b com XML EN 16931 CII embutido. A diferença em relação à receita do QuestPDF é o que o serviço faz por você: gPdf executa a validação PDF/A-3b e de fatura eletrônica no servidor, suporta entrega síncrona inline ou por objeto consultado, e oferece residência UE ou global como configurações de requisição, não como etapas que você monta e opera. QuestPDF encaixa quando essa validação deve viver dentro do seu pipeline .NET; gPdf quando ela deve ser um contrato hospedado compartilhado por muitos sistemas.
Fontes e códigos de barras: o esforço de integração é a comparação real
QuestPDF tem um modelo de fontes competente. Ele inclui Lato 2.015 por padrão, carrega automaticamente fontes do sistema e do diretório de implantação, permite registrar fontes personalizadas via FontManager e suporta cadeias de substituição. Isso dá controle aos desenvolvedores. Mas a mesma documentação é franca sobre a pegadinha: na maioria das implantações em nuvem há poucas fontes ou nenhuma, o que pode causar resultados inesperados; ela recomenda desabilitar fontes do ambiente e registrar explicitamente o que você precisa. Em outras palavras, em contêiner ou ambiente sem servidor, o ambiente de fontes é seu para planejar, empacotar e testar; um glifo ausente vira caractere substituto ou, se você habilitar CheckIfAllTextGlyphsAreAvailable, uma exceção.
gPdf transforma fontes em parte da fronteira do serviço. O gerador empacota um conjunto multi-escrita: Latin, Greek, Cyrillic, Arabic, Hebrew, Bengali, Tamil, Thai, Vietnamese, monospace e CJK com substituição por escrita para Noto KR / JP / SC. Ele resolve escolhas silenciosas por seleção automática implícita e escolhas explícitas por prefer ou strict. Chamadores não enviam uma fonte CJK, não registram recursos Noto em um app .NET nem ajustam substituição por alvo de implantação. Eles enviam dados; o gerador possui o ambiente de fontes, igual em todas as regiões.
A comparação de código de barras segue a mesma lógica. A documentação de códigos de barras do QuestPDF mostra uma abordagem sólida usando ZXing.Net renderizado como SVG vetorial, e observa explicitamente que ZXing.Net não está incluído no pacote QuestPDF: você instala pelo NuGet e conecta:
// 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.
Com gPdf, geração de código de barras é um elemento de esquema de primeira classe. A requisição declara formato, conteúdo, tamanho físico e uma linha legível opcional; formatos GS1 são nativos, então os identificadores de aplicação entram direto em 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" }
}
Para um único app .NET, instalar ZXing.Net e testar a saída pode ser fácil. Para muitos serviços e modelos, especialmente cargas de logística e varejo que precisam de GS1-128, SSCC, GTIN, GS1 DataMatrix ou GS1 QR com linha de interpretação legível, levar o comportamento de código de barras para a API documental é mais simples de manter do que reimplementar o mesmo cabeamento ZXing em cada serviço.
Onde QuestPDF vence claramente
Além de rodar offline, manter dados do documento dentro do seu perímetro e quando o código PDF em si é parte do produto, isto é, quando uma equipe precisa inspecionar, estender ou possuir o caminho de geração, QuestPDF mantém duas áreas de capacidade claramente fora do escopo do gPdf:
- Operações em PDFs existentes. QuestPDF pode carregar arquivos existentes e mesclá-los, selecionar / reordenar / inverter / filtrar páginas, aplicar sobreposições, adicionar anexos, definir metadados XMP, linearizar para entrega web e tanto criptografar quanto descriptografar com segurança 40/128/256-bit. gPdf pode proteger por senha e controlar permissões dos PDFs que gera, mas não abre, mescla ou descriptografa arquivos que não criou.
- Gráficos, mapas e gráficos personalizados. QuestPDF integra bibliotecas de gráficos (ScottPlot, LiveCharts, Microcharts), incorpora mapas Mapbox e expõe um Canvas SkiaSharp para desenho 2D arbitrário. gPdf pode desenhar arte vetorial com o elemento
path(SVG path data) ou incorporar um gráfico SVG / PNG produzido antes, mas não tem motor de gráficos, mapas ou Canvas integrados; se visualização de dados é central, essa ferramenta vive melhor com QuestPDF.
Onde gPdf vence claramente
gPdf vence quando uma organização não quer que cada equipe de produto seja dona do próprio serviço PDF: pilhas poliglotas, fluxos globais e sistemas ERP / OMS / WMS / e-commerce / fintech / bilheteria gerando documentos a partir de dados estruturados, com modelos que mudam independentemente do código. Nesses ambientes, uma biblioteca local costuma começar barata e virar uma frota: um serviço por linguagem, um caminho de implantação por região, um plano de fontes por contêiner, um conjunto de regressões de código de barras por equipe. gPdf transforma essa frota em um contrato HTTP.
Arquitetura sem servidor deixa a fronteira mais clara. Em AWS Lambda, Cloud Run ou Azure Functions, QuestPDF ainda roda dentro da aplicação: sua equipe empacota o ambiente .NET, fontes, dependências nativas e CPU / memória suficientes para o pico de trabalho PDF, além de assumir partidas a frio. gPdf já é o serviço de geração: a função faz POST de uma pequena requisição template_id + data para o edge e recebe os bytes PDF de volta, sem gerador para aquecer ou processo regional para escalar.
Formato da migração
A migração de QuestPDF para gPdf não é uma reescrita linha por linha. É uma mudança de fronteira: o código C# que constrói o PDF vira uma requisição JSON de documento ou um modelo publicado.
Before / after — a chamada C# de construção do documento vira um único HTTP POST (clique para expandir)
- // 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();
Depois que essa fronteira muda, alterações de diagramação podem virar revisões de modelo em vez de implantações de aplicação. A aplicação ainda possui dados de negócio e decisões de fluxo; gPdf possui a geração.
Nota de preço e fontes
As informações sobre QuestPDF nesta página foram verificadas em 2026-06-02 contra fontes oficiais do QuestPDF: License and Pricing, License configuration, Features Overview, Companion App features, Barcodes, Font management e ZUGFeRD example. Páginas de preço e recursos podem mudar; equipes de compras devem conferir novamente a página do fornecedor antes de decidir. QuestPDF e marcas relacionadas pertencem aos respectivos proprietários, e esta comparação não é endossada por eles.
Cenários relacionados de geração de PDF
Se você compara QuestPDF e gPdf, avalie também quando uma API de JSON para PDF, uma API de PDF de fatura, uma API de etiquetas de envio, códigos de barras GS1-128, PDF/A ou Factur-X/ZUGFeRD devem virar uma capacidade compartilhada em vez de uma biblioteca operada dentro de cada aplicação.
FAQ
gPdf substitui QuestPDF?
Não. gPdf substitui a necessidade de operar um serviço de geração PDF para documentos de negócio estruturados. QuestPDF continua sendo uma biblioteca C# local forte quando o PDF deve ser gerado dentro da aplicação.
QuestPDF é gratuito?
A página pública de licenciamento do QuestPDF diz que o nível Community é gratuito sob termos MIT para indivíduos elegíveis, projetos open source, organizações sem fins lucrativos e empresas abaixo de 1 milhão de USD em receita bruta anual. Empresas acima desse limite precisam de uma licença comercial perpétua: Professional por 999 USD mais impostos locais para até 10 desenvolvedores, ou Enterprise por 2.999 USD mais impostos locais para toda a organização, cada uma incluindo um ano de atualizações.
gPdf consegue gerar gráficos ou mapas como o QuestPDF?
Não como motor embutido. QuestPDF integra bibliotecas de gráficos (ScottPlot, LiveCharts, Microcharts), mapas Mapbox e um Canvas SkiaSharp que renderizam dentro do documento. gPdf ainda pode desenhar gráficos vetoriais com o elemento path (que aceita SVG path data) e formas, ou incorporar um SVG / PNG produzido por qualquer biblioteca de gráficos como image. A diferença é que QuestPDF calcula e gera o gráfico dentro do processo, enquanto com gPdf você produz a arte do gráfico e gPdf a posiciona. Se visualização de dados ou mapas são centrais para o documento, QuestPDF é a melhor opção.
Qual produto é mais barato?
Depende da fronteira. QuestPDF pode ser mais barato para equipes .NET elegíveis aos termos Community ou que já operam a infraestrutura de renderização. gPdf pode ser mais barato quando a alternativa é construir, hospedar e manter um serviço PDF entre produtos ou regiões.
gPdf armazena ou registra os dados do meu documento?
Não. O JSON que você envia e o PDF que gPdf retorna não são armazenados. Cada requisição gera dentro de um único isolate V8 do Cloudflare Workers, mantida em memória apenas durante a geração, cerca de 4 ms tipicamente, e liberada quando o fluxo de resposta termina; gPdf não retém, registra, amostra nem treina com conteúdo DocumentRequest. Logs operacionais guardam apenas status HTTP e duração por 30 dias e não contêm corpos de requisição. Veja a política de segurança, política de privacidade e DPA. Para cargas que não podem transmitir dados de forma alguma, implantação local / privada mantém tudo dentro do seu perímetro.
QuestPDF pode rodar sem acesso à internet?
Sim. A página de configuração de licença do QuestPDF diz que não há chave de licença nem servidor de ativação, e que os cálculos são executados localmente. É uma das razões mais claras para escolher QuestPDF.
gPdf consegue gerar diagramações C# arbitrárias do QuestPDF?
Não. gPdf não executa código de diagramação C#. Uma migração significa converter o formato do documento em uma requisição JSON do gPdf ou em um modelo salvo no gPdf.