ব্লগ

gPdf vs DocRaptor: কেন edge rendering HTML-to-PDF-কে হারায়

DocRaptor hosted backend-এ HTML থেকে PDF বানাতে Prince ব্যবহার করে। gPdf structured JSON সরাসরি Cloudflare edge-এ render করে। Price gap 18×, আর এটি teaser নয়.

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 পাশাপাশি

LayerDocRaptor (HTML → PDF)gPdf (JSON → PDF)
InputHTML + CSS, Prince extensions for paged media সহJSON DocumentRequest
RendererPrince, compiled C++ engineCustom Rust engine, WebAssembly-এ compiled
HostingDocRaptor-এর centralised servers, US datacentre regionCloudflare Workers, প্রতিটি CF colo, 300+ cities
Cold startServer-side worker poolV8 isolate boot, single-digit ms
Per-render computeHTML/CSS-এর ওপর layout pass, তারপর Prince paginationDirect typesetting, layout interpretation pass নেই
Per-render p50~250-800 ms wall-clock, network + render~3-8 ms, network + render
Output determinismHigh, Prince matureByte-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-কে:

  1. HTML parse ও validate করতে হয়
  2. CSS cascade parse ও resolve করতে হয়, সম্ভবত Prince-এর নিজস্ব extensions সহ
  3. Render tree build করতে হয়
  4. Multi-pass layout চালাতে হয়, বিশেষ করে page-span tables বা balanced columns-এর জন্য
  5. Pages জুড়ে cross-references resolve করতে হয়
  6. 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 :left selectors-এ থাকেন, 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:

  1. migrate করার জন্য একটি document type বেছে নিন। Highest-volume one দিয়ে শুরু করুন, biggest savings এবং smallest blast radius।
  2. HTML template-এর data interface নিন, অর্থাৎ যে variables interpolate করে, এবং ছোট mapToDocumentRequest(data) function লিখুন।
  3. Playground-এ iterate করুন যতক্ষণ output match না করে।
  4. Production-এ A/B করুন: দুই weeks 5% traffic gPdf-এ route করুন। PDFs diff করুন। Bills compare করুন।
  5. Data অনুযায়ী roll forward বা roll back করুন, vibes অনুযায়ী নয়।

আমরা teams-কে এক sprint-এ এটা করে পরের মাসে PDF bill-এর 90% বাঁচাতে দেখেছি। আবার teams-কে বুঝতে দেখেছি যে তাদের workload সত্যিই HTML-to-PDF case, এবং তারা DocRaptor-এ থেকেছে; সেটাও সঠিক decision।

TL;DR

DocRaptorgPdf
Best atArbitrary content-এর জন্য HTML → PDFStructured documents-এর জন্য JSON → PDF
Price (100K pages/mo)$89$5
p50 render250-800 ms3-8 ms
Edge-deployedনা, centralisedহ্যাঁ, 300+ Cloudflare colos
Async + storageহ্যাঁ, includedনা, stateless by design
PDF/A + Factur-XPrince extensions দিয়েbuilt-in

আপনার documents যদি renderer-এর জন্য HTML পরা structured data হয়, তাহলে আপনি এমন translation step-এর জন্য pay করছেন যার দরকার নেই। Playground try করুন: আপনার invoices-এর একটি JSON-এ describe করুন, browser-এ 5 ms-এর কমে render করুন, এবং দেখুন gap আপনার gut-এর সঙ্গে মেলে কি না।