Extracting transactions from a PDF bank statement sounds simple: the table is right there on the page. Understanding why it is harder than it looks helps you choose the right tool and spot problems in the output.
What is actually inside a statement PDF
A PDF page is a list of drawing instructions: draw this text at these coordinates, in this font, draw a line here. There is no concept of a “row” or a “cell”. A single transaction might be stored as several text fragments, the fragments might be in any order, and the lines you see around a table may be purely decorative.
There are two main kinds of statement PDF:
- Digital PDFs generated by the bank’s systems. They contain real text you can select and search, which makes extraction reliable.
- Scanned PDFs made from paper. Each page is an image, so the text must first be recognised with OCR. See converting scanned statements.
A quick test: open the PDF and try to select a word. If you can highlight individual words, it is a digital PDF.
The extraction process
A robust extractor, whether it is a person or a program, follows roughly the same steps.
1. Rebuild lines of text
Fragments with the same vertical position form a line. Reading them left to right gives you something like “02/01/2024 UPI-GROCERY 1,250.00 8,750.00”.
2. Locate the columns
The heading row – Date, Description, Debit, Credit, Balance or the bank’s equivalents such as Narration, Withdrawals and Deposits – shows where each column starts and ends. Amounts are usually right-aligned under their heading.
3. Identify transaction rows
Most statements start each transaction with a date. Lines without a date directly below a transaction are usually a continuation of its description. Lines like “Page 2 of 5”, “Balance brought forward” or “Total” are not transactions and should be skipped.
4. Normalise the values
Dates such as “15 Jan 24”, “15/01/2024” and “2024-01-15” should become one consistent format. Amounts like “1,234.56 Dr”, “(45.00)” or “12.50-” need to become plain numbers in the right column.
5. Validate with the running balance
If the statement shows a balance after each transaction, every row can be checked: previous balance + credit − debit = new balance. Rows that fail the check point straight to extraction errors, and the check can also reveal whether an unsigned amount was money in or money out.
Doing it with FinParse
FinParse automates all five steps in your browser. It reports how many rows passed the balance check, marks the rest for review and lets you correct them before exporting to Excel or CSV. Read how the conversion works for more technical detail.
Common problems and fixes
- Missing rows: check whether the row has an unusual date format or no decimal amounts; add it manually if needed.
- Swapped day and month: switch the date format when prompted, or check a date after the 12th of the month.
- Merged descriptions: edit the row to split or shorten the text.
- Balance mismatches: usually one amount in the wrong column; fix it and the following rows will line up.