Hiberius

Bank Statement To Table — Development skill for Claude Code

Development community

Agent Skill that converts a bank statement PDF into a spreadsheet and then proves the extraction is correct against the statement's own running balance.

How to install Bank Statement To Table

This entry records only its repository, not the path inside it, so there is no exact command to give. Open Hiberius/bank-statement-to-table and copy the folder into ~/.claude/skills/, or the file into ~/.claude/agents/.

What Bank Statement To Table does

Agent Skill that converts a bank statement PDF into a spreadsheet and then proves the extraction is correct against the statement's own running balance. European and Anglo formats, multi-line descriptions, scans. Entirely offline, zero dependencies.

Alternatives in Development

  • Spreadsheet — Create, edit, analyze, and visualize spreadsheets with formulas 14.6k ★
  • n8n MCP Tools Expert — MCP tools guide with tool selection and node formats 3.6k ★
  • Octo Docs — Document delivery with export to PPTX, DOCX, PDF formats 2.8k ★

README

Bank Statement to Table

**An Agent Skill that turns a bank statement into a spreadsheet and then proves the result is correct, using the statement's own running balance. European and Anglo number formats, multi-line descriptions, page breaks, scans. Entirely offline.**

[![License: MIT](https://img.shields.io/badge/License-MIT-2ea44f.svg)](LICENSE) ![Python 3.8+](https://img.shields.io/badge/python-3.8%2B-3776AB?logo=python&logoColor=white) ![Zero dependencies](https://img.shields.io/badge/dependencies-0-6E56CF) ![Offline](https://img.shields.io/badge/network-never-8f9bb8)

npx skills add Hiberius/bank-statement-to-table

Anyone can extract. The question is whether it is right

pdftotext -layout statement.pdf - > statement.txt
python3 scripts/statement.py parse  statement.txt --out rows.csv
python3 scripts/statement.py verify rows.csv --opening 1240.55 --closing 2103.11
rows                7 (7 carry a balance)
chain checks        6
chain breaks        0
sum of movements    862.56
opening + movements 2103.11
stated closing      2103.11
difference          0.00

VERIFIED: the parse reproduces the statement exactly.

Every running balance must equal the previous balance plus the movement. That is not a convention, it is what a balance is. So the parse either reproduces the chain from the opening balance to the closing balance, or it is wrong and the chain says which row.

Change one digit and:

NOT VERIFIED: the parse does not reproduce the statement.

  break at row 1, 2026-06-03  PAGAMENTO POS SUPERMERCATO
    2740.55 -8.24 should give 2732.31, the statement says 2658.15 (off by -74.16)
    hint: the difference equals the amount on 2026-06-05: that row is probably
          duplicated or missing

Two decisions made once, never per row

`01/06` is ambiguous and no cleverness resolves a single row: if any date in the file has a first component above 12, the whole document is day-first. Deciding per row silently sw