PDF, Image & Word to Text and Markdown (OCR) avatar

PDF, Image & Word to Text and Markdown (OCR)

Pricing

from $3.00 / 1,000 page extracteds

Go to Apify Store
PDF, Image & Word to Text and Markdown (OCR)

PDF, Image & Word to Text and Markdown (OCR)

Returns the text, Markdown, tables and page facts of a PDF, PNG, JPEG, TIFF or Word .docx file, one dataset row per page, plus RAG chunks with page spans. Reads the text layer, runs OCR only on scanned or unreadable pages, and flags illegible pages. Input: URL, upload or base64. First page free.

Pricing

from $3.00 / 1,000 page extracteds

Rating

0.0

(0)

Developer

Atarivo Enterprises Inc.

Atarivo Enterprises Inc.

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

This Actor turns a PDF, a scanned page, a PNG/JPEG/TIFF image or a Word .docx file into clean text and Markdown, one result row per page, with tables, page facts and RAG-ready chunks. It reads the PDF text layer first and runs OCR only on pages that are scanned, empty or unreadable, so you pay for OCR only where it was needed. To try it, keep the sample input (a small two-page PDF with one table) and press Start; the run takes a few seconds.

What does the PDF, Image & Word to Text and Markdown extractor do?

  • Returns one dataset row per page with text, markdown, tables, facts, ocr and legible, plus a final document row with links to the full Markdown file and the chunks JSON.
  • PDF to Markdown: headings are detected from font size, paragraphs are re-joined, bullet lists are kept, and ruled tables become Markdown tables.
  • OCR for scanned PDFs and images: pages without a usable text layer are rendered at 300 dpi and read with Tesseract (English). Every page gets a legibility verdict, so "unreadable" is an explicit legible: false, not a silent empty string.
  • PDF table extraction: each table comes back as a list of rows and as Markdown.
  • RAG chunks: text split at paragraph and table boundaries into chunks of about chunkChars characters, each with the first and last page it came from.
  • Page facts: size in points, rotation, fonts used, image count, character count, where the text came from (text layer, OCR, docx) and a 0–1 legibility score.
  • Accepts a URL, a file upload (stored in your key-value store) or base64.
  • Makes network calls only to fetch the URL you supply. It calls no AI model: the same file gives the same result every time.

How to use the PDF to text and Markdown extractor

  1. Paste a link to your file into Document URL or upload, or upload the file there. If the file is not online, paste it base64-encoded into Document as base64 instead.
  2. Optionally choose the OCR mode, Max pages, the Outputs you want and the Chunk size.
  3. Press Start. Open the Output tab for the page rows, or download document.md and chunks.json from the links in the last (document) row.

Calling it from an AI agent or the API: {"url": "https://example.com/report.pdf"} is the whole input. The description above is also this Actor's tool description in the Apify MCP server.

Pricing

EventWhat you pay forPrice
page-extractedOne page delivered with text, Markdown and facts$0.003
page-ocrAdd-on: a page whose text came from OCR$0.010
table-extractedAdd-on: one table delivered as rows and Markdown$0.005

The first page of every run is free, add-ons included. Blank pages are free. A Word .docx file has no fixed pages, so it is billed as one page-extracted per 3,000 characters of extracted text, rounded up, with a minimum of one (a 7,500-character document is 3 pages); each 3,000-character part is one result row. OCR is never charged for .docx. You pay only for results that were saved. Set Max cost per run to cap a run: the Actor stops cleanly at the cap, says so in its status message, and marks the document row

truncated: true, reason: "budget"
. Platform usage is included (no "+usage" charges). A link that returns an HTTP error (such as 404) produces one error row, billed as one page; input the Actor cannot accept (both or neither of URL and base64, an unsupported file type, a private address, a file over the size limit) fails the run at once and costs nothing.

Input

FieldTypeRequiredNotes
urlstringone of url / base64http(s) link or Console upload. Up to 50 MB, fetched within 60 s. Private, loopback, link-local and cloud-metadata addresses are refused, also after redirects.
base64stringone of url / base64The file, base64-encoded. Up to 20 MB decoded.
fileNamestringnoUsed in messages and in the chunks file. The type is read from the bytes.
ocrauto / never / alwaysnoDefault auto: OCR only empty or illegible pages. Images always need OCR.
maxPagesintegernoDefault 500, minimum 1, maximum 2,000.
outputslistnoAny of text, markdown, chunks, tables. Default: all.
chunkCharsintegernoDefault 1,500, minimum 200, maximum 20,000.

Supported files: PDF (text or scanned), PNG, JPEG, TIFF (every frame is a page) and Word .docx. Password-protected PDFs and legacy .doc files are refused with a clear message.

{ "url": "https://example.com/annual-report.pdf", "ocr": "auto", "maxPages": 500 }

Output

One row per page:

{
"type": "page",
"page": 2,
"text": "Harvest by crop\nTotals were weighed at the shed scale every Saturday morning.\n...",
"markdown": "### Harvest by crop\n\n...\n\n| Crop | Beds planted | Harvest (kg) |\n|---|---|---|\n| Tomato | 12 | 340 |",
"tables": [{"index": 0, "rows": [["Crop", "Beds planted", "Harvest (kg)"], ["Tomato", "12", "340"]], "markdown": "..."}],
"facts": {"width_pt": 612.0, "height_pt": 792.0, "rotation": 0, "fonts": ["Helvetica", "Helvetica-Bold"],
"images": 0, "chars": 276, "text_source": "text-layer", "legibility_score": 1.0,
"legibility_reason": "", "tables": 1, "ocr_attempted": false},
"ocr": false,
"legible": true
}

The last row is the document summary:

{"type": "document", "pages": 2, "pages_processed": 2, "tables_found": 1, "markdown_url": "...", "chunks_url": "...", "truncated": false, "reason": null, ...}
. The full Markdown is saved as document.md and the chunks as chunks.json (
{"chunks": [{"index", "text", "page_start", "page_end", "chars"}]}
) in the run's default key-value store.

Your document is processed inside your run only. It is never copied out of your run's storage, and its text is never logged. Run storage is kept for your plan's data-retention period (7 days for unnamed storages on most plans), then deleted by Apify. Download anything you want to keep.

Other Actors by Atarivo

Every Atarivo Actor follows the same rules: limited permissions, no "+usage" pricing, charges only after results are saved, and at least one result row per run.

FAQ, disclaimers and support

When does OCR run? With ocr: auto, only on a page whose text layer is empty or reads as noise (too few real words). A short page of real words, such as "Appendix B", keeps its text layer. ocr: always OCRs every PDF page; ocr: never never does.

What does legible: false mean? The page's final text failed the legibility check: it is empty, too short, or mostly not real words. Treat that page's text with care, or review the page by eye.

Which languages does OCR read? English. Text-layer PDFs and .docx files work in any language; the legibility verdict is tuned for English words.

Does it work with the Apify MCP server and AI agents? Yes. Pass a url (or base64) and read the page rows or the chunks file.

Is it legal to process my documents here? Only process documents you have the right to process. Under Apify's Standard Actor Contract, Atarivo acts as a processor of the document data you supply.

Something is wrong. Open an issue on the Issues tab with the run ID. Issues are answered within 14 days.

This Actor is provided as is, under Apify's Standard Actor Contract. It is not affiliated with or endorsed by Adobe, Microsoft or the Tesseract project.