Converters
Bank Statement Converter (PDF to CSV)
Convert a text-based bank statement PDF to CSV in your browser. Scanned statements are refused, not guessed at; only your saved column layout is uploaded.
The file
Drop a bank statement PDF here
Text-based PDFs only — the kind you download from online banking. If yours is a scan, this tool will say so rather than guess.
This PDF is read in this browser. It is never uploaded, and nothing from it is saved — not even on this device.
This tool turns a bank statement PDF into a CSV you can import into accounting software, and it does the two things a bookkeeper actually needs from a converter: it reads the file entirely in your browser, and it refuses to guess. If the PDF you drop in is a scanned image rather than a statement with real text underneath, the tool says so plainly and quotes exactly what it found instead of running the file through OCR and reporting numbers it isn't sure of. Everything else — which column is the date, which is the amount, how the dates are ordered — is a choice you make once by pointing at the columns, not a guess the tool makes for you. Below is how to read what it shows you at each step, what the refusal means when you hit it, and what the odd cases (no year on the date, a password-protected PDF, a statement that spans a year-end) actually require.
Why this tool refuses a scanned bank statement instead of reading it anyway
A statement PDF either carries a text layer — the actual characters, the kind you get from a statement downloaded through online banking — or it doesn't. If every page is an image, there's nothing to extract, and this tool says so: "This looks like a scan." That's not an error message; the tool ran correctly and is reporting a true fact about the file, which is why there's no "try again" button offered for that particular file. Underneath the heading it quotes what it actually found: if a page carries no text at all it says so, and if the only text on the page is something like a printed page number or a footer URL, it quotes that line back so you can check it against the page yourself rather than take "unreadable" on faith.
Some converters offer to run a scanned statement through OCR and quote a headline accuracy figure for the exercise. Even a good OCR pass still guesses at the individual digits on an image it can't verify, and a CSV built from that guess reads identically to one built from real transactions — there is no way to tell, after the fact, which rows it got wrong. Refusing outright is the more useful answer for a ledger: it tells you immediately that you need a different source file rather than letting a guessed digit slip into a client's books.
If a statement is only partly a scan — some pages carry real text, some don't — the tool doesn't refuse the whole file. It reports which pages had no readable text and offers to convert the rest, carrying the skipped-page count into the result so you know exactly how many pages' worth of transactions are missing from the CSV. If a scan really is all you have, run it through OCR software yourself first and convert the text result it produces; if you can get back into online banking, most banks offer a PDF or CSV download there that will have a genuine text layer.
Mapping columns: why nothing is guessed for you
Every extracted column starts out "Not used." The tool never assumes column 1 is a date because it looks like one, or that the rightmost number is the balance — a per-bank template is exactly the kind of guess that goes silently wrong the day a bank changes its statement layout, so there isn't one here. Instead, each detected column shows a few sample values pulled straight from your file, and you pick a role for it from a dropdown: Date, Description, Amount (signed), Money out, Money in, Balance, or Reference.
Amount (signed) and the Money out / Money in pair are mutually exclusive — pick one scheme and the other is greyed out with a note explaining why, rather than just vanishing. Assigning a role that another column already holds moves it there and clears the old column, and that change is announced so you don't lose track of a swap. A preview underneath shows the first few rows exactly as they'll come out — date, description, amount — so you can catch a wrong mapping before building the CSV rather than after. "Build CSV" stays disabled until a date column and a money column are both set, and while it's disabled it tells you the next thing to fix, one sentence at a time rather than a list of everything still missing.
Dates: day-first, month-first, and the Statement year field
Bank statements write dates in every order a bank has ever chosen, so this tool asks rather than assumes — with one exception that's arithmetic rather than a guess. If any date in your file has a day above 12 (19/03/2026, for instance), the order can only be day-first, and the tool pre-selects that option and shows you the row it worked it out from. If every date in the file is ambiguous (03/12/2026 could be either), neither option is pre-selected and you choose.
A separate problem shows up on statements that print "12 Mar" with the year only in the page header — common on UK statements. When the mapped date column has no year in it at all, a Statement year field appears beneath the date controls. The tool scans the rest of the statement's text for a year and, when it finds exactly one, pre-fills the field and quotes the line it came from — something like "Statement period 1 Mar 2026 to 31 Mar 2026" — so you can check it against the page in front of you rather than trust a bare number. If the statement spans a year boundary and two different years turn up, the tool reads down the date column, applies the earlier year until the months start running backwards, and the later year from that point on, and tells you how many rows got the later year. If the months in that column jump around more than once, the column isn't reliably in date order and the tool won't guess where the year changes — it blocks building the CSV and asks you to map a column that actually includes the year instead.
Password-protected and other unreadable PDFs
Several UK and EU banks encrypt statement PDFs by default, and an encrypted file can't be read at all until it's unlocked — this tool tells you plainly when that's what's happened, rather than reporting a generic failure. The fix is to open the PDF in a PDF reader, save an unlocked copy from there, and drop that copy in instead; it's the one error here with something you can actually do about it yourself.
A handful of other checks run before the file is even opened. A file that isn't actually a PDF — wrong leading bytes, whatever the extension says — is refused with that stated plainly, and anything over 25 MB is refused too, since a genuine text-layer statement is almost never that large. If the reader itself throws partway through, the message says the file may be damaged or built in a way the tool doesn't handle. In every one of these cases, nothing is uploaded first; the check happens on the file already sitting in your browser.
Skipped rows, skipped pages, and the balance check
A converter that silently drops a transaction is worse than one that refuses the whole file, so nothing here is dropped quietly. If a row has no date, or the amount or date in it can't be parsed, it's left out of the CSV and counted separately, with a "show the skipped rows" disclosure that lists exactly which rows and what was in them — so you can go and check the original statement rather than wonder what's missing.
Pages are a separate, more serious kind of loss, and they're never folded into the same sentence as skipped rows: if some pages of the PDF had no readable text at all, the result tells you how many and lists the page numbers, because a missing page is missing transactions you have no way to count from the CSV alone.
If you map a Balance column, the tool recomputes the running balance from the amounts on every row and compares it against what the statement actually printed. When they agree, it says so for every row; when they don't, it names the exact rows that disagree rather than a plain pass or fail — that's usually the fastest way to find a row where the date or amount column was mapped to the wrong place, or where a row got skipped that shouldn't have been.
Saved layouts: converting the same bank every month
Once you've mapped a statement, you can save the mapping as a named layout — "Barclays business — monthly," for instance — so you don't have to redo it next month. A saved layout is a label plus the column positions and the date-order and amount-sign choices you made; it is never any part of the statement itself. Every saved layout is shown on screen as one line naming exactly what it contains — something like "Barclays business — monthly · 6 columns · 1 Date · 3 Description · 5 Money out · 6 Money in · day-first dates" — so you can check for yourself that no date, payee or amount from your statement is in it, rather than take that on trust.
This is also the one place a distinction is worth stating plainly: the statement PDF itself is read in your browser and never uploaded anywhere, but a saved layout does leave the browser if you're signed in — it's written to your account so the same layout is there next month, on any device. Signed out, a layout is saved to this device only. Either way, that applies to the column mapping alone, never to the statement's contents.
When you open a new statement from the same bank, a layout that matches the file's column count is applied automatically and the tool says so, with a one-click way to clear it if it's not the right one. If more than one saved layout matches, you're offered a button for each rather than having one picked for you; if none matches, nothing is applied and nothing is said.
Opening the CSV in Excel, and importing it into QuickBooks or Xero
This tool writes a CSV, not an Excel workbook — there's no .xlsx output. A CSV opens directly in Excel all the same: double-clicking the downloaded file opens it as a spreadsheet, and using Data > From Text/CSV instead (or "Get Data" in newer versions) lets you control how each column is typed on the way in, which is worth doing for the date column specifically, since a plain double-click sometimes reads a YYYY-MM-DD date as text rather than as a date.
The CSV's shape is fixed so a monthly import mapping keeps working from one statement to the next: a header row of Date, Description, Amount, with Balance and Reference columns added only when you mapped those roles. Dates are always written YYYY-MM-DD, amounts are always signed with money out as a negative number and no currency symbol or thousands separator, and descriptions are quoted so a comma inside one doesn't split into two columns. Both QuickBooks and Xero accept a CSV of transactions through their own bank-statement or "upload transactions" import screens, where you'll be asked to match Date, Description and Amount to the columns in the file — the fixed header names and formats above are exactly what that mapping step expects.
Questions
- Why does this tool refuse to convert my scanned bank statement?
- Because there's nothing in a scanned page to extract. A PDF only has "text" if it carries a text layer — the actual characters, the kind a bank writes when you download a statement from online banking — and a scan is a picture of a page, not text at all. When the tool finds no page with a usable text layer it says so directly, "This looks like a scan," and quotes exactly what it did find: either nothing at all, or page furniture like a printed page number or footer URL, which is often the only thing that survives on an otherwise image-only statement. It doesn't offer to run OCR on it and take a guess, because a guessed digit in a bank statement is worse than no digit at all — it looks identical to a correct one in the finished CSV. If you can get back into online banking, look for a PDF or CSV download there; it will normally have a real text layer. If a scan really is all you have, run it through OCR software first and convert the text result, rather than expecting this tool to do that guessing for you.
- Why were some rows or pages skipped when I converted my statement?
- Two different things can happen, and the result screen reports them separately rather than as one number. A row is skipped when the column you mapped to Date, or the column mapped to a money role, doesn't contain something the tool can actually parse as a date or an amount on that specific row — a subtotal line or a stray note sitting inside the extracted table, for instance. Those rows are listed individually behind a "show the skipped rows" disclosure so you can see exactly what was in them. Separately, if one or more pages of the PDF had no readable text at all, the result names how many pages and lists their numbers — that's the more serious of the two, because a missing page is missing transactions you have no way to count from the CSV itself. Neither is ever hidden behind a plain "some rows were skipped" — the count and the specifics are both always shown when they're non-zero.
- What is the Statement year field for?
- It appears when the column you've mapped to Date prints something like "12 Mar" with no year attached — common on statements where the year only appears once, in the page header, rather than next to every transaction. Since the tool never invents a year from a file's metadata or the current date, it needs one from you or from the statement's own text. It scans the rest of the file for a year and, when it finds exactly one, pre-fills the field with it and quotes the line it read it from, so you can check it against the page rather than trust a bare number. If the statement crosses a year boundary — a December-to-January statement, say — and two different years appear in the file, the field applies the earlier one until the transaction dates start running backwards and the later one after that, and tells you how many rows got the later year. You can always type over whatever's pre-filled if it's wrong.
- Why does this tool say my bank statement PDF is password-protected?
- Because it is — several UK and EU banks encrypt statement PDFs by default when you download them, and an encrypted PDF can't be read at all until it's unlocked, by this tool or any other. The fix is straightforward: open the PDF in a PDF reader (the one built into your browser will usually do it once you've entered the password), save an unlocked copy from there, and drop that copy in here instead. This is the one error on this tool with something you can actually do about it yourself — the file isn't damaged and nothing else is wrong with it.
- Can I convert a bank statement PDF to Excel instead of CSV?
- Not directly — this tool writes a CSV file, not an .xlsx workbook. In practice that gets you most of the way there anyway: a CSV opens in Excel like any other file, either by double-clicking the download or, for more control over how the date and amount columns are typed on the way in, through Excel's Data > From Text/CSV import. If you specifically need a real .xlsx file with Excel formatting rather than a CSV that opens in Excel, you'd need to save it as one from within Excel after opening it — this tool doesn't produce that format itself.
- How do I import the CSV into QuickBooks or Xero?
- The same way you'd import any bank statement CSV — both QuickBooks and Xero have an upload-transactions or bank-statement import screen where you browse to a downloaded file and then match its columns to Date, Description and Amount. This tool's CSV is built to make that mapping step trivial: the header row is always Date, Description, Amount (with Balance and Reference added only if you mapped those roles), dates are always written YYYY-MM-DD, and amounts are always signed with money out as a negative number, so the same mapping should work again next month without changes.
- Can I convert a photo or JPG of my bank statement?
- No — a photo or a JPG is not a PDF, and the tool checks the file itself before trying to open it, so it says exactly that: "That file is not a PDF. This tool reads the PDF statements you download from online banking." Even if that check let it through, a photo wouldn't help: a JPG has no text layer at all, only pixels that happen to look like writing, which is the same problem a scanned PDF has, one step earlier. Go back into online banking and download the statement as a PDF rather than photographing a printed copy — that download will normally carry a real text layer this tool can read.
- Is this a general PDF converter — can it turn a PDF into Word, Excel, or an image?
- No. This tool does exactly one conversion — a bank statement PDF to a CSV of transactions — and it doesn't produce a Word document, an image, or a real .xlsx workbook, and it doesn't go the other way and build a PDF from an image either. If what you actually want is your statement's transactions in a spreadsheet, that's exactly what this tool is for — see the Excel question above for opening the CSV it produces. For general PDF-to-Word, PDF-to-image or image-to-PDF conversion, this isn't the right tool, and this site doesn't currently have one that is.