Bank Statement Test Pack: statement PDFs with the right answer
A set of fictional bank statement PDFs, each with a CSV of every transaction it really contains — date, description, signed amount, balance. It is for people who build things that read statements: OCR, expense tools, accounting imports, statement parsers. You run your reader on the PDF and compare its output with the CSV, row by row.
The full pack is 24 statements in six layouts. Three samples are free to download below.
What is in it
Each statement comes as a text PDF (not a scan) and a UTF-8 CSV with these columns: date (YYYY-MM-DD), description as printed, amount in the account's currency with money out negative, currency, balance after the row where the statement prints one, and original_amount and original_currency on rows charged in another currency. A manifest lists every statement with its pages, rows, opening and closing balances, and the traps it contains.
| Layout | Currency | Dates | How money out is shown |
|---|---|---|---|
| Signed amount and balance | USD | MM/DD/YYYY | a minus in front |
| Sections that set the sign, with totals | USD | MM/DD, no year, December into January | by the section heading |
| Withdrawal and deposit columns, page totals | AUD | DD MON, the year on its own line | by the column |
| Foreign-currency rows, overdrawn balance | SGD | DD/MM/YYYY | by the column; overdrawn as 1,234.56- |
| Card statement | USD | D-Mon, the year only in the period | money in marked CR |
| Decimal comma, Spanish headings | EUR | DD.MM.YYYY | in brackets, (1.234,56) |
Each layout comes in four lengths, from a single page to a year-end statement of eight or nine pages, so the table runs over page breaks with its heading repeated. Between them the statements cover the six traps a reader most often trips on: rows in more than one currency, tables continued across pages, total and sub-total lines that are not transactions, money out written without a minus, dates without a year or in a local order, and accented descriptions that turn to nonsense when a CSV is opened in the wrong encoding.
Everything in it is invented
No real statement was used. The banks, holders, merchants and amounts are made up, every page says it is a fictional test statement, and the account and routing numbers are made to fail their check digits — an ABA routing number whose last digit is wrong, an IBAN whose mod-97 check does not come out — so none of them can be a working number. The layouts are of the kinds statements commonly take; no bank's own layout, wording or name is copied.
It is also not tuned to LedgerDrop. LedgerDrop's own converter does not read all of it without help, which is the point of a test set.
Free samples
- Sections that set the sign, two pages: PDF · CSV
- Foreign-currency rows and an overdrawn balance, two pages: PDF · CSV
- Decimal comma, Spanish headings and accented descriptions, one page: PDF · CSV
- The manifest of the whole pack
What is in each sample
The columns of each sample CSV, the type of what is in them, and its first 5 rows, exactly as the file has them.
Sections that set the sign, two pages
80 rows, dated to , in USD. Pack built .
| Column | Type | Example |
|---|---|---|
date | date, YYYY-MM-DD | 2025-12-07 |
description | text | TRANSFER FROM RIVERSIDE UTILITIES |
amount | number, two decimals, signed | 2026.00 |
currency | currency code, three letters | USD |
balance | empty in this sample | |
original_amount | empty in this sample | |
original_currency | empty in this sample |
| date | description | amount | currency | balance | original_amount | original_currency |
|---|---|---|---|---|---|---|
| 2025-12-07 | TRANSFER FROM RIVERSIDE UTILITIES | 2026.00 | USD | |||
| 2025-12-09 | TRANSFER FROM CITYLINK TRANSIT | 707.04 | USD | |||
| 2025-12-12 | TRANSFER FROM CITYLINK TRANSIT | 1788.40 | USD | |||
| 2025-12-15 | TRANSFER FROM BLUEJAY STREAMING | 735.16 | USD | |||
| 2025-12-18 | TRANSFER FROM NORTHWIND PAYROLL | 3087.72 | USD |
Foreign-currency rows and an overdrawn balance, two pages
80 rows, dated to , in SGD. Pack built .
| Column | Type | Example |
|---|---|---|
date | date, YYYY-MM-DD | 2026-05-01 |
description | text | PAPERCRANE BOOKS 4218 |
amount | number, two decimals, signed | -263.21 |
currency | currency code, three letters | SGD |
balance | number, two decimals, signed | 52.45 |
original_amount | number, signed; blank on some rows | -29475 |
original_currency | currency code, three letters; blank on some rows | JPY |
| date | description | amount | currency | balance | original_amount | original_currency |
|---|---|---|---|---|---|---|
| 2026-05-01 | PAPERCRANE BOOKS 4218 | -263.21 | SGD | 52.45 | -29475 | JPY |
| 2026-05-01 | CORNER GROCER 3073 | -139.33 | SGD | -86.88 | ||
| 2026-05-01 | HARBOUR PHARMACY 5034 | -258.04 | SGD | -344.92 | ||
| 2026-05-02 | TRANSFER FROM HILLTOP FUEL | 2156.13 | SGD | 1811.21 | ||
| 2026-05-02 | SUMMIT GYM 4095 | -159.41 | SGD | 1651.80 |
Decimal comma, Spanish headings and accented descriptions, one page
14 rows, dated to , in EUR. Pack built .
| Column | Type | Example |
|---|---|---|
date | date, YYYY-MM-DD | 2026-06-01 |
description | text | Señora García Alquiler 2640 |
amount | number, two decimals, signed | -296.38 |
currency | currency code, three letters | EUR |
balance | number, two decimals | 5603.93 |
original_amount | empty in this sample | |
original_currency | empty in this sample |
| date | description | amount | currency | balance | original_amount | original_currency |
|---|---|---|---|---|---|---|
| 2026-06-01 | Señora García Alquiler 2640 | -296.38 | EUR | 5603.93 | ||
| 2026-06-03 | Ölmühle Görtz 7007 | -330.58 | EUR | 5273.35 | ||
| 2026-06-05 | Café Müller 3073 | -80.37 | EUR | 5192.98 | ||
| 2026-06-07 | Transferencia recibida Café Müller | 1630.51 | EUR | 6823.49 | ||
| 2026-06-09 | Café Müller 1763 | -283.49 | EUR | 6540.00 |
Want the whole pack, or a layout it does not have yet? Request the full pack
This opens your own mail program, addressed to [email protected]. Pressing it is counted once, anonymously, as described on the privacy page; nothing you write is part of that count.
Who it is for
Teams building or buying a statement reader, who need statements they are allowed to share in a bug report, a vendor trial or a test suite, with an answer they can check against. A real customer's statement can be none of those things.
Converting your own statement instead? LedgerDrop's converter reads it in your browser, and the layouts it is tested on are listed by country.