Document Extractor: PDF, Word & Image to Markdown (OCR)
Pricing
from $2.00 / 1,000 page processeds
Document Extractor: PDF, Word & Image to Markdown (OCR)
Document extractor that converts PDF, DOCX and image files into clean text, Markdown or tables, with OCR for scanned pages. One row per document, paid per page processed. Ideal for RAG pipelines and AI agents.
Pricing
from $2.00 / 1,000 page processeds
Rating
0.0
(0)
Developer
Vícente Matallana
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 hours ago
Last modified
Categories
Share
PDF, Word & Image to Text, Markdown & Tables (OCR)
Turn PDF, DOCX and image files into clean text, Markdown or tables, with OCR for scanned pages. Give it a list of file URLs and get one row per document, ready for a RAG pipeline, an AI agent, a spreadsheet or a database.
What it does
- Downloads each file from its URL and detects the type from the content, not the file name: PDF, DOCX (Word) or image (PNG, JPEG, TIFF, BMP, GIF, WebP).
- Digital PDFs: reads the text layer and detects tables, page by page.
- Scanned PDFs and images: reads the text with OCR (Tesseract), in English, Spanish or both. A PDF that mixes digital and scanned pages is handled page by page.
- Word documents: keeps headings, bulleted and numbered lists and tables, so the Markdown mirrors the document's structure.
- Returns, for each document, its
url,fileType,pageCount,pagesProcessedandocrPages, the content in the output mode you choose (textormarkdown), every table as rows of cells intables, and the file'smetadata(title, creation and modification dates). It never returns the author or any other personal field from the file properties. - A file that cannot be processed (broken link, unsupported type, corrupted or password-protected file) gets a row with an
errormessage and is not charged; the rest of the run continues.
Input example
{"urls": ["https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf","https://example.com/reports/sales_report.pdf"],"outputMode": "markdown","maxPagesPerDocument": 100,"ocrLanguages": ["eng"]}
urls(required): absolute http(s) URLs of the files.outputMode:markdown(default),textortables. Tables come back in every mode;tablesreturns only them.maxPagesPerDocument: process at most this many pages of each file, from the first one (1 to 1,000, default 100).ocrLanguages: languages of the scanned text,engand/orspa(defaulteng).
Output example
One row per URL, in the same order as the input:
{"url": "https://example.com/reports/sales_report.pdf","fileType": "pdf","pageCount": 3,"pagesProcessed": 3,"ocrPages": 0,"text": null,"markdown": "Quarterly Sales Summary\n\n| Region | Units | Revenue |\n|---|---|---|\n| North | 120 | 4800 |\n| South | 95 | 3800 |\n| West | 60 | 2400 |\n\nSecond page. Sales grew in every region during the quarter.\n\nThird page. Figures are in US dollars.","tables": [{"page": 1,"rows": [["Region", "Units", "Revenue"], ["North", "120", "4800"], ["South", "95", "3800"], ["West", "60", "2400"]]}],"metadata": {"title": "Quarterly Sales Summary","createdAt": "2026-01-15T09:30:00Z","modifiedAt": null},"error": null}
A failed URL looks like this:
{"url": "https://example.com/reports/missing.pdf","fileType": null,"pageCount": null,"pagesProcessed": null,"ocrPages": null,"text": null,"markdown": null,"tables": null,"metadata": null,"error": "Download failed: HTTP 404"}
How pages are counted: a PDF page is a page; each image is one page (each frame of a multi-page TIFF counts; an animated GIF is one page); a DOCX has the pages Word last laid out, or one page per 3,000 characters when the file has no layout information (for example, files generated by a script). When a page limit applies, pagesProcessed is lower than pageCount.
Export the dataset as JSON, CSV, Excel or HTML, or read the Overview and Tables views in the Console.
Pricing
This Actor uses pay-per-event pricing. You pay only for pages processed successfully, and platform usage is included in the price. See the Pricing tab for the current price per event.
| Event | When it is charged |
|---|---|
page-processed | Once per page extracted from a document that returns a row without error, OCR included |
Files that fail are not charged. Pages beyond maxPagesPerDocument are not read and not charged. If you set a maximum charge for the run, the Actor processes only the pages that fit in it, keeps every row produced so far and stops cleanly.
Free plan limits
Users on the Apify Free plan can process up to 10 documents per run and 20 pages per document. The Actor processes the first 10 documents and the first 20 pages of each, saves them and finishes with a clear message. Paid plans have no per-run document limit and use maxPagesPerDocument (up to 1,000 pages).
Use cases
- RAG and AI agents: convert PDFs and Word files into Markdown that keeps headings and tables before chunking and embedding them.
- Scanned archives: get searchable text out of scanned contracts, invoices and forms with OCR.
- Table extraction: pull tables out of financial reports and price lists straight into rows for a spreadsheet or database.
- Document pipelines: schedule runs or call the Actor from Make, Zapier, n8n or the API whenever new files land in storage.
- Spanish documents: OCR in Spanish, with accents and ñ, for Latin American and Spanish paperwork.
Comparison with alternatives
| Option | Good for | Trade-off |
|---|---|---|
| This Actor | Batches of mixed PDF, DOCX and image files from the Console, the API, a schedule or an AI agent, paid per page | OCR handles printed text, not handwriting; layout of complex multi-column pages is simplified |
| Online PDF converters | Converting one file by hand | One file at a time, no API, no Markdown or tables as data |
| Cloud document AI services | Forms, handwriting and key-value extraction | Need an account, credentials and setup, and are priced for enterprise volumes |
| Your own script with open-source libraries | Full control | You host it, install OCR and maintain the edge cases of every file type |
You are responsible for having the right to process the documents you send. The Actor stores nothing outside the run's dataset.