TableJSON
TableJSON

How it works

What TableJSON does with a PDF

TableJSON reads a PDF that already contains real text, finds the lines that look like a table, and returns those rows as JSON. The tool on the home page is the same engine: drop a file on the left card and press Extract. You get a collapsible JSON tree and a paged table. Copy or download leaves the response on your computer.

The right card is only for invoices. Preview shows the pages. Extract downloads an Excel workbook and shows a checksum next to the line items. The checksum compares quantity times unit price with the line amount, then lines, tax, shipping, and discount with the printed total. PASS means the arithmetic closed. FAIL still downloads the workbook, with the reason on the sheet.

Use it in four steps

  1. Confirm the PDF has a text layer. Highlight a price. If it selects, TableJSON can read it. A picture of paper will not. This site does not OCR.
  2. Drop the file on Extract tables to JSON, or press Try sample PDF for sample.pdf. The name and size show when it is ready.
  3. Press Extract. Latency, table count, and row count land in the three boxes. The table view shows 50 rows at a time. Download JSON for every row.
  4. For an invoice, use the right card. sample-invoice.pdf shows a checksum first. The workbook has an Invoice sheet and a Raw extract sheet.

A direct call is the same extract without the browser. POST /v1/extract-tables takes the PDF in a multipart field named file. The playground on this host does not ask for a key. A script sends X-API-Key. See the API reference and the API guide.

Where it earns its keep

Accounts teams pull line items out of digital invoices. The invoice card looks for headers such as description, item, qty, unit price, rate, and amount. Vendor, invoice number, and invoice date come from labels on the first page, including "Invoice No" and "Billed by". Currency is read from USD, EUR, GBP, and INR, or from a symbol. Tax, shipping, freight, discount, and the stated total are taken from rows whose label is that word.

Bookkeepers turn statement PDFs into rows they can sort. There is no separate bank parser. You extract, then check the running balance yourself. A blank debit or credit is easy to lose, because empty cells are dropped when a line is split. The bank statement guide shows that. If a source system can export CSV, prefer that.

What it will not do

Scanned and image-only PDFs are out. The text-layer guide shows the highlight test. Columns come from the text, not from ruling lines. A line splits on a tab, a pipe, two or more spaces, or, last, commas. The first multi-cell line becomes the header. Later lines with about the same cell count are data. "Unit Price" becomes unit_price. Each row keeps data and raw_cells. If nothing looks like a table, you get one fallback table with line_number and extracted_content. Merged cells and a title in the first row are why a result looks shifted. Cleaning messy table JSON walks through those.

Values stay strings. 00120 is not turned into 120, and 1,250.00 is not parsed. Convert numbers when you know the decimal format. Uploads can be 500 MB. A public URL stops at 50 MB. The API allows 20 extracts a minute per IP, and a request can run for about three minutes.

What happens to the file

The PDF is sent here for that request. A multipart upload is written to a temporary file, read into memory, and deleted when the response finishes. It is not put in a database or a document library. A URL fetch stays in memory for the request. Logs can include time, path, status, size, and IP address, not the document itself. If the process is killed mid-request, a temp file can sit until the platform clears it. Cookies and the Google AdSense disclosure are on the privacy page. Common questions are on the FAQ.