PDF to JSON
This free PDF to JSON converter reads a PDF and writes JSON entirely in your browser. Pick a .pdf file or drop one in, choose how the text should be grouped, read the output, and download it. Nothing leaves your device, and there is no sign-up.
A PDF does not contain a table or a JSON array. It contains pieces of text, each with a position on the page — which is why copying a table out of a PDF often lands everything in one column. So this page has to rebuild the structure: it groups text runs into rows by their vertical position, then works out where the columns are from the horizontal position of every run. Because that is an inference rather than a fact stored in the file, the page tells you what it inferred: how many rows and columns it found, how many records were missing a value, and — most importantly — whether any page had no text layer at all, which means it is a scan and there is nothing to read.
How to use this PDF to JSON converter
- Choose a
.pdffile, or drag one onto the panel. The sample table on the right is converted on load so you can see what the output looks like. - Pick Extract as: Table (by position) turns each row into an object and writes an array of objects; Plain text lines writes an array of strings, one per line, which suits reports, invoices and statements that are not really a grid.
- If columns come out merged or split, change the Column gap and Row grouping. Looser values merge more; tighter values split more.
- Press Convert to JSON and read What the extraction found before you download. Then press Download .json for the file, or Copy to put it on the clipboard.
What this tool supports
Tables become arrays of objects
Every text run on the page carries coordinates. Rows are formed by grouping runs whose vertical position is within a small distance of each other, and columns are formed by clustering the left edge of every run. Anything that shares a column lands in the same field, separated by a space when a cell holds more than one run — which is how Alice Brown stays one field instead of two. Each row is written as an object keyed by col1, col2, and so on, and all the rows sit in one JSON array.
| Setting | What it changes | When to move it |
|---|---|---|
| Row grouping | how far apart two runs can be vertically and still count as one row | rows came out split in two, or two rows merged into one |
| Column gap | how far apart two runs must be horizontally to count as separate columns | two columns merged into one field, or one column split into several |
Every value is a string
Each cell is written as a JSON string, with no numeric coercion. That is deliberate: a value like 007 keeps its leading zero, and a 16-digit identifier keeps all its digits instead of being rounded into a number. If you need a number, wrap the value in your own code — the text is exactly what was on the page.
Pages with no text layer are named, not dropped
A scanned document, a photograph or a screenshot saved as a PDF has no text in it at all — only pixels. Extracting from those needs OCR, which this page does not run. Instead of handing you a short file and saying nothing, it lists exactly which pages have no text layer.
| What is in the PDF | What this page does |
|---|---|
| a real text layer (exported from a spreadsheet, a word processor, a reporting tool) | extracted into the JSON |
| a scan or an image, no text layer | the page number is listed under the output; nothing is invented for it |
| a mix of both | text pages are extracted, image pages are listed |
Every page, in order
All pages are read in order and their rows are appended to the same array. A table that continues across pages comes out as continued objects; the column headers are col1, col2 and so on, because the columns are inferred from position rather than read from a header row.
One download, plus copy
Press Download .json for a timestamped file, or Copy to put the pretty-printed JSON on your clipboard. The content is the same either way.
Privacy and limits
The PDF is parsed on your own device by JavaScript running in the page. No file is uploaded, nothing is stored after you close the tab, and there is no account. Because parsing happens in your browser's memory, very large documents (hundreds of pages) take longer; ordinary statements, invoices and reports take a moment. Password-protected files are refused with a clear message rather than being probed.
What this tool does not do
- No OCR. If a page is an image, there is no text to read. The page is named so you know, and nothing is guessed for it.
- No password handling. A protected PDF is refused. Unlock it first, then convert the unlocked copy.
- No ruling-line detection. Columns come from where the text sits, not from drawn table lines, so a borderless table works and a heavily decorated one may need the gap settings adjusted.
- No merged-cell or multi-level-header reconstruction. A header that spans two columns, or a cell that belongs to several rows, comes out as ordinary fields. Check the output before you rely on it.
- No smart header detection. Keys are
col1,col2… by design, so nothing is guessed about which row is the title. Name the fields in your own code if you need titles. - No merging of files. One PDF at a time, no batch mode.
- No promise of perfection. Position-based extraction is an inference. The report tells you what it inferred so you can check it, not so you can skip checking.
Frequently asked questions
Is this PDF to JSON converter free?
Yes. No account, no sign-up, no page limit, and no upload — the PDF is read in your browser.
Is my PDF uploaded anywhere?
No. The file you pick is read with the browser's own File API and parsed in the page. There is no request that carries your file or its contents.
Why is my scanned PDF empty?
Because it has no text layer — it is an image. This page does not run OCR, and it says so by listing the page numbers instead of writing empty objects. Use OCR software first, then convert the result.
It says my PDF is password protected. What now?
Open it with the password and save an unlocked copy, then convert that. This page will not attempt to bypass protection.
Everything landed in one column. What should I change?
Set Column gap to Tight. If that splits single values into several columns, go back to Normal or Loose. The two settings are the whole tuning surface.
Two rows merged, or one row split in two. What should I change?
Change Row grouping. Tight splits rows apart, Loose pulls them together.
Why are my numbers strings and not numbers?
On purpose. Writing every value as a string keeps leading zeros and long identifiers exactly as they appear on the page, instead of rounding or truncating them. Convert a field to a number in your own code only where you are sure it is a real number.
Why are the keys called col1, col2… instead of real names?
Because the columns are inferred from text position, not read from a header row, so the page does not guess which row is the title. That keeps it honest. Rename the keys in your own code if you need named fields.
Does it handle a multi-page table?
Yes. Every page is read in order and its rows are appended to the same array. If the PDF repeats a header row on each page, that header appears in the array each time it does on the page.
How accurate is it?
For PDFs exported from spreadsheets and reporting tools, very good. For scanned pages, nothing at all — they are listed. For anything in between, read the report under the output: it tells you how many rows and columns were found and how many rows were missing a value, which is where errors show up first.
Is there a page limit?
There is no imposed limit. Parsing happens in your browser's memory, so very large documents depend on your device. Ordinary statements and reports take a moment.
What if I need another direction or format?
For the opposite direction use JSON to PDF. To take a table into a CSV use PDF to CSV, and for spreadsheet input use Excel to CSV or CSV to JSON. For plain text try PDF to Text.