Document Extractor — PDF to text, Markdown, tables avatar

Document Extractor — PDF to text, Markdown, tables

Pricing

from $0.70 / 1,000 page extracteds

Go to Apify Store
Document Extractor — PDF to text, Markdown, tables

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

alpine data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 hours ago

Last modified

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

FieldContent
source_url, file_namewhere the page came from
page, page_count1-based page number and pages in the file
has_text_layerfalse when the page is a scanned image with nothing extractable — reported, not silently empty
textplain text as the PDF exposes it
markdowntext with paragraphs restored, tables appended as Markdown
tableslist of tables, each a list of rows, each row a list of cell strings
table_count, char_count, word_countpage statistics
width, heightpage 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: false and 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 tables field 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.