Data privacy ·
Convert a bank statement to CSV without uploading
A bank statement converter that runs in the browser reads PDF text or CSV bytes with the File API, tokenizes rows in memory, and writes a new CSV download. Nothing is posted to a server. That is the difference between bookkeeping and leaking every transaction to a random SaaS.
What is in a bank statement that you should not upload?
Payee names, card last-fours, balances, addresses, and sometimes SSN fragments in tax statements. A “free PDF to Excel” site that accepts the file has a copy of your month. Terms of service rarely help after a breach. Data minimization (GDPR Art. 5, CCPA purpose limitation) is easier when the processor is your own laptop.
How does client-side PDF-to-CSV actually work?
The page loads pdf.js in the worker. FileReader or blob.arrayBuffer() feeds the document. getTextContent() returns items with transform matrices. Grouping by rounded Y builds lines; splitting on large ΔX builds cells. For already-digital CSV/OFX, Papaparse or a text split is enough — skip PDF entirely.
const buf = await file.arrayBuffer();
const pdf = await getDocument({ data: buf }).promise;
const page = await pdf.getPage(1);
const { items } = await page.getTextContent();
// cluster items by transform[5] (y), then join strWhy do layouts break, and what should you do next?
Banks draw tables with lines that are not text. Multi-line memos wrap. Dates may be headers repeated every page. After a local parse, open the CSV editor: freeze the header, drop fee-only rows, and export again. That second pass is still in-memory.
How do you prove nothing uploaded?
Open DevTools → Network, filter Fetch/XHR, convert a statement, and confirm there is no request whose payload is the PDF. You should see the JS bundles and maybe an ad iframe — not multipart/form-data of your file. That audit is the same method we recommend for every tool on this site.
Where does the CSV go after export?
Into your downloads folder as a file you control. From there, spreadsheets, local bookkeeping, or a JSON conversion still in the browser. Do not re-upload the CSV to a second “cleaner” that undoes the privacy win.
Frequently asked questions
Is it safe to upload a bank statement to a free converter?
Usually no. The file contains account numbers, payees, and balances. Once it leaves your machine you cannot prove deletion. Use an in-browser parser instead.
How does a browser extract tables from a PDF statement?
pdf.js renders or extracts text with coordinates. Heuristics cluster glyphs into rows by Y, then split columns by X gaps. The result is arrays you can serialize as CSV.
Will every bank layout parse perfectly?
No. Statements are not a standard. Expect to review columns in a CSV editor and fix header rows. The point is local control, not magic OCR in the cloud.
Can I keep the CSV on disk only?
Yes. The export is a Blob download. Close the tab and the ArrayBuffer is eligible for GC. No account, no history on our origin besides what your browser cache already does for the JS bundle.