
PDF Tables Extractor — Tables Out of Any PDF
Pull real tables out of PDFs as rows you can use, with a confidence score on every table. Outputs one item per row for spreadsheets, or Markdown and CSV for docs and LLM prompts. Says plainly when a PDF is a scan with no text layer instead of returning silent nonsense.
PDF Tables Extractor — Tables Out of Any PDF returns 20 documented output fields, including sourceUrl, page, tableIndex, confidence and rowIndex. Every field carries a declared type, a written description and an example value. 36 runs are recorded on Apify.
- 20
- Output fields
- 8
- Inputs
- 36
- Runs
- 2026-10-15
- Last run
01 — output
What it returns
Every field the extractor writes to its dataset, with its type, a written description and an example value.
| Field | Type | What it holds | Example |
|---|---|---|---|
| sourceUrl | stringnull | The page or endpoint this row was read from. | https://api.example.com/v1/items |
| page | integernull | Page number this record came from. 1-based. | 1 |
| tableIndex | integernull | Zero-based index of the table within the document. | 0 |
| confidence | numbernull | How confident the Actor is in this result, from 0 to 1. Not a probability of correctness. | 0 |
| rowIndex | integernull | Zero-based position of this row within the dataset. | 0 |
| row | objectnull | Row as recorded for this row. | {"key":"value"} |
| rows | arraynull | The rows this record carries. | [{"column":"value","column2":123}] |
| header | stringnull | Header name that was checked. | <header> |
| hasHeader | booleannull | Whether the checked header is present. | true |
| rowCount | integernull | How many rows this record represents, when rows are grouped. | 0 |
| columnCount | integernull | Number of columns. | 0 |
| fillRatio | numbernull | Share of optional values that were populated, between 0 and 1. | 0 |
| columnConsistency | numbernull | Share of rows sharing the declared column count, between 0 and 1. | 0 |
| numericRatio | numbernull | Share of values that are numeric, between 0 and 1. | 0 |
| markdown | stringnull | Content converted to Markdown, with headings and links preserved. | <markdown> |
| csv | stringnull | Content rendered as CSV text. | <csv> |
| status | stringnull | Outcome recorded for this row. | ok |
| recommendation | stringnull | The recommended action for this row. | Review the price change before it propagates. |
| symbolRatio | numbernull | Share of values made only of punctuation or symbols, between 0 and 1. | 0 |
| singleCharRatio | numbernull | Share of values that are a single character, between 0 and 1. A high rate suggests truncation or a placeholder. | 0 |
02 — sample
One record
Assembled from the example values declared on the schema above, not invented at render time.
{
"sourceUrl": "https://api.example.com/v1/items",
"page": 1,
"tableIndex": 0,
"confidence": 0,
"rowIndex": 0,
"row": "{\"key\":\"value\"}",
"rows": [
{
"column": "value",
"column2": 123
}
],
"header": "<header>"
}03 — input
What you give it
| Input | Type | Description |
|---|---|---|
| pdfUrls | arrayoptional | Public URLs of the PDFs to extract tables from. |
| pages | stringoptional | Which pages to read, e.g. 1-5,8. Leave empty for every page. |
| minConfidence | stringoptional | Tables below this 0-1 score are discarded. Detection is genuinely ambiguous — a boxed diagram looks like a table to any algorithm — so this is the dial between missing tables and inventing them. 0.45 is a balanced default; raise it for financial data. |
| outputMode | stringoptional | 'rows' gives one dataset item per table row, ready for a spreadsheet. 'tables' gives one item per table with the rows nested. |
| includeMarkdown | booleanoptional | Attach each table as Markdown — the format to paste into docs, issues or an LLM prompt. |
| includeCsv | booleanoptional | Attach each table as a CSV string. |
| maxPagesPerPdf | integeroptional | Upper bound on pages read from each document. |
| maxItems | integeroptional | Hard cap on items returned. You are never charged beyond this. |
04 — run
Run PDF Tables Extractor on your own input
It runs in the cloud on Apify. Nothing to install, and you are billed per result returned rather than per attempt.
05 — questions
Asked before running it
20 of 20 fields described
- What does PDF Tables Extractor — Tables Out of Any PDF return?
- It returns 20 documented output fields: sourceUrl, page, tableIndex, confidence, rowIndex, row, rows, header, hasHeader, rowCount, columnCount and fillRatio. Each field declares its type, a description of what it holds, and an example value. The remaining 8 are listed in the output schema below.
- What input does PDF Tables Extractor — Tables Out of Any PDF take?
- All 8 inputs are optional and ship with usable defaults, so it runs as-is. They are listed with their types below.
- Does PDF Tables Extractor — Tables Out of Any PDF need an API key or login?
- No. None of its inputs is a credential, and it reads only public data. Nothing to sign up for before the first run.
- How do I run PDF Tables Extractor — Tables Out of Any PDF?
- It runs on Apify. Start it from its listing with the inputs above, or call the Apify API with the Actor's ID. Results land in a dataset you can export as JSON, CSV or Excel, or read through the Apify API into your own pipeline.