Document Extractor — PDF to text, Markdown, tables
Pricing
from $0.70 / 1,000 page extracteds
Document Extractor — PDF to text, Markdown, tables
Turns PDF URLs into one dataset row per page: plain text, Markdown, tables as row arrays, and an honest has_text_layer flag for scanned pages. Built to sit behind any crawler that downloads PDFs but does not read them.
Pricing
from $0.70 / 1,000 page extracteds
Rating
0.0
(0)
Developer
alpine data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
15 hours ago
Last modified
Categories
Share
Document Extractor — PDF to text, Markdown and tables, one row per page
Give it PDF links, get one dataset row per page: plain text, Markdown, tables as row arrays, and an honest flag for pages that have no text layer. Built to sit behind any crawler that collects PDF links but does not read the files.
Why one row per page
Most PDF extractors return one blob per file. That is fine for a two-page letter and useless for a 140-page report: you cannot filter, you cannot cite, and a downstream LLM gets the whole thing or nothing. A row per page keeps the page number, the word count and the tables of that page together, so you can pick pages by content, feed them one at a time, or join them back into a document.
What you get per page
| Field | Content |
|---|---|
source_url, file_name | where the page came from |
page, page_count | 1-based page number and pages in the file |
has_text_layer | false when the page is a scanned image with nothing extractable — reported, not silently empty |
text | plain text as the PDF exposes it |
markdown | text with paragraphs restored, tables appended as Markdown |
tables | list of tables, each a list of rows, each row a list of cell strings |
table_count, char_count, word_count | page statistics |
width, height | page size in PDF points |
A file that cannot be fetched or parsed produces one record with an error field and page: null, so failures are visible in the same dataset instead of vanishing.
Input
{"pdfUrls": ["https://example.org/report.pdf"],"maxPages": 1000,"extractTables": true}
Chaining: set datasetId to the dataset of a previous run and urlField to the field that holds the PDF link. The actor reads the links from there — for example from a crawl that collected document URLs.
Limits: maxFiles (default 100), maxPages across all files (default 1000), maxFileSizeMb (default 50). Runs stop before the platform timeout and keep what they have; RUN_SUMMARY in the key-value store says whether a limit was hit.
Limits — read this before you rely on it
- No OCR. Scanned pages come back with
has_text_layer: falseand empty text. The flag tells you exactly which pages need OCR; this actor does not run it. - Tables are heuristic. Ruled tables extract well. Whitespace-aligned columns and multi-column layouts can come out merged or split. Check the
tablesfield on a sample of your documents before building on it. - Encrypted or malformed PDFs are reported as errors, not repaired.
- Text order follows the PDF's internal order. Multi-column pages may interleave.
Cost
Pure CPU work, no browser. A 30-page text PDF takes a few seconds on 1 GB of memory. Proxy is off by default and only needed if a host blocks datacenter traffic.