Skip to content

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
Drop a PDF hereTable detection runs in this tab.PDF · up to 500 MB each

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.