Every backend eventually has to spit out a PDF — an invoice, a receipt, a report, a certificate. And in every language, the options are bad:

Headless Chrome / Puppeteer — you render HTML to PDF. Works until your data gets long: tables split across pages, fonts go missing, and you're babysitting a browser farm in production.

Native libraries (ReportLab in Python, PDFKit in Node, FPDF in PHP, gofpdf in Go) — you position everything by hand in code. Generic fonts, fragile layouts, and the design lives in your codebase forever.

There's a cleaner separation: design the document once, then feed it data over HTTP. Because it's just a REST call, the exact same approach works in any language.

The idea: template + data → PDF