Why PDF statements are hard to convert
A PDF does not contain a table in the way a spreadsheet does. It contains instructions to draw pieces of text at specific positions on a page. A row that looks like “15 Jan 2024 · Card payment · 25.00 · 975.00” may be stored as four separate fragments, in any order, with no marker that they belong together.
On top of that, statements have page headers and footers, column headings that repeat on every page, descriptions that wrap over two or three lines, and summary boxes with numbers that are not transactions.
How FinParse extracts transactions
- Read the text layer. PDF.js, the PDF engine used by Firefox, extracts every text fragment and its coordinates.
- Rebuild lines. Fragments that share a vertical position are grouped into lines and ordered left to right.
- Find the column headings. Headings such as Date, Narration, Withdrawals, Deposits, Amount or Balance tell the parser where each column sits.
- Detect transaction rows. A row starts with a date. Amounts are matched to the nearest money column; the remaining text becomes the description, including wrapped lines below it.
- Skip noise. Page numbers, repeated headings, totals and opening or closing balance lines are recognised and kept out of the table.
- Check the balances. Each balance is compared with the previous balance plus credits minus debits. If a statement has only one amount column without signs, the direction of each amount is worked out from the balance change.
Text-based vs scanned PDFs
A statement downloaded from online banking almost always has a text layer, and converts quickly and accurately. A scanned paper statement is just an image of each page. For those, FinParse offers optional OCR (optical character recognition) using Tesseract, which runs in your browser. OCR is slower, handles up to 25 pages, and may misread characters, so it is worth checking every row. Our guide on converting scanned statements has tips for better scans.
Known limitations
- Amounts must have two decimal places to be recognised reliably.
- Statements without column headings or running balances may need more manual review.
- Dates such as 03/04/2024 can be read day-first or month-first; you can switch if the guess is wrong.
- Very unusual layouts, such as rotated pages or multi-column statements, may not be detected.
When a statement cannot be read reliably, FinParse tells you instead of guessing, and you can still enter rows manually. Read the how-to guide for the full workflow.