PDF Table & Bank-Statement Extractor
Pricing
$30.00 / 1,000 page parseds
PDF Table & Bank-Statement Extractor
Extract tables & bank-statement transactions from PDFs into clean JSON, CSV, or XLSX-ready rows. Bank-statement mode with confidence scoring works even on line-less PDFs. No OCR: scanned pages are flagged, never guessed. Page selection supported.
Pricing
$30.00 / 1,000 page parseds
Rating
0.0
(0)
Developer
Sparkfund HQ
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Extract tables and bank-statement transactions from PDF files into clean, structured rows (JSON dataset, per-table CSV, or XLSX-ready row objects).
Text-layer first, honest fallbacks: this actor reads the embedded text of the PDF with pdfplumber. It does not run OCR — scanned-image pages are reported as skipped with a clear warning rather than silently returning garbage.
What it does
- Generic table extraction — ruled-line tables via pdfplumber's default strategies; for line-less layouts (common in bank statements) it falls back to word-position clustering.
- Bank-statement heuristic mode — detects style layouts, anchors columns on the header row, routes amounts to debit/credit/balance columns and text to description, and tags results with a confidence score (0–1).Date / Description / Debit / Credit / Balance
- Multiple input methods — public PDF URLs (
pdfUrls) or a base64-encoded upload / key-value-store key (pdfBase64). - Page selection — e.g.
"1,3-5". Only parsed pages count toward billing.
Input
| Field | Type | Default | Description |
|---|---|---|---|
pdfUrls | list of URLs | — | Publicly downloadable PDFs. |
pdfBase64 | string | — | Base64 PDF (or KVS key). Takes precedence over URLs. |
mode | auto / tables / bank-statement | auto | Detection mode. |
pages | string | all | 1-based page range like 1,3-5. |
outputFormat | json / csv / xlsx-rows | json | csv writes one CSV per table to the key-value store. |
includePageText | boolean | false | Adds raw page text items for audit/debug. |
minTableColumns | integer | 2 | Discard narrower tables. |
Output
Dataset items:
{"source": "statement.pdf","page": 1,"kind": "bank_statement","tableIndex": 0,"columns": ["Date", "Description", "Debit", "Credit", "Balance"],"rows": [{"Date": "01/03/2026", "Description": "OPENING BALANCE","Debit": "", "Credit": "", "Balance": "2,450.00"}],"rowCount": 9,"confidence": 0.986}
kind is one of bank_statement, table, no-table, skipped
(scanned/no text layer), error, or page_text. Warnings are attached
per item when something is off (forced-mode low confidence, header-only
tables, missing text layer, etc.).
Example run (local)
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activatepip install -r requirements.txtpython tests/make_fixture.py # synthetic 'Test Bank N/A' statementcp INPUT.json storage/key_value_stores/default/INPUT.jsonAPIFY_LOCAL_STORAGE_DIR=storage python -m src.main # or: apify run
Limitations (honest list)
- No OCR. Scanned PDFs return
kind: "skipped"items. - Line-less extraction relies on layout geometry; heavily multi-column
statements may need
mode: "bank-statement"or produce lower-confidence output. Always sanity-checkconfidence. - Amounts are returned as strings exactly as printed (
$, commas, parentheses for negatives preserved). - Multi-page statements are extracted per page; running balances that continue across pages are not merged.
Pricing
Pay-per-event metadata is prepared in .actor/actor.json
(PAGE_PARSED @ $0.03/page) but disabled until an Apify developer
account exists; enable it in Apify Console before publishing.
Status
v0.1.0 — local smoke-tested only. See QA.md for what has and has not been
tested on the Apify platform.