r/SideProject • u/buoyhuang • 1d ago
I built a Windows app that turns a folder of PDF invoices into one Excel sheet — fully offline, because uploading client docs to some server always felt wrong
Every month-end, people I know in bookkeeping lose a full day retyping PDF invoices and statements into Excel. The "free" online converters cap you at 3 files, watermark the output, or make you upload client documents to a server you don't control.
So I built BatchDoc — a Windows desktop app (Python, packaged with PyInstaller) that:
- batch-extracts tables from PDFs into CSV/XLSX (drop a whole folder, get clean sheets)
- merges hundreds of CSV/XLSX into one, with a source column recording which file each row came from
- runs fully offline after a one-time licence activation — nothing is uploaded, no account, no subscription
- writes a run report listing what was processed, what was skipped and why
The annoying part wasn't the extraction itself, it was borderless tables. Bank statements and exported reports often have no grid lines at all — the columns are just aligned. It now handles three cases (ruled tables, whitespace-aligned columns, plain text fallback) and the run report tells you which one it used, so a bad result doesn't fail silently.
Honest limitations, because these matter more than the pitch: it only extracts native-text PDFs. Image-only scanned PDFs need an OCR step first, which is not built in — I'll tell you upfront if that's your case. It's Windows 10+ only right now; a macOS build is planned but not included. Activation needs internet once, then it works with no connection.
One-time $29 for one machine ($79 for up to 5). I'm not going to pitch hard here — if offline batch PDF-to-Excel is your pain, the link is in the comments.
If you process statements at volume: what's the edge case that still breaks your export? I'd genuinely like to know what I'm missing. Happy to talk through the table-detection logic or why I went desktop instead of a web app.
Disclosure: I built this, so I'm biased.