Skip to content
New: ask the Rexfin Analyst Agent about your model. Every figure comes back cited.
· 6 min read

From PDF Drop to Typed Filing: How Rexfin Reads a Document In

Rexfin mints a stable ID for every filing, tells scanned pages from digital ones, and locates each statement by header and period, or refuses the file rather than guess.

By The Rexfin team

Drop a 10-K, an annual report, or a scanned statutory filing into most finance tools and you get a black box: some pages get read, some numbers show up, and there’s no visible account of what the tool decided a page actually was. Rexfin’s intake step is the opposite of that: every document gets an identity, a classification, and a page-level map before a single number is allowed to enter the model.

Every document gets one identity, forever

The first thing that happens to a PDF is not extraction. It’s identity. Rexfin hashes the file’s bytes into a content-addressed doc_id: the same PDF uploaded twice, by two people, on two days, resolves to the same ID rather than creating a duplicate record. That ID, paired with a page number, becomes the citation address every other part of the product points back to: the badge on a number in the statement grid, the source link in the provenance drawer, all of it traces to (doc_id, page).

Alongside the ID, intake captures the filing’s own metadata: currency, reporting scale, whether it’s audited, which accounting framework it claims, and where it came from. None of that is inferred later from context; it’s read off the filing at the door.

Digital or scanned, the page still has to be located

Not every filing has a usable text layer. Some are digital PDFs with clean embedded text; some are fully scanned images with nothing machine-readable at all; a growing number are somewhere in between: a digital cover page in front of scanned statement faces, or an English section buried behind pages of Arabic. Intake detects which situation it’s looking at before deciding how to read it.

For digital pages, statement regions (balance sheet, income statement, other comprehensive income, changes in equity, cash flow) are located by anchored header text plus the period banner above the columns, so the target is a statement, not a fixed page number that breaks the moment a filing’s layout shifts. For scanned pages, the same regions are found by OCR-ing the title band of each page, using word matching that doesn’t care about word order, because OCR on a scanned heading routinely scrambles it. A bilingual annual report with its English statement faces sitting dozens of pages into the document, after a long Arabic section, is exactly the layout this is built for: intake keeps scanning while a required statement is still missing, rather than stopping at a fixed page window.

The default is refusal, not a guess

The instinct in most ingestion pipelines is to extract something rather than nothing. Rexfin’s intake does the opposite when it isn’t confident. If a filing’s format doesn’t match any recognized entity profile, or a page can’t be classified with a real title match, it gets quarantined rather than force-fit into a region. A scanned notes page that happens to mention “cash flow” in passing doesn’t get glued onto the actual cash flow statement: the classifier requires the actual title word and excludes anything carrying a notes header, specifically so a plausible-looking false match doesn’t open a region that shouldn’t exist.

That same fail-closed posture applies to the fiscal year itself. Filings carry comparative years and predecessor-auditor dates that can look like the reporting year if you take the first date on the cover page; intake takes the latest plausible December year-end instead, and rejects a non-December year-end rather than guess at it.

Why this matters before you’ve seen a single number

Nothing downstream is trustworthy if intake got the page wrong. The multi-backend extraction step that reads a page for values only works if it’s reading the right page for the right statement in the first place. The IFRS tagging that turns a printed label into a canonical concept only works if that label was pulled from a correctly identified statement face, not a stray note or a comparative column mislabeled as the current year.

This is also what makes multi-year analysis possible without re-running everything from scratch: because intake ties each filing to its actual fiscal year rather than a hardcoded one, the same pipeline holds cited actuals across years instead of needing a bespoke rebuild every filing season.

Who this is for

Anyone who has watched a finance tool confidently mislabel a comparative column as this year’s actuals, or extract a number from a notes page it mistook for the balance sheet. If you need to trust that “FY2024 revenue” actually came from the FY2024 income statement and not a scanned artifact, intake is the layer doing that checking before you ever see the figure. See how this connects to the rest of the pipeline at the product tour hub, or book a demo to watch a scanned, bilingual filing go through intake live.

Part of Rexfin Product Tour: Every Number Traceable

Keep reading

Book a demo

See your numbers tie out.

Book a 30-minute demo. Bring a question you can never answer fast enough, and we will model it live against real financial data.