PDF to CSV

PDF to CSV groups a PDF's embedded text into rows and columns by the gaps between characters, using mupdf in your browser - a best-effort guess, not a true table parser, and it can't read a scanned PDF at all.

Drag and drop, or click to upload a PDF

At a glance

Accepts
One text-based PDF file (not a scan)
Outputs
A CSV file of the detected rows and columns
Where it runs
Entirely in your browser, on your device
What leaves your device
Nothing - the file never leaves your device
Limits
No size or count cap; bounded by your device's memory; column detection is a positional guess and scanned PDFs have no text to read
Account
Not required - there is no sign-up
Price
Free, with no watermark and no usage cap

PDF to CSV reads a PDF's embedded text with mupdf and groups characters into rows and columns by the gaps between them - a small gap is a space within a cell, a larger one is a new column. It's a positional guess, not a true table parser, so it works best on simple, evenly-spaced tables and won't read a scanned PDF at all, since a scan has no text to read in the first place. Everything runs in your browser tab; the file is never uploaded.

How to use it

  1. Drag and drop, or click to upload a PDF with a text-based table.
  2. Check the detected rows in the preview - this is a guess, not guaranteed.
  3. Download the CSV once it looks right.

Frequently asked questions

Is my PDF uploaded to extract the table?

No - text is read and grouped into rows and columns entirely in your browser using mupdf. The file never leaves your device.

Does this work on scanned PDFs or photos of a table?

No - it reads the PDF's actual embedded text, positioned on the page. A scanned or photographed page has no text layer at all, just an image, so there's nothing here to extract - that needs OCR (optical character recognition), which this tool doesn't do.

How does it know where the columns are?

It groups characters into cells based on horizontal gaps: a small gap is a space within a cell, a large gap (roughly the size of the text itself) is a new column. It's a positional guess, not a true table parser - most simple, evenly-spaced tables come out clean, but a table with merged cells, multi-line cells, or an unusually tight layout may need manual cleanup afterward.

Why do some rows have a different number of columns than others?

Each row's columns are detected from that row's own spacing, independently of every other row. If a row has a genuinely blank cell in the middle, there's no gap there to detect, so the values after it shift left by one column in that row - the same limitation any gap-based extractor has without knowing the table's real grid ahead of time.

What happens with a multi-page PDF?

Every page is read in order and its rows are appended to the same CSV, one after another.

What if it finds no text at all?

You'll see a message saying so rather than an empty download. That almost always means the PDF is a scan - see the question above.