LedgerDrop

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.

LayoutCurrencyDatesHow money out is shown
Signed amount and balanceUSDMM/DD/YYYYa minus in front
Sections that set the sign, with totalsUSDMM/DD, no year, December into Januaryby the section heading
Withdrawal and deposit columns, page totalsAUDDD MON, the year on its own lineby the column
Foreign-currency rows, overdrawn balanceSGDDD/MM/YYYYby the column; overdrawn as 1,234.56-
Card statementUSDD-Mon, the year only in the periodmoney in marked CR
Decimal comma, Spanish headingsEURDD.MM.YYYYin 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

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 .

ColumnTypeExample
datedate, YYYY-MM-DD2025-12-07
descriptiontextTRANSFER FROM RIVERSIDE UTILITIES
amountnumber, two decimals, signed2026.00
currencycurrency code, three lettersUSD
balanceempty in this sample
original_amountempty in this sample
original_currencyempty in this sample
datedescriptionamountcurrencybalanceoriginal_amountoriginal_currency
2025-12-07TRANSFER FROM RIVERSIDE UTILITIES2026.00USD
2025-12-09TRANSFER FROM CITYLINK TRANSIT707.04USD
2025-12-12TRANSFER FROM CITYLINK TRANSIT1788.40USD
2025-12-15TRANSFER FROM BLUEJAY STREAMING735.16USD
2025-12-18TRANSFER FROM NORTHWIND PAYROLL3087.72USD

Foreign-currency rows and an overdrawn balance, two pages

80 rows, dated to , in SGD. Pack built .

ColumnTypeExample
datedate, YYYY-MM-DD2026-05-01
descriptiontextPAPERCRANE BOOKS 4218
amountnumber, two decimals, signed-263.21
currencycurrency code, three lettersSGD
balancenumber, two decimals, signed52.45
original_amountnumber, signed; blank on some rows-29475
original_currencycurrency code, three letters; blank on some rowsJPY
datedescriptionamountcurrencybalanceoriginal_amountoriginal_currency
2026-05-01PAPERCRANE BOOKS 4218-263.21SGD52.45-29475JPY
2026-05-01CORNER GROCER 3073-139.33SGD-86.88
2026-05-01HARBOUR PHARMACY 5034-258.04SGD-344.92
2026-05-02TRANSFER FROM HILLTOP FUEL2156.13SGD1811.21
2026-05-02SUMMIT GYM 4095-159.41SGD1651.80

Decimal comma, Spanish headings and accented descriptions, one page

14 rows, dated to , in EUR. Pack built .

ColumnTypeExample
datedate, YYYY-MM-DD2026-06-01
descriptiontextSeñora García Alquiler 2640
amountnumber, two decimals, signed-296.38
currencycurrency code, three lettersEUR
balancenumber, two decimals5603.93
original_amountempty in this sample
original_currencyempty in this sample
datedescriptionamountcurrencybalanceoriginal_amountoriginal_currency
2026-06-01Señora García Alquiler 2640-296.38EUR5603.93
2026-06-03Ölmühle Görtz 7007-330.58EUR5273.35
2026-06-05Café Müller 3073-80.37EUR5192.98
2026-06-07Transferencia recibida Café Müller1630.51EUR6823.49
2026-06-09Café Müller 1763-283.49EUR6540.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.