PDF Tables to Records — JSON, CSV & Page Sources avatar

PDF Tables to Records — JSON, CSV & Page Sources

Pricing

from $2.50 / 1,000 processed pages

Go to Apify Store
PDF Tables to Records — JSON, CSV & Page Sources

PDF Tables to Records — JSON, CSV & Page Sources

Turn text-based PDF tables into structured records for spreadsheets, ETL and AI workflows. Get JSON/CSV-ready data with page provenance, table coordinates and document hashes. Launch price: $0.0025/processed page, plus run start.

Pricing

from $2.50 / 1,000 processed pages

Rating

0.0

(0)

Developer

Евгений Гертнер

Евгений Гертнер

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 hours ago

Last modified

Categories

Share

Turn text-based PDF tables into structured records for spreadsheets, ETL and AI workflows. Extract reports, catalogs and public price lists into JSON and CSV with page numbers, table coordinates and document hashes.

  • Two extraction strategies: bordered tables or whitespace-aligned text.
  • Batch up to 10 PDFs, with up to 100 selected pages per document.
  • Trace every row to its page, table and source document.
  • JSON and CSV exports ready for downstream processing.
  • Launch price: $2.50 per 1,000 processed pages, plus $0.001 run start; platform usage included.

Start with this input

{
"pdfUrls": ["https://raw.githubusercontent.com/jsvine/pdfplumber/stable/examples/pdfs/background-checks.pdf"],
"startPage": 1,
"maxPages": 2,
"strategy": "lines",
"mergeRepeatedHeaders": false
}

Choose lines for table borders or text for whitespace-aligned columns. The extractor reads the PDF's text layer and table geometry. Tune the strategy on a representative page, then reuse those settings across the same template.

Get records with source evidence

The dataset contains one item per processed page: status, tablesDetected, rows and a records array. The key-value store provides:

  • TABLES: flat JSON table-row array.
  • TABLES-CSV: long-form CSV with document ID, page, table ID, row index, column and value.
  • SUMMARY: document outcomes, processed pages, errors and request statistics.
{
"page": 1,
"tableId": 1,
"rowIndex": 1,
"header": ["Product", "Price"],
"cells": ["Widget", "12.50"],
"record": {"Product": "Widget", "Price": "12.50"},
"continuedFromPreviousPage": false
}

Numeric-looking values remain strings to preserve leading zeros and locale punctuation. Whitespace and Unicode forms are normalized. CSV applies spreadsheet-formula escaping; JSON retains the extracted values.

The first non-empty row becomes the table header. Blank and duplicate names receive deterministic names. mergeRepeatedHeaders: true groups consecutive single-table pages with exactly matching headers; page and table provenance remain available.

Connect your pipeline

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("gertner-data/pdf-table-records").call(run_input={
"pdfUrls": ["https://raw.githubusercontent.com/jsvine/pdfplumber/stable/examples/pdfs/background-checks.pdf"],
"maxPages": 2
})
store = client.key_value_store(run["defaultKeyValueStoreId"])
summary = store.get_record("SUMMARY")["value"]
records = store.get_record("TABLES")["value"]
print(summary["complete"], len(records))

Use the API, saved tasks, schedules, webhooks or Apify MCP. The same document bytes and settings produce the same document ID and extraction.

API coverage and run settings

Processes public, text-based PDFs over HTTP(S). A page with no detectable table returns no_tables; a page without a text layer returns no_text_layer. Password-protected, malformed or complex documents have structured outcomes in SUMMARY. Successful documents remain available when another document fails.

Table geometry determines extraction. Raw cells, normalized headers, page bounds and header/cell warnings provide review evidence for merged cells, multi-row headers and complex layouts.

1–10 PDFs, 15 MB per file, 100 selected pages per document. Page output: 1 MB; each run JSON/CSV export: 6 MB. Parser wall-clock limit: 50 seconds per subprocess, with Linux CPU/memory/file limits. Default memory: 1 GB; timeout: 900 seconds. Downloads use bounded retries for transient network errors, 429 and 5xx.

Inputs/results use your Apify retention settings. Temporary PDF bytes are removed after parsing. Diagnostic URLs omit query parameters; logs contain aggregate metrics. Use permitted public sources.

Pricing

Launch price: $0.001 run start + $0.0025 per processed page. Platform usage included.

Processed pagesEvent price
1$0.0035
2$0.0060
100$0.2510

Page events cover processing, including no_tables and no_text_layer outcomes. Failed downloads and unprocessed pages receive no page event. Set a maximum run charge to control spending; the start event applies independently.

Support: Evgeny Gertner.