Evidence · first-party tested/Best AI Tools for Extracting Structured Data from PDFs and Business Documents
Reconstructs the bank statement into the requested nested JSON hierarchy, with distinct statement.metadata, account_holder.address, account, branch, statement_period, and balances objects rather than flat OCR text.
What was measured
Schema Adherence
Does the output follow the supplied JSON schema hierarchy exactly, with correct nesting, field names, and data types?
decisive for this rankingtransformation
If the output does not match the requested JSON schema exactly, the extracted data cannot be reliably consumed or queried, so this is core to the task. (3 of 3 judges)
What was given, what came back
Test input: Bank Statement PDF · pdf · group: financial-document-extraction
Input — what we sent

Research media bank statement 2 jul.png
Bank Statement PDF
A 4-page bank statement PDF with 51 transactions, balances, rewards, and disclaimer text, used to test schema-driven extraction of dense financial tables and multi-page continuity.
Why this input is hard
- · Table extraction across 50+ transaction rows
- · Multi-page continuity with BALANCE FORWARD bridges
- · Structured metadata vs. free-text transaction descriptions
- · Numerical accuracy for balances, deposits, withdrawals, and summaries
- · Nested schema population for account, branch, balances, rewards, and disclaimers
Output — unretouched


Also checked on this input — same tool, 4 other criteria
Extraction Accuracy✓ WorkedExtracts the statement’s top-level values with the correct content and precision, including bank_name "Standard Chartered", statement_date "16 Jul 2019", currency "INR", account number "42710540422", opening balance 114453.65, and closing balance 116149.46.Semantic Field Enrichment✗ FailedDoes not preserve source-derived transaction identifiers; it normalizes them into sequential transaction_id values such as "2", "3", and "4", so the embedded IDs in the descriptions cannot be traced back directly.Semantic Field Enrichment✓ WorkedAdds meaningful transaction_type labels to extracted rows, classifying the sample 18 Jun records as Withdrawal, Withdrawal, and Deposit instead of leaving the field as raw OCR text.Table & Record Completeness✓ WorkedPreserves the full transaction table as 51 separate statement records, without merging rows or dropping entries.
Provenance
- Observation
- 91f210ef-e7ef-4d23-a3c8-badb7719e663
- Evidence run
- ec4d736d-95f9-4c88-884c-e280435f7b7b
- Study
- Extract and query structured data from documents using natural language
- Research task
- 86b9y25e5
- Tested at
- not recorded
- Source
- first-party
- Evidence state
- verified
- Proof shown
- input + output shown
- Cost / latency
- not captured
- Repeat run
- not captured
- Tester
- not captured
The last three rows are honest blanks, not placeholders — our capture has no field for them yet.
Query this
get_evidence({
tool: "landing-ai",
scenario: "financial-document-extraction"
})MCP · mcp.aidemos.com/api/mcp
Free with attribution.
Same input, same check — 7 other tools
measured on Schema Adherence
Datalab✓ WorkedMaps the bank statement into the requested nested JSON hierarchy instead of flattening it into OCR text, and preserves field-level citation metadata on the extracted objects.Extend AI✓ WorkedThe bank output is rebuilt as nested JSON rather than raw OCR, with branch, account, rewards, balances, summary, and metadata objects populated under the requested statement root.LlamaParse✓ WorkedKeeps a nested statement schema intact, emitting separate metadata, account_holder, account, branch, statement_period, balances, transactions, summary, rewards, and disclaimers objects instead of flattening the document.Nanonets✓ WorkedIt preserves the requested nested schema directly in the output, populating structured objects such as statement, account, balances, transactions, summary, rewards, and disclaimers instead of flattening the document into OCR text.Reducto✓ WorkedReconstructs the bank statement into a nested JSON structure aligned to the requested schema, with document metadata, account, branch, statement period, transactions, summary, and rewards-style sections instead of flat OCR text.Retab✓ WorkedReconstructs dense statement OCR into the requested nested JSON hierarchy, populating separate statement, account_holder, account, branch, balances, transactions, rewards, and disclaimers objects instead of flattening everything into text.Unstract✓ WorkedPreserves the requested nested statement hierarchy instead of flattening it, with separate metadata, account_holder, account, branch, balances, transactions, summary, and other top-level sections.
This evidence is published in
Real inputs and real outputs, no retouching · every cell queryable via API & MCP · aidemos.com