PDF Text and Tables Extractor avatar

PDF Text and Tables Extractor

Pricing

$17.00 / 1,000 pdf processed (text + tables)s

Go to Apify Store
PDF Text and Tables Extractor

PDF Text and Tables Extractor

Extracts text and heuristically-detected tables from arbitrary PDF URLs, no site or proxy required.

Pricing

$17.00 / 1,000 pdf processed (text + tables)s

Rating

0.0

(0)

Developer

Mark

Mark

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

What it does

Fetches each PDF in pdfUrls, extracts full text, per-page text, and heuristically-detected tables — no site to crawl, no proxy needed. Works on any publicly reachable PDF URL (government reports, technical papers, filings, etc.).

Input

FieldTypeRequiredDefaultDescription
pdfUrlsarray of stringyesPDF URLs to fetch.
maxPagesintegerno200Stop extracting after this many pages per PDF.
extractTablesbooleannotrueDetect tables (see Table detection below).
pagesAsRowsbooleannofalsefalse: one dataset row per PDF (full text + pages[]). true: one row per page.

Table detection (heuristic — read this before relying on it)

Tables are not parsed from real table structure (no ruled-line or cell-border detection). A "table" is: text items on the same page grouped by rounded y-coordinate into lines, each line split into cells wherever the horizontal gap between adjacent text items exceeds ~10pt, kept only if a line has 3+ such gaps. This catches simple grid-aligned tables (the kind common in government/technical PDFs) and will miss or mis-split anything with merged cells, multi-line cell text, or unusual column spacing. Treat tables[] as "candidate tabular rows to review," not ground truth.

Output example

One row per PDF (default, pagesAsRows: false):

{
"url": "https://www.ntsb.gov/investigations/AccidentReports/Reports/AIR2401.pdf",
"title": "American Airlines Flight 106, Boeing 777-200, N754AN, ...",
"pageCount": 78,
"text": "Runway Incursion and Rejected Takeoff American Airlines Flight 106 ...",
"pages": [{ "page": 1, "text": "..." }, { "page": 2, "text": "..." }],
"tables": [{ "page": 41, "rows": [["Date", "NTSB case number", "Location", "Event description"], ["April 17, 2024", "DCA24FA164", "Queens, New York", "Runway incursion"]] }],
"byteSize": 2469207,
"fetchedAt": "2026-09-01T12:00:00.000Z"
}

With pagesAsRows: true, the same fields are emitted once per page (page

  • that page's text/tables instead of the full arrays).

A non-PDF URL (wrong content-type / not a %PDF- file) produces an uncharged error row: { "url": "...", "error": "Not a PDF (content-type: ...)" }. A fetch or parse failure produces { "url": "...", "error": "<message>" }, also uncharged.

Pricing

Pay-per-event (PPE). One pdf-processed event is charged per PDF fetched and parsed — once, regardless of pagesAsRows or page count. Price and description are set in the Apify Console's Actor pricing step, not in this repo: $0.017 per pdf-processed event ($17/1,000 PDFs), 15% under the incumbent's $20/1,000 with no per-page or start fee (docs/CANDIDATES.md #13, policy/RULES.md rule 3). Never charged for a rejected non-PDF or a fetch/parse error.

Limits

  • Scanned/image-only PDFs are not OCR'd — text extraction returns little or no text for them (this Actor does not detect and refuse them separately; check text.length in your own pipeline).
  • Free-plan compute only (policy/RULES.md rule 4); very large PDFs (many hundreds of pages) may hit the memory ceiling — use maxPages to cap.
  • No residential proxy, no personal data in output (rule 1).
  • Table extraction is heuristic — see the section above.