Scan in. Searchable PDF and indexed fields out.
Four scanned documents — an English invoice, a contract page, a Spanish delivery note and a handwritten-field expense claim — went through a single pipeline: stored, OCR'd, classified, extracted, validated and indexed. None of them had a text layer. Every figure below was pulled out of an image.
2:10, no audio. The middle section is the actual pipeline running, not an animation.
The four stages
What came out
| document | type | lang | counterparty | number | date | total | OCR chars |
|---|---|---|---|---|---|---|---|
| Supplier invoice | invoice | en | Halverson Architects Ltd | INV-2026-0417 | 2026-09-14 | GBP 2,086.80 | 710 |
| Contract page | contract | en | Meridian Health / Calder Systems | — | 2026-10-01 | USD 84,000.00 | 988 |
| Delivery note | delivery_note | es | Hostelería del Norte S.A. | ALB-9931 | 2026-09-18 | EUR 3,613.50 | 681 |
| Expense claim | expense_claim | en | Fieldstone Engineering | — | 2026-09-29 | 388.59 (currency not stated) | 686 |
What it refused to be confident about
This is the part that separates extraction from guessing. Each document carries its own review flags:
| document | flags raised |
|---|---|
| Supplier invoice | VAT number contains spaces; bank sort-code/account separator ambiguous |
| Contract page | No document number present; three candidate dates (commencement and two signatures); the $84,000 is an annual licence fee, not a total contract value |
| Delivery note | Customer tax ID not stated; unit prices absent, only line totals; signature line present but nothing captured |
| Expense claim | Currency never stated in the document; line-item dates have no year; employee name field ambiguous in the OCR order |
The source scans
Image-only PDFs with scan artefacts — rotation, blur, speckle. Zero text layer. Open any of them and try to select text:
How this scales to the platform
This is the processing core, not the product. Scaling it is orchestration rather than new science: swap the OCR engine for Tesseract or a commercial SDK inside isolated containers and the pipeline is unchanged; replace the loop with a queue and a worker pool, which is where a 99.5% success rate is actually won or lost; expose the same engine through the API that the per-tool SEO pages call, so consumer tools and automation share one implementation; and attach deletion policy, regional processing and audit logging to the index row rather than to the app. Conversion engines are commodities — the orchestration, the cost per operation and the failure handling are the product.