Convert PDF tables to CSV
Extract table rows from a PDF into plain CSV you can paste anywhere — no workbook format, no macros, no upload, and nothing to install.
- Runs in your browser
- Files are never uploaded
- Free, no account
Why take the CSV rather than the workbook
CSV is the format you want when a machine is the next reader. It is plain text, so it opens in anything, diffs cleanly in Git, streams into a database loader, and cannot carry a macro. An .xlsx is a zip of XML with types, styles and formulas — useful for a person, extra work for a script.
- Feeding pandas, R or a database? CSV.
pd.read_csv("statement.csv")and you are done. - Committing extracted data to a repository? CSV — the diff is readable.
- Handing it to a colleague to edit? PDF to Excel instead, so each page keeps its own sheet.
The escaping rules used
Output follows RFC 4180, which is what Excel, Numbers, LibreOffice, Python's
csv module and every serious parser expect:
- Fields are separated by a comma and rows by a newline.
- A field containing a comma, a double quote or a line break is wrapped in double quotes.
- A double quote inside a quoted field is written twice.
- Nothing else is escaped — no backslashes, no HTML entities.
So a cell reading Smith, John "Jack" is written as
"Smith, John ""Jack""". This is the part hand-rolled exporters get wrong, and
it is exactly the part that silently corrupts a column of names.
How multi-page documents are laid out
Each page's rows are written in order, with a blank line between pages. That gives you one file for a whole statement while leaving an unambiguous boundary — a blank line is never valid inside a record, so splitting on it is safe.
If your pages repeat a header row, you will get that header once per page. Filtering those out is a one-liner in whatever you load the file into, and leaving them in is the honest thing for the exporter to do: guessing which rows are headers is how data quietly goes missing.
Common sources and what to expect
| Source document | Typical result |
|---|---|
| Bank statement downloaded from online banking | Very good. Fixed columns, consistent alignment, digitally generated |
| Invoice from accounting software | Good for the line-item table; header blocks come through as stray rows |
| Report exported from a database tool | Excellent — these are the cleanest tables there are |
| Scientific paper with a results table | Mixed. Multi-level headers and footnote markers confuse the columns |
| Scanned or photographed statement | Nothing. No text layer exists to read |
| Government form with boxed fields | Poor — boxes are not columns, and the field labels interleave with the values |
Numbers, dates and locales
Cells are exported exactly as they appear in the document — as text, not as parsed values.
That is deliberate: 1.240,00 means one thousand two hundred and forty in Berlin
and something else entirely in London, and a converter that guesses will eventually guess
wrong on your money.
Do the conversion where you have the context: set the locale when importing into your
spreadsheet, or parse explicitly in your script. Dates behave the same way —
03/04/2026 stays as written rather than being silently reinterpreted.
Nothing leaves the tab
Financial documents are the single most common input to this tool, which makes the no-upload property more than a nicety. The PDF is decoded by pdf.js inside this page, the clustering is ordinary JavaScript, and the CSV string is built in memory and handed to your download folder. There is no endpoint it could be sent to — the site is static files on a CDN with a content security policy that permits no third-party connections at all.
Questions
Why choose CSV over Excel?
CSV is text. It imports into anything — pandas, R, a database loader, a spreadsheet — it diffs cleanly in version control, and there is no binary format to trust. If you are feeding a script rather than a person, take the CSV.
How are pages separated in the output?
Each page’s rows are written in order, separated by a blank line. That keeps a multi-page statement in one file while leaving an obvious boundary you can split on if you need to.
What about commas and quotes inside a cell?
They are escaped to RFC 4180 rules: any cell containing a comma, a double quote or a newline is wrapped in quotes and its internal quotes are doubled. It opens correctly in Excel, Numbers, LibreOffice and every parser worth using.
Can I copy the result instead of downloading it?
Yes. There is a Copy CSV button next to the download, which is usually faster when you only want to paste a few rows into a sheet you already have open.