DocRaptor একটি সক্ষম product। এটি Prince, HTML-to-PDF-এর gold-standard engine, কে hosted REST API-তে wrap করে, retries, async jobs এবং ভালো docs সহ। এটি এক decade-এরও বেশি সময় ধরে আছে, এবং অনেক team-এর জন্য “আমি নিজে Prince চালাতে চাই না” এমন obvious choice।
আমরা ভিন্ন ধরনের tool। gPdf HTML একদম নেয় না; structured JSON নেয় এবং Cloudflare edge-এ সরাসরি PDF render করে। 100K pages/month-এ list-price gap হলো $5/mo (gPdf Basic) vs $89/mo (DocRaptor Basic), প্রায় 18×। এটি opening promo নয়। এটি structural। এই post ব্যাখ্যা করে কেন structure এই price তৈরি করে, এবং প্রতিটি tool আসলে কোথায় fit করে।
দুটি architecture পাশাপাশি
| Layer | DocRaptor (HTML → PDF) | gPdf (JSON → PDF) |
|---|---|---|
| Input | HTML + CSS, Prince extensions for paged media সহ | JSON DocumentRequest |
| Renderer | Prince, compiled C++ engine | Custom Rust engine, WebAssembly-এ compiled |
| Hosting | DocRaptor-এর centralised servers, US datacentre region | Cloudflare Workers, প্রতিটি CF colo, 300+ cities |
| Cold start | Server-side worker pool | V8 isolate boot, single-digit ms |
| Per-render compute | HTML/CSS-এর ওপর layout pass, তারপর Prince pagination | Direct typesetting, 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 |
আপনি যদি দুটি column-কে “general HTML printer” বনাম “purpose-built document renderer” হিসেবে পড়েন, architectural decision বুঝে গেছেন। বাকি সব, latency, cost, এমনকি feature lists, সেই choice-এর downstream।
Prince tax
Prince ভালো। কিন্তু এটি এমন কাজও করে যা বেশিরভাগ invoice/receipt/label workflows-এর দরকার নেই: arbitrary HTML-এর জন্য CSS Paged Media implement করা, যেমন page-break rules, running headers, footnotes, cross-references, generated content boxes।
এই generality-এর runtime cost আছে। Arbitrary HTML document paginate করতে engine-কে:
- HTML parse ও validate করতে হয়
- CSS cascade parse ও resolve করতে হয়, সম্ভবত Prince-এর নিজস্ব extensions সহ
- Render tree build করতে হয়
- Multi-pass layout চালাতে হয়, বিশেষ করে page-span tables বা balanced columns-এর জন্য
- Pages জুড়ে cross-references resolve করতে হয়
- PDF objects emit করতে হয়
এই passes-এর বেশিরভাগই HTML-কে input হিসেবে গ্রহণের খরচ। আপনার input যদি আগে থেকেই structured data হয়, যা প্রায় সবসময়ই সত্য কারণ invoice কোথাও JSON object হিসেবে থাকে, তাহলে আপনি প্রতিটি render-এ compute ও latency দিয়ে সেই passes-এর cost দিচ্ছেন, অথচ output-এ value যোগ হচ্ছে না।
gPdf layout-interpretation step পুরোপুরি এড়িয়ে যায়। JSON DocumentRequest আগেই page layout structurally specify করে: { pages: [{ size, elements: [...] }] }। Renderer elements typeset করে, tables/lists deterministicভাবে paginate করে, এবং PDF emit করে। CSS cascade resolve নেই, float layout compute নেই, cross-reference resolution pass নেই।
ফলাফল: একই single-page invoice DocRaptor-এ ~300 ms নেয়, gPdf-এ ~3 ms। আমরা faster কারণ faster Prince লিখেছি তা নয়; আমরা faster কারণ Prince যা করে তার বড় অংশ আমরা করিই না।
“সত্যি হওয়ার জন্য খুব সস্তা” procurement-এ বাস্তব objection
এটা সরাসরি address করা দরকার, কারণ প্রতিটি B2B sales call-এ আসে।
“$5/mo for 100K renders. DocRaptor $89। Anvil $0.10/PDF, অর্থাৎ একই volume-এ $10,000। আপনাদের সমস্যা কী?”
তিনটি honest reason আছে যার জন্য আমরা এই price charge করতে পারি:
1. আমরা browser চালাই না
DocRaptor Prince infrastructure customers-এর মধ্যে amortise করে। gPdf একটি Cloudflare Worker amortise করে, যার cost Workers Bundled-এ roughly $0.50/million requests। JSON-shaped input নিয়ে আমাদের renderer প্রায় 1.5 ms CPU per render নেয়। 50% margin যোগ করলেও আপনি cents-per-thousand-renders range-এ থাকেন। Arithmetic-ই price।
2. আমরা control plane চালাই না
Async jobs নেই, callbacks নেই, retry queue নেই, document storage নেই, preview-link UI নেই, multi-tenant database নেই। প্রতিটি render stateless function-এ single round-trip এবং ফিরে আসা। এতে বেশিরভাগ “PDF API” companies যেটির জন্য budget করে সেই পুরো ops surface বাদ যায়, এবং সেটিই তাদের price justify করে।
3. Model নিজেই loss-making workloads filter করে
আপনার document যদি সত্যিই HTML-to-PDF চায়, যেমন 60-page legal contract বা complex CSS-Grid report, তাহলে প্রথম hour-এই JSON model থেকে bounce করে DocRaptor-এ যাবেন। এই workloads-এর জন্য defensive pricing করতে হয় না, কারণ তারা self-route করে। আমাদের শুধু “structured-data-to-document” workloads-এর long-but-narrow tail-এর জন্য price করতে হয়, যেখানে per-render cost সত্যিই tiny।
একত্রে: $5/100K কোনো loss leader নয়; এটি actual cost-of-goods-sold plus margin। আমরা এটাকে ধরে রাখতে পারি কারণ browser ship না করলে underlying compute সত্যিই এত সস্তা।
কোথায় DocRaptor সঠিক choice
আমরা self-serving comparison লিখতে চাই না। যেসব case-এ DocRaptor সত্যিই জেতে:
- আপনার input এমন HTML যা আপনি পুরোপুরি control করেন না। User-generated reports, third-party templates, CMS থেকে Markdown-to-HTML output। Arbitrary input-এর জন্য JSON mapper লেখা ঠিক পথ নয়।
- আপনার Prince-supported CSS Paged Media features দরকার। Running headers/footers per chapter, complex footnote reflow, named-page selectors, generated tables of contents, indexes। gPdf common subset-এর structured equivalents দেয়, কিন্তু আপনি যদি
@page :leftselectors-এ থাকেন, Prince আপনার বন্ধু। - আপনার content team HTML/CSS লেখে, JSON নয়। Non-engineering team-এর ওপর JSON authoring workflow চাপাবেন না। তারা এটা পছন্দ করবে না।
- Async + callbacks + document storage as a service। DocRaptor generated PDFs store করে এবং delivery-র জন্য signed URLs দেয়। gPdf strictly stateless; result আপনার code store করে।
আপনি যদি এই buckets-এর কোনো একটিতে থাকেন, DocRaptor-এ থাকুন। সেটাই সঠিক tool।
কোথায় gPdf সঠিক choice
Mirror image:
- আপনার inputs আগেই structured data, যেমন database rows, JSON API payloads, queue messages।
- Latency গুরুত্বপূর্ণ, যেমন interactive checkout flows, real-time label printing, on-demand statement generation।
- Tests, audit trails বা e-invoice retention-এর জন্য byte-identical reproducibility দরকার।
- কয়েক thousand renders/month-এর ওপর যেকোনো volume-এ cost-sensitive।
- GS1-128, QR, Data Matrix, PDF417, Aztec, MaxiCode-এর মতো barcodes sub-millimetre precision-এ দরকার। Prince technically SVG barcodes support করে, কিন্তু HTML/CSS দিয়ে 0.1 mm overall length precision non-trivial।
- Compliance-এর জন্য PDF/A (1b/2b/3b/4) বা Factur-X / ZUGFeRD attachments দরকার।
- JSON-to-PDF pipeline চালানো গেলে JSON-to-HTML-to-PDF pipeline চালাতে চান না।
Migration mechanical, strategic নয়
Common worry: “Switching মানে সব templates rewrite করা.” সাধারণত না। Most HTML-to-PDF templates 20% layout, যা একবার JSON structure হয়ে যায়, আর 80% data interpolation, যা renderer যাই হোক একই থাকে।
Practical path:
- migrate করার জন্য একটি document type বেছে নিন। Highest-volume one দিয়ে শুরু করুন, biggest savings এবং smallest blast radius।
- HTML template-এর data interface নিন, অর্থাৎ যে variables interpolate করে, এবং ছোট
mapToDocumentRequest(data)function লিখুন। - Playground-এ iterate করুন যতক্ষণ output match না করে।
- Production-এ A/B করুন: দুই weeks 5% traffic gPdf-এ route করুন। PDFs diff করুন। Bills compare করুন।
- Data অনুযায়ী roll forward বা roll back করুন, vibes অনুযায়ী নয়।
আমরা teams-কে এক sprint-এ এটা করে পরের মাসে PDF bill-এর 90% বাঁচাতে দেখেছি। আবার teams-কে বুঝতে দেখেছি যে তাদের workload সত্যিই HTML-to-PDF case, এবং তারা DocRaptor-এ থেকেছে; সেটাও সঠিক decision।
TL;DR
| DocRaptor | gPdf | |
|---|---|---|
| Best at | Arbitrary content-এর জন্য HTML → PDF | Structured documents-এর জন্য JSON → PDF |
| Price (100K pages/mo) | $89 | $5 |
| p50 render | 250-800 ms | 3-8 ms |
| Edge-deployed | না, centralised | হ্যাঁ, 300+ Cloudflare colos |
| Async + storage | হ্যাঁ, included | না, stateless by design |
| PDF/A + Factur-X | Prince extensions দিয়ে | built-in |
আপনার documents যদি renderer-এর জন্য HTML পরা structured data হয়, তাহলে আপনি এমন translation step-এর জন্য pay করছেন যার দরকার নেই। Playground try করুন: আপনার invoices-এর একটি JSON-এ describe করুন, browser-এ 5 ms-এর কমে render করুন, এবং দেখুন gap আপনার gut-এর সঙ্গে মেলে কি না।