QuestPDF sangat kuat ketika C# adalah batas produk
QuestPDF layak dibandingkan dengan serius. Ini library pembuatan PDF modern untuk developer C#, dengan fluent API, strong typing, dokumentasi luas, Companion App untuk preview dan debugging, serta model lisensi yang tidak biasa jelasnya untuk kelas PDF SDK.
Pertanyaannya bukan “mana yang bisa membuat PDF?” Keduanya bisa. Pertanyaan yang lebih berguna adalah di mana batas PDF seharusnya berada: di dalam aplikasi .NET yang memiliki layout, byte, dan lifecycle, atau sebagai layanan infrastruktur yang dipanggil banyak produk dan bahasa.
Panduan cepat memilih
- Pilih QuestPDF ketika C# adalah sumber kebenaran dokumen, aplikasi harus berjalan offline, atau Anda perlu operasi lokal pada PDF yang sudah ada.
- Pilih gPdf ketika satu lapisan PDF harus melayani Node, Python, Go, .NET, job, dan sistem regional melalui HTTP API yang sama.
- Pilih gPdf ketika perubahan layout seharusnya menjadi revisi template, bukan rebuild C# dan redeploy service.
Dokumen serupa, model kepemilikan berbeda
Dengan QuestPDF, aplikasi memiliki pembuatan PDF. Ini kekuatan nyata: C# tetap dekat dengan domain model, bisa dijalankan dan di-debug secara lokal, dan tidak ada runtime call ke API eksternal.
Trade-off-nya, tim Anda juga memiliki seluruh permukaan produksi berikut:
- CPU dan memori untuk rendering.
- Font discovery dan fallback di setiap environment deployment.
- Integrasi library barcode dan QA cetak.
- Urusan package native dan deployment untuk charting atau integrasi grafik custom.
- Monitoring, retry, dan failure handling.
- Deployment regional ketika pengguna atau gudang tersebar global.
- Rollout setiap kali layout dokumen berubah.
Dengan gPdf, permukaan itu dipindah keluar. Aplikasi mengirim DocumentRequest atau template_id + data, lalu layanan memiliki renderer, runtime edge, font, primitive barcode, output PDF/A, dan packaging e-invoice. Ini kurang menarik jika Anda ingin semua detail berada di C#, tetapi lebih menarik jika pembuatan PDF seharusnya menjadi lapisan utilitas yang dapat dipanggil dari stack mana pun.
Tiga trade-off yang harus dijawab hosted API secara jujur
Banyak pitch “library vs API” melewati tiga pertanyaan pertama yang biasanya diajukan arsitek .NET. Perbandingan yang adil harus menjawabnya terang-terangan.
1. Ke mana data dokumen pergi. Halaman ini banyak membahas faktur, statement, dan e-invoice, yaitu dokumen berisi nama, alamat, tax ID, dan nominal. Dengan QuestPDF, byte tersebut dibuat di dalam proses Anda dan tidak keluar. Public gPdf API mengirim payload ke renderer, tetapi renderer bersifat zero-retention. Request JSON hanya berada di Cloudflare Workers V8 isolate selama render (biasanya sekitar 4 ms), lalu dilepas saat response selesai. Tidak disimpan, dilog, disampling, atau dipakai untuk training; log operasional hanya menyimpan HTTP status dan durasi (security, DPA). Pilihan data residency EU / global dan enterprise on-prem / private deployment dapat memperkecil atau menutup exposure lebih jauh. Meski begitu, menjaga pembuatan dokumen tetap in-process tanpa setup tambahan adalah alasan yang sah, kadang menentukan, bagi tim finance atau sektor publik untuk memilih QuestPDF.
2. Mode kegagalan. Library tidak punya pihak ketiga yang bisa down; pembuatan dokumen hanya gagal di infrastruktur yang memang Anda miliki. Hosted API menambah availability dependency yang tidak Anda kontrol. Cara yang tepat memakai gPdf adalah memperlakukan render call seperti external call lain: timeout, retry, queue, dan idealnya fallback degraded-mode. Jika pembuatan dokumen berada di jalur sinkron yang kritis, timbang “mengoperasikan sendiri” melawan “bergantung pada uptime vendor.”
3. Profil latensi. Pembuatan in-process adalah function call tanpa jaringan. Hosted call adalah network round-trip. Untuk batch dan job async, ini sering tidak terasa. Untuk “pengguna klik, PDF harus muncul sekarang”, in-process secara struktur lebih cepat. Edge PoP gPdf membuat hop kecil, tetapi tetap ada TLS plus round-trip; QuestPDF adalah method call.
Tiga hal ini tidak membuat gPdf menjadi pilihan yang salah. Justru inilah yang mendefinisikan kapan gPdf menjadi pilihan yang tepat: tim yang data dokumennya boleh keluar dari proses, flow-nya menerima network hop, dan lebih memilih bergantung pada uptime vendor daripada mengoperasikan render fleet sendiri.
Model lisensi dan harga
Halaman lisensi publik QuestPDF menyatakan lisensi komersial hanya diperlukan untuk perusahaan dengan pendapatan kotor tahunan di atas US1 juta. Tier Community gratis di bawah MIT terms untuk individu yang memenuhi syarat, proyek open-source, non-profit, dan perusahaan di bawah ambang pendapatan tersebut. Halaman yang sama mencantumkan dua tier komersial perpetual: Professional US999 plus pajak lokal untuk tim hingga 10 developer, dan Enterprise US$2.999 plus pajak lokal untuk seluruh organisasi tanpa menghitung developer. Keduanya mencakup satu tahun update serta unlimited projects, servers, dan deployments; lisensi tidak kedaluwarsa untuk versi terakhir yang diterima.
Model enforcement-nya juga sangat ringan. Lisensi disetel dengan satu baris: QuestPDF.Settings.License = LicenseType.Community;. Tidak ada license key, activation server, dan menurut configuration page QuestPDF sendiri, tidak ada network call maupun data yang keluar dari mesin. Ini model honor system: Anda memilih tier yang sesuai. Tidak ada tagihan vendor per dokumen, dan lisensi berbayar dapat berjalan di mana pun, termasuk sepenuhnya offline.
gPdf memberi harga langsung pada layanan render. Public Basic plan mulai US5/bulan untuk 100.000 halaman, dengan overage mulai US0,00005/halaman. Itu memang tagihan vendor, tetapi juga menghapus proyek terpisah untuk mengoperasikan pembuatan PDF: tidak ada render cluster, jalur deployment NuGet, warm pool regional, paket font per aplikasi, atau layanan PDF yang harus dipatch.
Jadi perbandingan biaya bukan “US999 vs US5”. Lisensi hanyalah baris kecil. Perbandingan sebenarnya:
QuestPDF total = license (one-time) + your hosting + your engineer-time + on-call
gPdf total = page bill (infrastructure, fonts, scaling, and edge included)
Dengan perhitungan per halaman publik, overage gPdf adalah US0,05 per 1.000 halaman (US50 per 1 juta, US500 per 10 juta). Lisensi Enterprise sekali bayar US2.999 baru break even terhadap tagihan itu di sekitar 60 juta halaman, dan angka itu belum menghitung hosting serta engineer-month QuestPDF. Biaya nyata biasanya bergeser lebih jauh ke arah gPdf kecuali Anda sudah menjalankan infrastruktur render dengan sangat murah. Aturan praktisnya: jika Anda harus membangun dan men-staff layanan render hanya untuk memakai library, gPdf biasanya menang pada total cost jauh sebelum tagihan per halaman menyusul lisensi. Jika infrastruktur itu sudah ada dan hampir gratis bagi Anda, lisensi perpetual menang di skala besar.
Alur pengembangan: Fluent C# vs template
Fluent API QuestPDF cocok ketika developer memiliki bentuk dokumen. Strong typing, method chain, komponen C# reusable, refactor IDE, dan Companion App semuanya masuk akal saat PDF adalah bagian dari codebase aplikasi.
gPdf cocok untuk alur yang berbeda. Developer tetap dapat menulis JSON langsung, tetapi sistem produksi biasanya bergerak ke template. Designer, operator, atau engineer menyesuaikan layout di gPdf Studio. Layout yang disetujui menjadi template, dan backend tetap merender dengan template_id + data.
Perbedaan ini penting ketika dokumen sering berubah. Jika layout label kurir, faktur, packing slip, atau statement berubah, gPdf dapat menjaga runtime tetap stabil sementara hanya template yang bergerak. Dengan QuestPDF, layout adalah kode C#, sehingga jalur normalnya adalah perubahan kode, test, build, deploy, dan rencana rollback.
Tidak ada alur yang selalu lebih baik. QuestPDF mengoptimalkan document-as-code untuk developer C#; gPdf mengoptimalkan template operasional yang dibagi lintas sistem.
Compliance: keduanya serius
Ini bukan perbandingan di mana gPdf menang dengan menyatakan pesaing tidak punya fitur kepatuhan. Materi publik QuestPDF saat ini mencantumkan dukungan standar yang kuat, termasuk PDF/A, PDF/UA-1, dan e-invoicing EN 16931 melalui contoh ZUGFeRD 2.1 / Factur-X berbasis standard UN/CEFACT Cross Industry Invoice (CII). Contoh itu menyetel PdfA = true, menyematkan payload factur-x.xml dengan AddAttachment(), memperluas dokumen dengan metadata XMP, lalu memvalidasi hasil dengan veraPDF (untuk PDF/A-3b) dan Mustang Project (untuk ZUGFeRD). Itu resep yang lengkap dan jujur, dan pipeline Anda memiliki setiap langkahnya.
gPdf memaketkan standar yang sama sebagai kontrak API. JSON Render mengekspos enam profil PDF/A (1b, 2b, 3b, 4, 2u, 3u) plus PDF/UA-1 melalui settings.profile. Template Render memakai ulang model dokumen yang sama. E-Invoice Render menyediakan endpoint khusus POST /api/v1/e-invoice/render yang menghasilkan paket Factur-X / ZUGFeRD PDF/A-3b dengan EN 16931 CII XML tertanam. Perbedaannya dari resep QuestPDF adalah apa yang dikerjakan layanan untuk Anda: gPdf menjalankan validasi PDF/A-3b dan e-invoice di sisi server, mendukung pengiriman inline sinkron atau objek yang dipolling, dan menawarkan data residency EU atau global sebagai request setting, bukan langkah yang harus Anda rakit dan operasikan. QuestPDF cocok ketika validasi harus hidup di dalam pipeline .NET Anda; gPdf cocok ketika validasi harus menjadi kontrak hosted yang dibagi banyak sistem.
Font dan barcode: yang sebenarnya dibandingkan adalah effort integrasi
QuestPDF memiliki model font yang mumpuni. Ia menyertakan Lato 2.015 secara default, memuat otomatis font system dan font di direktori deployment, memungkinkan font custom melalui FontManager, serta mendukung fallback chain. Ini memberi kontrol kepada developer. Namun dokumentasi yang sama juga jujur soal konsekuensinya: “in most cloud deployments, few or no fonts are available, which may lead to unexpected results,” dan merekomendasikan disabling environment fonts serta mendaftarkan font yang dibutuhkan secara eksplisit. Dengan kata lain, pada target container atau serverless, environment font adalah tanggung jawab Anda untuk direncanakan, dikirim, dan diuji. Missing glyph menjadi karakter placeholder, atau jika CheckIfAllTextGlyphsAreAvailable diaktifkan, menjadi exception.
gPdf menjadikan font bagian dari batas layanan. Renderer membundel set multi-script: Latin, Greek, Cyrillic, Arabic, Hebrew, Bengali, Tamil, Thai, Vietnamese, monospace, dan CJK dengan fallback per script ke Noto KR / JP / SC. Pilihan font implisit diselesaikan melalui auto selection, sedangkan pilihan eksplisit melalui prefer atau strict. Caller tidak perlu mengirim font CJK, mendaftarkan aset Noto di aplikasi .NET, atau menyesuaikan fallback per target deployment. Mereka mengirim data; renderer memiliki environment font yang sama di setiap region.
Perbandingan barcode punya pola serupa. Barcode docs QuestPDF menunjukkan pendekatan yang solid memakai ZXing.Net yang dirender sebagai vector SVG, dan secara eksplisit menyatakan ZXing.Net tidak termasuk dalam package QuestPDF. Anda memasangnya dari NuGet dan menghubungkannya:
// 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.
Dengan gPdf, pembuatan barcode adalah elemen utama dalam schema. Request mendeklarasikan format, content, ukuran fisik, dan baris human-readable opsional. Format GS1 bersifat native, sehingga Application Identifiers langsung masuk ke 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" }
}
Untuk satu aplikasi .NET, memasang ZXing.Net dan menguji output mungkin mudah. Untuk banyak service dan template, terutama workload logistik dan retail yang membutuhkan GS1-128, SSCC, GTIN, GS1 DataMatrix, atau GS1 QR dengan baris interpretasi human-readable, mendorong perilaku barcode ke API dokumen lebih mudah dipelihara daripada mengulang wiring ZXing yang sama di setiap service.
Di mana QuestPDF jelas unggul
Selain berjalan offline, menjaga data dokumen di dalam perimeter Anda, dan ketika kode PDF sendiri menjadi bagian dari produk, QuestPDF kuat untuk tim yang perlu menginspeksi, memperluas, atau memiliki jalur render. Ada dua area kapabilitas yang memang berada di luar scope gPdf:
- Operasi pada PDF yang sudah ada. QuestPDF dapat memuat file existing lalu merge, memilih / mengurutkan ulang / membalik / memfilter halaman, menerapkan overlay, menambah attachment, menyetel metadata XMP, melakukan linearization untuk web delivery, serta encrypt dan decrypt dengan keamanan 40/128/256-bit. gPdf dapat memberi proteksi password dan permission gate pada PDF yang dibuatnya sendiri, tetapi tidak membuka, menggabungkan, atau mendekripsi file yang tidak dibuatnya.
- Chart, map, dan grafik custom. QuestPDF mengintegrasikan charting libraries (ScottPlot, LiveCharts, Microcharts), Mapbox maps, dan SkiaSharp canvas untuk drawing 2D arbitrer. gPdf dapat menggambar vector art dengan elemen
path(SVG path data) atau menyematkan chart SVG / PNG yang diproduksi upstream, tetapi tidak memiliki built-in charting engine, maps, atau canvas. Jika data-driven charting menjadi inti dokumen, tooling tersebut berada di QuestPDF.
Di mana gPdf jelas unggul
gPdf unggul ketika organisasi tidak ingin setiap product team memiliki layanan PDF sendiri: stack polyglot, alur global, dan sistem ERP / OMS / WMS / ecommerce / fintech / ticketing yang merender dokumen dari data terstruktur, dengan template yang berubah terpisah dari kode. Dalam lingkungan seperti ini, library lokal sering mulai murah tetapi berubah menjadi armada: satu service per bahasa, satu jalur deployment per region, satu rencana font per container, satu set regresi barcode per tim. gPdf mengubah armada itu menjadi satu kontrak HTTP.
Serverless membuat batasnya paling jelas. Di AWS Lambda, Cloud Run, atau Azure Functions, QuestPDF tetap berjalan di dalam aplikasi. Tim Anda memaketkan runtime .NET, font, dependency native, serta CPU / memori yang cukup untuk peak PDF work, dan memiliki cold start. gPdf sudah menjadi layanan render: function mengirim POST kecil berisi template_id + data ke edge dan menerima byte PDF kembali, tanpa renderer yang perlu dihangatkan atau worker per region yang perlu diskalakan.
Bentuk migrasi
Migrasi dari QuestPDF ke gPdf bukan rewrite baris demi baris. Ini perubahan batas: kode C# yang membangun PDF menjadi request dokumen JSON atau template yang dipublikasikan.
Before / after — document-build call di C# menjadi satu HTTP POST (klik untuk membuka)
- // 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();
Setelah batas itu bergeser, perubahan layout dapat menjadi revisi template, bukan deployment aplikasi. Aplikasi tetap memiliki data bisnis dan keputusan workflow; gPdf memiliki rendering.
Catatan harga dan sumber
Informasi QuestPDF di halaman ini dicek pada 2026-06-02 terhadap sumber resmi QuestPDF: License and Pricing, License configuration, Features Overview, Companion App features, Barcodes, Font management, dan ZUGFeRD example. Harga dan halaman fitur dapat berubah; tim procurement sebaiknya mengecek ulang halaman vendor sebelum mengambil keputusan pembelian. QuestPDF dan merek terkait adalah milik pemiliknya masing-masing, dan perbandingan ini tidak didukung atau disahkan oleh mereka.
Skenario pembuatan PDF terkait
Jika Anda sedang menilai QuestPDF untuk dokumen operasional, lihat juga JSON to PDF API, API faktur PDF, API label pengiriman, barcode GS1 di PDF, PDF/A API, Factur-X API, dan ZUGFeRD API untuk alur yang tidak ingin mengoperasikan render service sendiri.
FAQ
Apakah gPdf menggantikan QuestPDF?
Tidak. gPdf menggantikan kebutuhan mengoperasikan layanan pembuatan PDF untuk dokumen bisnis terstruktur. QuestPDF tetap menjadi library C# lokal yang kuat ketika PDF memang harus dibuat di dalam aplikasi.
Apakah QuestPDF gratis?
Halaman lisensi publik QuestPDF menyatakan tier Community gratis di bawah MIT terms untuk individu yang memenuhi syarat, proyek open-source, non-profit, dan perusahaan dengan pendapatan kotor tahunan di bawah US1 juta. Perusahaan di atas ambang itu membutuhkan lisensi komersial perpetual: Professional US999 plus pajak lokal untuk hingga 10 developer, atau Enterprise US$2.999 plus pajak lokal untuk seluruh organisasi, masing-masing termasuk satu tahun update.
Apakah gPdf bisa membuat charts atau maps seperti QuestPDF?
Tidak sebagai engine bawaan. QuestPDF mengintegrasikan charting libraries (ScottPlot, LiveCharts, Microcharts), Mapbox maps, dan SkiaSharp canvas yang render di dalam dokumen. gPdf tetap dapat menggambar chart vektor dengan elemen path (menerima SVG path data) dan shape, atau menyematkan SVG / PNG yang dibuat oleh library chart apa pun sebagai image. Bedanya, QuestPDF menghitung dan merender chart in-process, sedangkan dengan gPdf Anda membuat artwork chart lalu gPdf menempatkannya. Jika data-driven charting atau maps adalah inti dokumen, QuestPDF lebih cocok.
Produk mana yang lebih murah?
Tergantung batasnya. QuestPDF bisa lebih murah untuk tim .NET yang memenuhi Community terms atau sudah mengoperasikan infrastruktur render. gPdf bisa lebih murah ketika alternatifnya adalah membangun, meng-host, dan memelihara layanan PDF lintas produk atau region.
Apakah gPdf menyimpan atau mencatat document data saya?
Tidak. JSON yang Anda kirim dan PDF yang dikembalikan gPdf tidak disimpan. Setiap request dirender di dalam satu Cloudflare Workers V8 isolate, berada di memori hanya selama render, biasanya sekitar 4 ms, lalu dilepas ketika response stream selesai. gPdf tidak menyimpan, mencatat, mengambil sampel, atau melatih model pada content DocumentRequest. Log operasional hanya menyimpan HTTP status dan durasi selama 30 hari, tanpa body request. Lihat security policy, privacy policy, dan DPA. Untuk workload yang sama sekali tidak boleh mengirim data, on-prem / private deployment menjaganya tetap di dalam perimeter Anda.
Apakah QuestPDF bisa berjalan tanpa internet access?
Ya. License configuration page QuestPDF menyatakan tidak ada license key atau activation server, dan komputasi dilakukan secara lokal. Itu salah satu alasan paling jelas untuk memilih QuestPDF.
Apakah gPdf bisa merender sembarang C# QuestPDF layout?
Tidak. gPdf tidak mengeksekusi kode layout C#. Migrasi berarti mengubah bentuk dokumen menjadi request JSON gPdf atau template gPdf yang disimpan.