What it does A Python script you run on your own computer. It reads a digital bank statement PDF (one with a text layer) and writes a CSV for import into Xero or QuickBooks Online. The script contains no network code (no urllib, requests, socket or http imports), so it does not upload your files. Extracts rows: date, description, debit, credit, running balance Xero output columns: Date (YYYY-MM-DD), Amount (signed), Payee (always blank), Description QuickBooks Online output columns: Date (MM/DD/YYYY), Description, Amount (signed) Raw output columns: date, description, debit, credit, balance, source_page Balance check: adds up the extracted debits and credits and compares the result with the opening and closing balance. If they differ, it prints the discrepancy. What has and has not been tested 85 automated tests pass (run by our launch check, 2026-10-04). They test the parser's helper functions on hand-written rows; they do not open PDF files. One generated sample PDF (drawn table borders, separate Debit and Credit columns) was converted end to end to a Xero CSV on Python 3.9.6 and 3.12, with a passing balance check. No real bank's statement layout has been tested. Run the converter on your statement and review the raw output before importing. Limitations: please read before buying Scanned or photographed PDFs do not work. The PDF must have a text layer. Password-protected PDFs do not work. Unlock a copy first. Multi-line descriptions are truncated to the first line. The row's date and amount are kept. Foreign or multi-currency statements are not supported. Amounts may be wrong or blank. Statements with no running balance column may skip the balance check or print a warning that is not a real missed row. What you get pdf_to_csv.py, README.txt, KNOWN-LIMITATIONS.md create_sample_pdf.py (generates 6 synthetic sample PDFs, needs reportlab) and test_parser_logic.py (the 85 tests) sample_input_statement.csv and sample_output_xero.csv Requirements Python 3.9 or later (3.9.6 and 3.12 have been run; 3.10 and 3.11 have not). Install pdfplumber with pip install pdfplumber. Price note One-time purchase. Competing cloud-based services charge $19 to $159 per month by subscription (sources: capyparse.com/blog/docuclipper-review, statementdesk.com/blog/best-bank-statement-converter-tools).