DocRaptor adalah product yang kompeten. Ia membungkus Prince, gold-standard engine untuk HTML-to-PDF, dalam hosted REST API dengan retries, async jobs, dan docs yang baik. Sudah ada lebih dari satu decade, dan bagi banyak teams ini adalah obvious choice ketika mereka “tidak ingin menjalankan Prince sendiri”.
Kami adalah tool dengan bentuk berbeda. gPdf tidak menerima HTML sama sekali; ia menerima structured JSON dan merender PDF langsung di Cloudflare edge. List-price gap pada 100K pages/month adalah $5/mo (gPdf Basic) vs $89/mo (DocRaptor Basic), sekitar 18×. Ini bukan opening promo. Ini structural. Post ini menjelaskan mengapa structure menghasilkan price itu, dan di mana masing-masing tool sebenarnya fit.
Dua arsitektur, berdampingan
| Layer | DocRaptor (HTML → PDF) | gPdf (JSON → PDF) |
|---|---|---|
| Input | HTML + CSS, dengan Prince extensions for paged media | JSON DocumentRequest |
| Renderer | Prince, compiled C++ engine | Custom Rust engine, compiled to WebAssembly |
| Hosting | Centralised servers DocRaptor, US datacentre region | Cloudflare Workers, setiap CF colo, 300+ cities |
| Cold start | Server-side worker pool | V8 isolate boot, single-digit ms |
| Per-render compute | Layout pass over HTML/CSS, lalu Prince paginates | Direct typesetting, tanpa layout interpretation pass |
| Per-render p50 | ~250-800 ms wall-clock, network + render | ~3-8 ms, network + render |
| Output determinism | High, Prince mature | Byte-identical, same JSON → same bytes |
Jika Anda membaca dua columns ini sebagai “general HTML printer” vs “purpose-built document renderer”, Anda sudah memahami architectural decision-nya. Semua yang lain, latency, cost, bahkan feature lists, adalah downstream dari choice itu.
Pajak Prince
Prince bagus. Ia juga melakukan pekerjaan yang tidak dibutuhkan sebagian besar invoice/receipt/label workflows: mengimplementasikan CSS Paged Media untuk arbitrary HTML yang mungkin dikirim user; page-break rules, running headers, footnotes, cross-references, generated content boxes.
Generality itu memiliki runtime cost. Untuk paginate arbitrary HTML document, engine harus:
- Parse dan validate HTML
- Parse dan resolve CSS cascade, mungkin dengan extensions milik Prince
- Build render tree
- Run multi-pass layout, terutama untuk tables yang spanning pages atau columns yang balance
- Resolve cross-references across pages
- Emit PDF objects
Sebagian besar passes itu adalah biaya menerima HTML sebagai input. Jika input Anda sudah structured data, yang hampir selalu benar karena invoice ada sebagai JSON object di suatu tempat sebelum Anda wrap menjadi HTML, Anda membayar passes itu dalam compute dan latency di setiap render, tanpa menambah value pada output.
gPdf melewati layout-interpretation step sepenuhnya. JSON DocumentRequest sudah structurally specifies page layout: { pages: [{ size, elements: [...] }] }. Renderer typeset elements, paginate tables/lists deterministically, dan emit PDF. Tidak ada CSS cascade untuk resolve, tidak ada float layout untuk compute, tidak ada cross-reference resolution pass.
Hasilnya: single-page invoice yang sama membutuhkan ~300 ms di DocRaptor dan ~3 ms di gPdf. Kami lebih cepat bukan karena menulis Prince yang lebih cepat; kami lebih cepat karena tidak melakukan sebagian besar hal yang Prince lakukan.
”Terlalu murah untuk benar” adalah procurement objection nyata
Ini perlu di-address langsung karena muncul di setiap B2B sales call.
“$5/mo untuk 100K renders. DocRaptor $89. Anvil $0.10/PDF, jadi $10,000 untuk same volume. Ada apa dengan kalian?”
Ada tiga alasan jujur mengapa kami bisa charge price ini:
1. Kami tidak menjalankan browser
DocRaptor amortises Prince infrastructure across customers. gPdf amortises one Cloudflare Worker, yang cost-nya sekitar $0.50/million requests di Workers Bundled. Dengan JSON-shaped input, renderer kami memakan sekitar 1.5 ms CPU per render. Tambahkan margin 50% dan Anda masih berada dalam range cents-per-thousand-renders. Arithmetic adalah price-nya.
2. Kami tidak menjalankan control plane
Tidak ada async jobs, callbacks, retry queue, document storage, preview-link UI, multi-tenant database. Setiap render adalah single round-trip ke stateless function dan kembali. Ini menghapus seluruh ops surface yang di-budget sebagian besar “PDF API” companies, dan surface itu juga yang menjustifikasi price mereka.
3. Model menyaring sendiri workloads yang akan membuat kami rugi
Jika document Anda benar-benar membutuhkan HTML-to-PDF, seperti 60-page legal contract atau complex CSS-Grid report, Anda akan bounce dari JSON model pada hour pertama dan pergi ke DocRaptor. Kami tidak perlu defensive pricing untuk workloads itu karena mereka self-route. Kami hanya perlu price long-but-narrow tail dari “structured-data-to-document” workloads, di mana per-render cost memang tiny.
Jika digabung: $5/100K bukan loss leader; itu actual cost-of-goods-sold plus margin. Kami bisa mempertahankannya karena underlying compute memang semurah itu ketika Anda tidak ship browser.
Di mana DocRaptor adalah pilihan tepat
Kami berusaha tidak menulis self-serving comparison. Cases di mana DocRaptor benar-benar wins:
- Input Anda adalah HTML yang tidak sepenuhnya Anda control. User-generated reports, third-party templates, Markdown-from-CMS-rendered-to-HTML. Anda tidak ingin menulis JSON mapper untuk arbitrary input.
- Anda butuh CSS Paged Media features yang supported oleh Prince. Running headers/footers per chapter, complex footnote reflow, named-page selectors, generated tables of contents, indexes. gPdf memiliki structured equivalents untuk common subset, tetapi jika Anda hidup di
@page :leftselectors, Prince adalah teman Anda. - Anda memiliki content team yang menulis HTML/CSS, bukan JSON. Jangan paksakan JSON authoring workflow pada non-engineering team. Mereka akan membencinya.
- Async + callbacks + document storage as a service. DocRaptor stores generated PDFs dan memberi signed URLs untuk delivery. gPdf strictly stateless; code Anda stores result.
Jika Anda berada di salah satu buckets itu, tetap di DocRaptor. Itu tool yang tepat.
Di mana gPdf adalah pilihan tepat
Mirror image:
- Inputs Anda sudah structured data: database rows, JSON API payloads, queue messages.
- Latency penting: interactive checkout flows, real-time label printing, on-demand statement generation.
- Anda peduli byte-identical reproducibility untuk tests, audit trails, atau e-invoice retention.
- Anda cost-sensitive pada volume apa pun di atas beberapa thousand renders/month.
- Anda membutuhkan barcodes seperti GS1-128, QR, Data Matrix, PDF417, Aztec, MaxiCode dengan sub-millimetre precision. Prince technically supports SVG barcodes, tetapi mencapai 0.1 mm overall length precision melalui HTML/CSS itu non-trivial.
- Anda butuh PDF/A (1b/2b/3b/4) atau Factur-X / ZUGFeRD attachments untuk compliance.
- Anda tidak ingin menjalankan JSON-to-HTML-to-PDF pipeline ketika bisa menjalankan JSON-to-PDF pipeline.
Migrasi itu mekanis, bukan strategis
Worry umum: “Switching berarti rewrite semua templates.” Biasanya tidak. Most HTML-to-PDF templates adalah 20% layout, yang menjadi JSON structure sekali, dan 80% data interpolation, yang sama persis apa pun renderer-nya.
Practical path:
- Pilih satu document type untuk migrate. Mulai dari highest-volume one: biggest savings, smallest blast radius.
- Ambil data interface HTML template, yaitu variables yang ia interpolates, lalu tulis function kecil
mapToDocumentRequest(data). - Iterate di Playground sampai output match.
- A/B di production: route 5% traffic ke gPdf selama dua weeks. Diff PDFs. Compare bills.
- Roll forward atau roll back berdasarkan data, bukan vibes.
Kami pernah melihat teams melakukan ini dalam satu sprint dan menghemat 90% PDF bill pada bulan berikutnya. Kami juga pernah melihat teams menyadari workload mereka sebenarnya HTML-to-PDF case dan tetap di DocRaptor; itu juga decision yang tepat.
TL;DR
| DocRaptor | gPdf | |
|---|---|---|
| Best at | HTML → PDF untuk arbitrary content | JSON → PDF untuk structured documents |
| Price (100K pages/mo) | $89 | $5 |
| p50 render | 250-800 ms | 3-8 ms |
| Edge-deployed | Tidak, centralised | Ya, 300+ Cloudflare colos |
| Async + storage | Ya, included | Tidak, stateless by design |
| PDF/A + Factur-X | Melalui Prince extensions | built-in |
Jika documents Anda adalah structured data yang didandani sebagai HTML untuk renderer, Anda membayar translation step yang tidak perlu ada. Coba Playground: describe salah satu invoice Anda dalam JSON, render di browser dalam kurang dari 5 ms, dan lihat apakah gap-nya cocok dengan gut feeling Anda.