18 — Document Processing
Worker-native document I/O. All generation runs at the edge — no Lambda, no container, no third-party conversion SaaS.
Sub-modules
pdf-generation.md— CF Browser Rendering → PDF + pdf-lib fallbackpdf-parsing.md— text + table extraction for RAG ingestiondocx-xlsx.md— DOCX (docx library) + XLSX (exceljs) generation in Workerspptx-generation.md— PPTX via pptxgenjs in Workers
Decision tree
Need document output?
├── PDF (invoice / receipt / report)
│ ├── Complex layout (HTML → PDF) → CF Browser Rendering
│ └── Programmatic (no layout) → pdf-lib in Worker
├── DOCX / XLSX (data export / mail merge)
│ ├── DOCX → docx library (pure JS, Worker-compat)
│ └── XLSX → exceljs (no canvas dep, Worker-compat)
└── PPTX (slide deck / pitch deck)
└── pptxgenjs (Worker-compat, no native deps)
Need document input (RAG)?
├── PDF text → pdf-parse (pure JS) or Workers AI document extraction
└── Tables → structured JSON → D1 or Vectorize
Cloudflare primitives used
CF Browser Rendering— puppeteer-compatible Workers binding for HTML → PDFR2— store and serve generated documentsD1— job state + document metadataWorkers AI— optional OCR for scanned PDFs (Llama Vision)Queues— async generation jobs (large reports)
Use case map
| Use case | Format | Method |
|---|---|---|
| SaaS invoice | pdf-lib → R2 | |
| Tax receipt (nonprofit) | CF Browser Rendering → R2 | |
| Donor annual report | CF Browser Rendering (full layout) | |
| Financial export | XLSX | exceljs → R2 |
| Grant application | DOCX | docx → R2 |
| Board slide deck | PPTX | pptxgenjs → R2 |
| RAG: donor docs | Text | pdf-parse → Vectorize |
Cross-links
rules/cloudflare-lock-in-is-leverage.md— CF Browser Rendering over puppeteer SaaSrules/feature-flags.md— gate new doc types behind flag before GA13-observability-and-growth/— track document generation events in PostHog08-deploy-and-runtime-verification/— smoke-test R2 presigned URL after deploy