PDF Text Extractor — Structured Tables, Markdown & Metadata
Pricing
from $4.00 / 1,000 results
PDF Text Extractor — Structured Tables, Markdown & Metadata
Extract text from PDF URLs at scale: full text, per-page text, real structured tables (rows and columns as JSON, not text lines), document metadata and clean Markdown for LLM/RAG. The table extraction generic PDF text extractors don't have. No credentials needed.
Pricing
from $4.00 / 1,000 results
Rating
0.0
(0)
Developer
kuon
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Extract text from PDF URLs at scale — and get the one thing generic PDF text extractors don't give you: tables as real structured data (rows and columns as JSON), not flattened text lines. Every PDF also yields full text, per-page text, document metadata, and a clean Markdown rendition with reconstructed headings and bullet lists. No credentials or API keys needed.
Why this extractor
- PDF table extraction to JSON:
[["Fruit","Qty"],["Apple","120"]]— ready for spreadsheets, databases or analysis. Most PDF text extractors return tables as jumbled text lines; this one returns rows and columns. - PDF to Markdown for LLM / RAG pipelines: headings inferred from font sizes, bullet lists preserved, tables as Markdown pipe tables — and table text is never duplicated as prose, so your chunks stay clean.
- PDF to text in bulk: pass a list of URLs; failures (404s, broken or password-protected files) become failed items, never a crashed run.
What it does
Give it a list of PDF URLs. For each PDF you get one dataset item with:
fullText— the whole document as plain textpages[]— per-page text with word and character countstables[]— every detected table as an array of rows ([["Fruit","Qty"],["Apple","120"],…]), with the page number it was found onmarkdown— a Markdown version of the document: headings inferred from font sizes, bullet lists, and tables as Markdown pipe tables (table text is not duplicated as prose)metadata— title, author, subject, keywords, creator, producer, creation/modification dates (ISO 8601)stats— word count, character count, table count
Failed downloads or broken files produce an item with status: "failed" and a
clear error message instead of crashing the run, so batch jobs always finish.
Input
| Field | Type | Default | Description |
|---|---|---|---|
pdfUrls | array | — | Direct URLs to PDF files (redirects followed) |
includePageTexts | boolean | true | Include the per-page pages array |
includeTables | boolean | true | Detect and extract structured tables |
includeMarkdown | boolean | true | Include the Markdown rendition |
maxPagesPerPdf | integer | 0 (all) | Process only the first N pages |
timeoutSecs | integer | 60 | Download timeout per file |
maxFileSizeMb | integer | 50 | Larger files are skipped with a failed item |
Example output (abridged)
{"url": "https://example.com/report.pdf","status": "success","metadata": {"title": "Quarterly Fruit Report", "author": "AtoA Workshop"},"numPages": 2,"fullText": "Quarterly Fruit Report\nThis report summarizes...","pages": [{"page": 1, "text": "...", "words": 32, "chars": 195}],"tables": [{"page": 2, "tableIndex": 0, "rows": [["Fruit", "Quantity", "Price"], ["Apple", "120", "1.50"]]}],"markdown": "## Quarterly Fruit Report\n...\n| Fruit | Quantity | Price |\n|---|---|---|\n| Apple | 120 | 1.50 |","stats": {"words": 47, "chars": 289, "tables": 1}}
Typical uses
- Convert reports, invoices and papers to analyzable data (PDF table extraction)
- Feed LLM / RAG pipelines with clean Markdown instead of raw PDF text
- Index PDF archives: full text + metadata (title, author, dates) per document
- Batch-convert PDF URLs from a crawl or sitemap into text datasets
Limitations
- No OCR: scanned image-only PDFs return empty text (selectable text required)
- Password-protected PDFs are reported as failed items
- Table detection works best on tables with ruled borders; borderless layouts may be missed
- The Markdown rendition is heuristic — heavily designed layouts may come out flatter
Development (local)
cd actors/pdf-text-table-extractoruv venv .venv && .venv/bin/python -m ensurepip 2>/dev/null; uv pip install -p .venv/bin/python -r requirements.txtuv pip install -p .venv/bin/python fpdf2 # dev-only: fixture generator.venv/bin/python tests/run_local_test.py # end-to-end test (apify run equivalent), exit 0 = ALL PASS../../node_modules/.bin/apify run # real apify CLI local run (input: storage/key_value_stores/default/INPUT.json)
Test fixture is tests/fixtures/sample.pdf (regenerate with tests/make_fixture.py);
expected results live in tests/expected_output.json. Publishing → ../../docs/publishing.md.