PDF Table & Bank-Statement Extractor avatar

PDF Table & Bank-Statement Extractor

Pricing

$30.00 / 1,000 page parseds

Go to Apify Store
PDF Table & Bank-Statement Extractor

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

Sparkfund HQ

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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
    Date / Description / Debit / Credit / Balance
    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).
  • 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

FieldTypeDefaultDescription
pdfUrlslist of URLsPublicly downloadable PDFs.
pdfBase64stringBase64 PDF (or KVS key). Takes precedence over URLs.
modeauto / tables / bank-statementautoDetection mode.
pagesstringall1-based page range like 1,3-5.
outputFormatjson / csv / xlsx-rowsjsoncsv writes one CSV per table to the key-value store.
includePageTextbooleanfalseAdds raw page text items for audit/debug.
minTableColumnsinteger2Discard 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\activate
pip install -r requirements.txt
python tests/make_fixture.py # synthetic 'Test Bank N/A' statement
cp INPUT.json storage/key_value_stores/default/INPUT.json
APIFY_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-check confidence.
  • 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.