Bank statement PDF into a CSV, and proof it read it right

Drop a PDF statement. This pulls out the transactions and hands back a CSV. Then it does the thing most converters cannot, and chains every amount it read against the statement's own running balance. If the chain closes, the extraction is correct, and you are not being asked to take anyone's word for it.

No server, no account, no network calls once this page has loaded. A bank statement is about as sensitive as a document gets, so check the Network tab rather than believing this sentence.

How the balance column proves the extraction

Every converter can produce rows. The question nobody answers is whether the rows are right. A silently dropped transaction looks exactly like a statement that never contained one, which is why the error survives so long.

A statement carries its own answer key. If the balance after each line equals the balance before it plus the amount on it, then every amount was read correctly, in order, with nothing missed and nothing invented. So each row is chained, and you are told plainly whether it closed. When it does, the count of transactions is not a claim; it is arithmetic.

The chain does more than check. Plenty of statements print amounts without signs and rely on the column they sit in, which is the usual reason a converted CSV comes out with deposits and withdrawals scrambled. Here the direction of the balance movement sets the sign, because a balance cannot be ambiguous about which way the money went.

The second button loads the same statement with one figure transposed: 4,660.74 printed as 4,606.74. That error is divisible by nine and uses exactly the same digits, which is why it survives most sanity checks and why a person proof-reading a column of numbers slides straight past it. The chain refuses it, names the row, and puts the balance-derived amount in the CSV rather than the printed one. A check that cannot fail is not a check, so it is worth watching this one fail.

What gets skipped, and why you can see it

A row is only taken when the line begins with a date. That is what keeps the summary panel out. "Total deposits and credits" carries a perfectly good money amount and is not a transaction, so an extractor that grabs every number on the page swallows it and is then wrong by exactly that much.

Everything not taken is listed underneath, verbatim. That list is the honest part of this tool: if something you expected is sitting in it, you know immediately, rather than discovering it in three months when an account does not reconcile.

What it does not do

Scanned statements are images with no text to read, so they need OCR and are reported as unreadable rather than guessed at. Statements with no running balance still convert, but the proof is unavailable, and the page says so instead of implying everything is fine. Nothing is written anywhere; the CSV is built in the page and saved by your browser.