Skip to tool

Private · on this device

Convert a bank statement PDF into Excel.

The file never leaves this device. No upload. No account. No watermark. Ledger is for the PDF your bank already emailed — a text layer, not a photo of a paper statement. Extraction runs in this tab with PDF.js and SheetJS. We cannot see the transactions.

Check the preview table, remap columns if a header is local, then download Excel or CSV. Always compare the sheet to the original PDF before you file taxes or send it to an accountant. Ledger is not a bank.

  • No upload
  • No account
  • Stays on this device

1

Drop the PDF

A digital statement from your bank — not a photo of paper.

2

Check the table

Remap Date, Description, Debit, Credit, Balance if needed.

3

Download Excel

Or CSV. Nothing was uploaded. Close the tab and it is gone.

What Ledger actually does

A monthly current-account PDF is a layout problem, not a cloud problem. The bank already gave you a file. Online converters ask you to upload that file so a server can guess the table, then they watermark the sheet or charge for the second statement. Ledger keeps the PDF in this tab. Mozilla PDF.js reads the glyphs. A small on-device heuristic clusters lines into Date, Description, Debit, Credit and Balance. SheetJS writes Excel. Nothing is posted to our origin as a document body.

If the bank locked the PDF, do not email it to us. Use the Locked PDF page and type the password in that tab. The home drop zone has no password field on purpose.

That matters because a statement is not a holiday photo. It names payees, shows a running balance, and sometimes prints an IBAN in the header. The only honest way to say “we cannot see it” is if the bytes never leave the device. Close the tab and the session is gone. There is no account because there is nothing to store against one.

How a conversion runs

  1. Drop a digital PDF — the “download statement” file from online banking, not a photograph of paper. A sample statement is on the button above if you want to see the table without using a real file.
  2. Wait while each page is read in a worker on this origin. Progress shows the page index. Repeated headers on page two are dropped so “Date” does not become a fake transaction.
  3. Look at the preview. If a bank labelled a column “Money out” or “Particulars”, remap it with the dropdown. Tick parentheses-as-negative if your PDF uses accounting style.
  4. Download Excel or CSV. The Notes sheet records the filename and that work happened on-device. Compare totals to the PDF before anyone else sees the sheet.

Limits you should know

Digital text PDFs work. Scans, camera photos, and password-locked files do not, in this version. A scan has no text layer; inventing rows from pixels would be worse than a refusal. Unlock a protected file in the bank app, then drop the unlocked copy. Up to three PDFs per drop. Very long annual dumps can exhaust an iPhone tab — split the year, or use a desktop browser. We do not upscale garbage. We do not call an LLM with your transactions.

Chrome, Edge, Firefox and Safari are the intended browsers. The PDF worker and standard fonts load from this site, not from a random CDN of the converter. After that first load, airplane mode still lets you extract a file already on the phone.

What never goes on the network

The PDF bytes, the extracted rows, and the spreadsheet blob. Filenames are not sent to analytics. Ads never sit on Drop, Extract or Download, and they do not receive the file. Placeholders stay empty until the site is Ready in AdSense. That is a policy choice, not a tease.

Longer walkthrough: How it works. Practical jobs: Use cases. Operator and contact: About and Contact.

Questions

