PDF generation API বেছে নেওয়া প্রথমে সহজ মনে হয়। কিন্তু বাজারে অনেক vendor, তাদের marketing copy প্রায় একই, আর আসল tradeoff দেখা যায় production-এ কয়েক হাজার document render করার পর।
এই checklist vendor evaluation-এ ব্যবহার করার মতো। এটি কোনো vendor-এর পক্ষে নয়; procurement ও post-mortem-এ teams যে সমস্যাগুলো দেখে, সেখান থেকে নেওয়া। আটটি প্রশ্নের পরিষ্কার উত্তর না পেলে সিদ্ধান্ত নেওয়ার মতো তথ্য আপনার নেই।
১. Input format কী: HTML, JSON, নাকি template DSL?
এটাই সবচেয়ে গুরুত্বপূর্ণ প্রশ্ন। কারণ এটি ঠিক করে আপনার team কী লিখবে এবং রাত দুইটায় কী debug করবে।
- HTML/CSS (Puppeteer, DocRaptor, Prince): পরিচিত, খুব flexible, runtime-এ ব্যয়বহুল, deterministic করা কঠিন।
- JSON / structured data (gPdf): render সস্তা, byte-identical output, তবে data model থেকে document model-এ mapper লাগে।
- Template DSL (PDFKit, ReportLab, Apache PDFBox): পুরো control, কিন্তু pagination, layout ও font fallback-এর পুরো দায়িত্বও আপনার।
সবার জন্য এক উত্তর নেই। আপনার team-এর জন্য ভুল উত্তর থাকতে পারে। Engineers-কে জিজ্ঞেস করুন: তিন ঘণ্টার pagination bug তারা কোন model-এ debug করতে চাইবে?
২. Cold-start latency কত এবং predictable কি?
কিছু renderer microseconds-এ boot করে, বিশেষ করে WASM বা native binary। Chromium-based renderer seconds নিতে পারে। traffic spike না আসা পর্যন্ত পার্থক্য বোঝা যায় না।
Vendor-কে জিজ্ঞেস করুন:
- “Cold worker-এর first request p99 latency কত?”
- “শেষ request-এর কত পরে worker আবার cold হয়?”
- “Cold-start data সহ status page আছে?”
সংখ্যা না পেলে ধরে নিন উত্তর ভালো নয়।
৩. Per-render cost কীভাবে model করা হয়?
তিন ধরনের মডেল বেশি ঝামেলা করে:
- Per-page pricing: predictable, budget সহজ, scale-এ ব্যয়বহুল।
- Subscription + overage: অনেক volume-এ সস্তা, কিন্তু usage estimate দরকার।
- Compute-based pricing: Lambda/container/Chromium memory/cold start-এর bill সরাসরি আপনার।
বর্তমান, 5x এবং 50x traffic-এ actual bill হিসাব করুন। Cost curve headline price-এর চেয়ে বেশি গুরুত্বপূর্ণ।
৪. Output deterministic কি?
Same input থেকে same bytes — CI diff, tax/e-invoice retention, archive hash, legal review — এসব ক্ষেত্রে এটি দরকার।
Browser-based renderer Chromium patch version বদলালে deterministic থাকে না। Native renderer সাধারণত ভালো। সরাসরি প্রশ্ন করুন: “Renderer update হলে output bytes বদলাবে?”
৫. Fonts, CJK এবং RTL কীভাবে handle করে?
Font সমস্যা PDF system-এর সবচেয়ে সাধারণ production surprise। Local market-এ সব ঠিক, তারপর নতুন script দরকার হলে PDF-এ □□□□ দেখা যায়।
জিজ্ঞেস করুন:
- কোন scripts extra config ছাড়া bundled?
- Unknown glyph fallback হবে নাকি tofu?
- Request time-এ custom font দেওয়া যায়?
- RTL shaping supported?
ভালো উত্তর NotoSans CJK, fallback set এবং unknown glyph behavior পরিষ্কারভাবে বলে।
৬. Compliance profiles কোনগুলো supported?
EU invoice, PDF/A archival, attached XML medical record বা digital signature দরকার হতে পারে? তাহলে native support জিজ্ঞেস করুন। “পরে অন্য tool দিয়ে convert করুন” মানে multi-step pipeline এখন আপনার দায়িত্ব।
ভালো উত্তর সাধারণত flag-এর মতো: { profile: "PDF/A-3b" } অথবা { einvoice: { format: "factur-x", xml: "..." } }.
৭. Rendering stateless? Documents কোথায় যায়?
Stateless rendering-এ request আসে, PDF বের হয়, কিছু store হয় না। Persistence আপনি নিজে করেন। Regulated workloads-এর জন্য এটি ভালো।
Stateful rendering-এ vendor PDF store করে signed URL দেয়। Casual workflow-এ সুবিধাজনক, কিন্তু regulated workflow-এ third party আপনার document copy রাখে।
জিজ্ঞেস করুন কোথায় store হয়, কতদিন থাকে, এবং stateless rendering-এর written guarantee পাওয়া যায় কি না।
৮. Renderer fail করলে কী হয়?
সব renderer কখনো না কখনো fail করে। গুরুত্বপূর্ণ হলো failure কীভাবে দেখা যায়।
- Structured 4xx/5xx নাকি empty PDF?
- Retry idempotent?
- Failed render charge হয়?
- Status page, webhooks, region-wise p50/p99 metrics আছে?
- Vendor নিজে synthetic probe চালায়?
এখনই status page খুলুন। detail না থাকলে purchasing-এর পরও transparency এমনই হবে।
gPdf scorecard
| # | প্রশ্ন | gPdf উত্তর |
|---|---|---|
| 1 | Input | JSON DocumentRequest |
| 2 | Cold start | 5-20 ms, V8 isolate, browser নেই |
| 3 | Cost | $0/$5/$8/$12 per month; $0.00005/page overage |
| 4 | Determinism | একই engine version-এ byte-identical |
| 5 | Fonts | NotoSans CJK + Latin fallback embedded |
| 6 | Compliance | PDF/A-1b/2b/3b/4 + Factur-X / ZUGFeRD |
| 7 | Stateless | হ্যাঁ, document storage নেই |
| 8 | Failure | Public status page, structured errors, idempotent |
যেখানে gPdf কম উপযুক্ত: input যদি সত্যিই অপরিবর্তনীয় HTML হয়, DocRaptor বা Prince ভালো হতে পারে।
সারাংশ
“সেরা PDF API কোনটি” জিজ্ঞেস করবেন না। এই আট প্রশ্ন করুন, উত্তর score করুন, এবং আপনার workload-এর সঙ্গে মিলিয়ে vendor বাছুন। Invoices, receipts বা structured documents হলে Playground দিয়ে gPdf দ্রুত যাচাই করা যায়।