PDF Text & Table Extractor – Pages, Markdown, RAG
Pricing
from $0.90 / 1,000 pdf pages
PDF Text & Table Extractor – Pages, Markdown, RAG
PDF to text, Markdown and tables, page by page. Input: PDF URLs (+ page ranges). Output: per-page text, Markdown with tables, table cells, RAG chunks and document metadata. No OCR. $1.50/1k pages; image-only pages free.
Pricing
from $0.90 / 1,000 pdf pages
Rating
0.0
(0)
Developer
Glidepath
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Turn PDF files into clean text, Markdown and tables, one row per page. Give it PDF links; for every page you get the text in reading order, a Markdown version with the page's tables as Markdown tables, the table cells as rows and columns, optional RAG chunks, and the document's metadata. You pay per page, and pages without a text layer (scans, images, blank pages) are free.
Plain HTTP and a fast PDF parser, no browser: a 50-page report takes seconds.
Who uses it
- AI and RAG builders: feed reports, manuals and papers into a vector database with page numbers kept, already split into chunks of the size you choose.
- Analysts and researchers: pull the tables out of statistical releases, annual reports and price lists, page by page, into JSON, CSV or Excel.
- Developers and automations: convert PDFs that arrive as links (invoices from a portal, public documents, filings) into text for a workflow in Make, Zapier or n8n.
- Monitoring: run it on a schedule for documents that are republished under the same URL.
How to use it
- Put one or more PDF links in PDF URLs (up to 500).
- Optionally choose Pages (e.g.
1-5, 8), turn tables or Markdown on or off, and set a RAG chunk size. - Run it and download the pages as JSON, CSV or Excel, or pass them to another Actor, an AI agent or your vector database.
Input example
{"urls": ["https://www.irs.gov/pub/irs-pdf/fw9.pdf","https://www.irs.gov/pub/irs-pdf/p15.pdf"],"pages": "1-10","maxPages": 1000,"maxPagesPerFile": 0,"extractTables": true,"includeMarkdown": true,"preserveLayout": false,"chunkSize": 1000,"chunkOverlap": 100}
Output example
{"url": "https://www.irs.gov/pub/irs-pdf/fw9.pdf","fileName": "fw9.pdf","pageNumber": 1,"pageCount": 6,"text": "W-9\nRequest for Taxpayer\nForm Give form to the\n(Rev. March 2024) Identification Number and Certification ...","markdown": "W-9\nRequest for Taxpayer ...\n\n| Employer identification number | | | ... |\n|---|---|---|...","tables": [{"index": 0, "rowCount": 2, "columnCount": 10, "rows": [["Employer identification number", "", "..."], ["", "", "–", "..."]]}],"tableCount": 1,"charCount": 5650,"wordCount": 1010,"chunks": [{"index": 0, "text": "W-9\nRequest for Taxpayer ..."}],"title": "Form W-9 (Rev. March 2024)","subject": "Request for Taxpayer Identification Number and Certification","keywords": "Fillable","creator": "Designer 6.5","producer": "Designer 6.5","createdAt": "2024-03-06T13:18:13Z","modifiedAt": "2024-03-06T13:18:13Z","pdfVersion": "1.7","fileSizeBytes": 140815,"extractedAt": "2026-10-11T05:00:00Z"}
| Field | Type | Description |
|---|---|---|
url | string | The PDF URL you entered |
fileName | string | File name from the URL |
pageNumber | integer | Page number (1-based) |
pageCount | integer | Pages in the whole file |
text | string | Page text in reading order (e-mail addresses and phone numbers removed) |
markdown | string / null | Page text with tables as Markdown tables (null when Include Markdown is off) |
tables | array | Tables on the page: index, rowCount, columnCount, rows (rows of cell strings) |
tableCount | integer | Number of tables on the page |
charCount | integer | Characters in text |
wordCount | integer | Words in text |
chunks | array | RAG chunks of the page text: index, text (empty unless a chunk size is set) |
title | string / null | Document title from the PDF's metadata |
subject | string / null | Document subject from the PDF's metadata |
keywords | string / null | Document keywords from the PDF's metadata |
creator | string / null | Application that created the document |
producer | string / null | Software that produced the PDF |
createdAt | string / null | Creation date from the metadata, ISO 8601 UTC |
modifiedAt | string / null | Modification date from the metadata, ISO 8601 UTC |
pdfVersion | string / null | PDF version from the file header, e.g. 1.7 |
fileSizeBytes | integer | Size of the downloaded file |
extractedAt | string | ISO 8601 UTC |
The run's key-value store also has SUMMARY (per file: page count, pages saved, pages without a text layer) and, when something could not be read, ERRORS with the reason: NOT_A_PDF, NOT_FOUND, NO_TEXT_LAYER, ENCRYPTED, DAMAGED, TOO_LARGE, TOO_MANY_PAGES, NO_PAGES_SELECTED, ROBOTS_DISALLOWED, BLOCKED, FETCH_FAILED, REFUSED, SKIPPED.
Use it with
- AI agents and MCP: the Apify MCP server exposes this Actor as a tool; the input is a list of PDF links.
- Vector databases and LangChain/LlamaIndex: use
chunks(ortextper page) withurlandpageNumberas the source reference. - Make, Zapier, n8n, Google Sheets, Slack: through the Integrations tab.
- API and code: the Apify API, the JavaScript and Python clients, or CSV/JSON/Excel downloads.
Pricing
Pay per page: $1.50 per 1,000 pages on the Apify Free plan; on paid plans $1.35 (Starter), $1.10 (Scale) and $0.90 (Business and higher) (the price for your plan is shown on the Pricing tab). The examples below use the Free-plan price. Tables, Markdown and RAG chunks are included. Only pages saved with text are charged; pages without a text layer, pages outside your page range and files that fail are free.
- 100 reports of 20 pages (2,000 pages) → about $3.00.
- 1,000 pages of manuals for a RAG knowledge base → about $1.50.
- 10,000 pages of filings a month → about $15.00/month.
A small start fee of $0.00005 per run applies. Set a maximum cost per run in the run options and the Actor stops cleanly when it is reached; Max pages per run does the same by count.
Limits and notes
- Text PDFs only, no OCR. Scanned or image-only pages have no text layer; they are listed in
SUMMARYand not charged. Text that is part of an image (a chart, a pasted table screenshot) is not extracted. - Tables are detected from their ruling lines (cell borders). Tables drawn without lines still appear in
textandmarkdownas plain lines, but not intables. - Rotated text (e.g. a vertical label in a page margin) is left out; it would otherwise come out letter-reversed.
- Up to 500 files per run, 50 MB and 2,000 pages per file, 100,000 pages per run. Password-protected files are reported as
ENCRYPTED. - PDF links only. A link that returns a web page or another file type is reported as
NOT_A_PDFand not charged; to read web pages use a web scraper instead. - robots.txt is respected (RFC 9309) for every file; if robots.txt can't be read (server error), the file is skipped to be safe. No logins, no proxies, no bot-check bypass; private or internal addresses are refused.
- E-mail addresses and phone numbers are replaced with
[email removed]/[phone removed]; the document's author field is not output.
FAQ
Is it legal to extract text from PDFs? This Actor downloads only files that are publicly reachable at the links you give, where the site's robots.txt allows it, without logging in or getting around any protection, and it removes e-mail addresses and phone numbers. You are responsible for having the right to use the documents you process (copyright and each site's terms still apply); if in doubt, ask a lawyer.
How is this different from a web page to Markdown tool? Those tools return a whole PDF as one block of text. This Actor keeps pages separate (with page numbers for citations), extracts tables as cells and as Markdown tables, lets you pick page ranges, splits text into RAG chunks and does not charge for pages without text.
Why is a page missing? It had no text layer (see pagesWithoutText in SUMMARY), was outside your Pages range, or a limit was reached.
Can it read scanned PDFs? Not in this version: there is no OCR. Scanned pages are skipped for free, so you can find them in SUMMARY and send only those to an OCR tool.
Can I upload a file instead of a link? Put the file somewhere it has a public link (e.g. a key-value store record or cloud storage) and pass that link.
Changelog
See CHANGELOG.md.
Support
Found a problem or need a feature? Open an issue on the Actor's Issues tab. We read every one.