Does my bank statement leave this device?
No. Ledger reads the PDF in this browser tab with Mozilla PDF.js, groups text into rows on your CPU, and writes Excel with SheetJS. There is no upload endpoint and no converter API. We cannot see the file. Refresh or close the tab and the bytes are gone. Ads, when they exist, never receive the PDF.
Do I need an account?
No. There is no signup, no email gate, and no daily quota. You drop a digital statement and download a spreadsheet. Ledger is not a cloud archive. We do not keep a copy of past conversions because we never receive them.
Is there a watermark or a paid unlock?
No. The Excel and CSV files Ledger writes are ordinary spreadsheets. We do not stamp a logo on the sheet, and we do not lock columns behind a paywall. Always check the numbers against the original PDF before you file or send them — that check is on you, not a premium feature.
Which browsers work, including iPhone?
Current Chrome, Edge, Firefox, and Safari (including iOS Safari) can run the PDF worker. Stay in this tab while a large statement is reading; locking an old iPhone mid-parse can starve memory. If Safari complains about a worker, try the same PDF on desktop Chrome. Password-locked files belong on the Locked PDF page — type the bank password in that tab.
How large a PDF can I drop, and can I batch?
v1 accepts up to three PDFs in one drop, processed one after another. A typical monthly statement is a few dozen pages and is fine. Multi-hundred-page annual dumps can exhaust a phone tab — split the year in online banking, or use a desktop browser. There is no server queue because nothing is queued off-device.
What goes in and what comes out?
In: a text-based PDF statement — the file banks email or offer as “Download PDF”. Out: an .xlsx workbook (Transactions plus a Notes sheet with the original filename) or a UTF-8 CSV with a BOM so Excel on Windows keeps characters. Amounts become numbers when they parse; dates stay text so Excel does not shift the day across time zones.
Will amounts be exact?
Ledger guesses columns from headers and spacing. Banks do not share one layout. Parentheses like (12.50) can mean a debit; tick “Treat (123.45) as negative” if that matches your statement. Always compare totals to the PDF. Ledger is not a bank and the sheet is not an official statement.
What happens to metadata inside the PDF?
The PDF never leaves the tab, so document metadata does not go to our servers. The Excel Notes sheet records the filename you chose and that processing was on-device. We do not strip or copy bank-embedded producer tags into a tracking system because we have none.
Does it work offline after the first visit?
After the page, fonts, and PDF worker have loaded from this origin, extraction does not need a network. You can toggle airplane mode and still parse a statement already on the phone. The first visit does need HTTPS to fetch those libraries. We do not fetch the PDF from a URL for you.
Why is this on a vercel.app domain? Is that safe?
vercel.app is ordinary HTTPS hosting. Safety here is the architecture: your statement is not posted to Vercel as form data. The converter runs in the browser. A custom domain would not change that. Do not email the PDF to strangers either; use the tool, then delete the download when you are done.
When do ads appear, and will they sit on my table?
Ad placeholders exist after a successful extract, mid-page, and in the footer. They stay empty until Google marks the site Ready. Ads never sit on the drop zone, Extract, or Download. We do not ask you to click ads. The PDF bytes are not sent to the ad tag.
Who runs Ledger, and how do I contact you?
Ledger is a local-first tool from Ultimatum. Email ultaultimatum@gmail.com with the page URL, browser, and what you expected. Do not attach a real statement — that would undo the privacy promise. We do not open unsolicited PDFs.
What if Ledger says the PDF is a scan?
A scan or a photo of paper has no text layer. PDF.js then sees an image, not “01 Jan GROCERY 12.40”. v1 refuses instead of inventing rows. Re-download a digital statement from online banking. Optical character recognition is not silently enabled; a later opt-in would have to download a model after you press a scan button.
Can I use this as my only tax record?
No. Keep the original PDF from the bank. Ledger is a convenience table, not a filing, not advice, and not a substitute for the institution’s document. If a column mapped to Description that was really a cheque number, fix it before anyone else sees the sheet.
Can you connect to my bank or import via Open Banking?
No. Ledger never holds a bank login, a refresh token, or a Plaid-style connection. If your bank offers Open Banking or a CSV download, use that. This tab only reads a PDF you already have. A “connect your bank” button would be a different product and a different threat model, and we will not add it to look like a fintech dashboard.
Why not email you a redacted PDF so you can add a template?
Because the inbox would then contain a bank statement, redacted or not. Ledger’s heuristic is header names plus spacing, not a hidden per-bank template we maintain from customer uploads. Describe the header row in words. Use the sample file. We will not take PDFs to grow a template pack.
Does the Excel file count as an official statement for a visa, mortgage, or tax office?
No. Keep the original PDF. Some offices want the bank’s own document with letterhead. Ledger’s sheet is a working table you can sort. Submitting only the spreadsheet as if it were issued by the bank is on you, and our terms forbid using the export to misrepresent activity.
The PDF asks for a password. Do I send it to you?
No. Open the Locked PDF page on this site. Type the password the bank used when it exported the file. PDF.js calls getDocument with that password in this tab only. We do not put it in the URL, we do not write localStorage, and we do not email you an unlocked PDF. The download is still Excel or CSV of the table. If you forgot the password, only the bank can issue a new statement.