Try the editor, no sign-up. Open a sample report, change the data, and download a real PDF: https://pdfbolt.com/try
Templates use Handlebars. Your API call sends a templateId + JSON data. You update the template in the dashboard, your code never changes. Every edit auto-creates a draft, and you publish when ready. You can browse history and compare any two versions as rendered PDFs side by side. The comparison shows rendered PDFs, not just code. A one-line margin tweak can push a table onto the next page, and you won't catch that in code. You can roll back with one click if something breaks.
Right now template management lives in the dashboard. I'm working on an API so coding agents can create and version templates programmatically.
The part I went deepest on recently was compression. The compressor samples every 10th pixel to classify each image as bitonal, grayscale, or color, then picks an encoding per image. Bitonal gets CCITT Group 4 with Otsu's method for the threshold. Color and grayscale get JPEG. Images with alpha channels get split into RGB (JPEG, lossy) and mask (FlateDecode, lossless) via an SMask so edges stay sharp. Before any of that, MD5 hashes of raw streams deduplicate identical images across pages, and everything gets downscaled to target DPI.
Four tiers: lossless, low, medium, high. A 23 MB product catalog with photos dropped to 1.6 MB on high.
Built on Apache PDFBox. I looked at Ghostscript but it's AGPL, which doesn't work for a hosted SaaS.
I also support PDF/X-1a and PDF/X-4 for print with RGB to CMYK conversion and ICC profiles. Happy to talk about the color pipeline in comments.
Stack: headless Chromium via Playwright, Kotlin/Spring Boot, EU-hosted. I don't store template data after rendering.
Two-person team, bootstrapped.
Revenue: https://trustmrr.com/startup/pdfbolt
Free: 100 PDFs/month, no card
Docs: https://pdfbolt.com/docs
Ask me anything about compression internals, template versioning, color pipeline, or whatever.