PDF Text and Tables Extractor
Pricing
$17.00 / 1,000 pdf processed (text + tables)s
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
pdfUrls | array of string | yes | — | PDF URLs to fetch. |
maxPages | integer | no | 200 | Stop extracting after this many pages per PDF. |
extractTables | boolean | no | true | Detect tables (see Table detection below). |
pagesAsRows | boolean | no | false | false: 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/tablesinstead 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.lengthin your own pipeline). - Free-plan compute only (
policy/RULES.mdrule 4); very large PDFs (many hundreds of pages) may hit the memory ceiling — usemaxPagesto cap. - No residential proxy, no personal data in output (rule 1).
- Table extraction is heuristic — see the section above.