# PDF, Image & Word to Text and Markdown (OCR) (`atarivo/pdf-image-text-markdown-extractor`) Actor

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.

- **URL**: https://apify.com/atarivo/pdf-image-text-markdown-extractor.md
- **Developed by:** [Atarivo Enterprises Inc.](https://apify.com/atarivo) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 page extracteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

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

| Event | What you pay for | Price |
|---|---|---|
| `page-extracted` | One page delivered with text, Markdown and facts | $0.003 |
| `page-ocr` | Add-on: a page whose text came from OCR | $0.010 |
| `table-extracted` | Add-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

| Field | Type | Required | Notes |
|---|---|---|---|
| `url` | string | one of `url` / `base64` | http(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. |
| `base64` | string | one of `url` / `base64` | The file, base64-encoded. Up to 20 MB decoded. |
| `fileName` | string | no | Used in messages and in the chunks file. The type is read from the bytes. |
| `ocr` | `auto` / `never` / `always` | no | Default `auto`: OCR only empty or illegible pages. Images always need OCR. |
| `maxPages` | integer | no | Default 500, minimum 1, maximum 2,000. |
| `outputs` | list | no | Any of `text`, `markdown`, `chunks`, `tables`. Default: all. |
| `chunkChars` | integer | no | Default 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.

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

### Output

One row per page:

```json
{
  "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.

# Actor input Schema

## `url` (type: `string`):

Public http(s) link to a PDF, PNG, JPEG, TIFF or .docx file, or upload one here (it is stored in your key-value store and passed as its URL). Up to 50 MB, fetched within 60 seconds. Links to private, loopback or cloud-metadata addresses are refused. Give this or 'base64', not both.

## `base64` (type: `string`):

The file itself, base64-encoded (a data: URI prefix is accepted). Up to 20 MB decoded. Use this when the file is not online. Give this or 'url', not both. The sample is a 2-page synthetic PDF with one table.

## `fileName` (type: `string`):

Optional name of the file, such as report.pdf. Used in messages and in the chunks file; the type is always read from the file's bytes.

## `ocr` (type: `string`):

auto (default) runs OCR only on pages whose text layer is empty or illegible; never uses the text layer only (images need OCR, so never fails on an image); always OCRs every PDF page. Each OCR'd page adds the page-ocr event.

## `maxPages` (type: `integer`):

Stop after this many pages (default 500, minimum 1, maximum 2000). For .docx a page is 3,000 characters. The document row says truncated: true when pages were left unread.

## `outputs` (type: `array`):

Which outputs to produce: text, markdown, chunks (RAG chunks JSON with page spans), tables. Default: all four. Without tables, no table-extracted events are charged.

## `chunkChars` (type: `integer`):

Target size of each RAG chunk in characters (default 1,500, minimum 200, maximum 20,000). Chunks break at paragraph and table boundaries and record the pages they span.

## Actor input object example

```json
{
  "base64": "JVBERi0xLjMKJeLjz9MKMSAwIG9iago8PAovUHJvZHVjZXIgKG9wZW5jbGF3XDA1NWFjdG9ycyBzeW50aGV0aWMgZml4dHVyZSkKL1RpdGxlIChDb21tdW5pdHkgR2FyZGVuIFNlYXNvbiBSZXBvcnQpCj4+CmVuZG9iagoyIDAgb2JqCjw8Ci9UeXBlIC9QYWdlcwovQ291bnQgMgovS2lkcyBbIDYgMCBSIDggMCBSIF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDIgMCBSCj4+CmVuZG9iago0IDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL0hlbHZldGljYQovRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwo+PgplbmRvYmoKNSAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9IZWx2ZXRpY2EtQm9sZAovRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwo+PgplbmRvYmoKNiAwIG9iago8PAovVHlwZSAvUGFnZQovUmVzb3VyY2VzIDw8Ci9Gb250IDw8Ci9GMSA0IDAgUgovRjIgNSAwIFIKPj4KL1Byb2NTZXQgWyAvUERGIC9UZXh0IF0KPj4KL01lZGlhQm94IFsgMC4wIDAuMCA2MTIgNzkyIF0KL1BhcmVudCAyIDAgUgovQ29udGVudHMgNyAwIFIKPj4KZW5kb2JqCjcgMCBvYmoKPDwKL0xlbmd0aCA4ODkKPj4Kc3RyZWFtCkJUIDAgVHIgL0YyIDIwIFRmIDcyIDcwMCBUZCAoQ29tbXVuaXR5IEdhcmRlbiBTZWFzb24gUmVwb3J0KSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiA3MiA2NjAgVGQgKFRoZSBjb21tdW5pdHkgZ2FyZGVuIGZpbmlzaGVkIGl0cyB0aGlyZCBzZWFzb24gd2l0aCBldmVyeSBiZWQgcGxhbnRlZCBhbmQgd2F0ZXJlZCBvbikgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgNzIgNjQ1IFRkIChzY2hlZHVsZS4gVm9sdW50ZWVycyBrZXB0IGEgc2ltcGxlIGxvZyBvZiB3aGF0IHdlbnQgaW50byB0aGUgZ3JvdW5kLCBob3cgb2Z0ZW4gdGhlIGJlZHMpIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDcyIDYzMCBUZCAod2VyZSB3ZWVkZWQsIGFuZCB3aGF0IGNhbWUgb3V0IGF0IHRoZSBlbmQgb2Ygc3VtbWVyLiBUaGlzIHJlcG9ydCBjb2xsZWN0cyB0aG9zZSBub3RlcykgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgNzIgNjE1IFRkIChzbyBuZXh0IHllYXIncyBwbGFudGluZyBwbGFuIGNhbiBzdGFydCBmcm9tIHJlYWwgbnVtYmVycyBpbnN0ZWFkIG9mIG1lbW9yeS4pIFRqIEVUCkJUIDAgVHIgL0YyIDE0IFRmIDcyIDU4MCBUZCAoV2hhdCB3b3JrZWQpIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDcyIDU1NiBUZCAoTXVsY2hpbmcgdGhlIHRvbWF0byBiZWRzIGVhcmx5IGtlcHQgdGhlIHNvaWwgbW9pc3QgdGhyb3VnaCB0aGUgZHJ5IHdlZWtzKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiA3MiA1NDEgVGQgKGFuZCBjdXQgdGhlIHdlZWRpbmcgdGltZSByb3VnaGx5IGluIGhhbGYuIFRoZSBkcmlwIGxpbmUgb24gdGhlIGVhc3Qgc2lkZSkgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgNzIgNTI2IFRkICh3YXMgdGhlIHNpbmdsZSBiZXN0IHB1cmNoYXNlIG9mIHRoZSB5ZWFyLikgVGogRVQKZW5kc3RyZWFtCmVuZG9iago4IDAgb2JqCjw8Ci9UeXBlIC9QYWdlCi9SZXNvdXJjZXMgPDwKL0ZvbnQgPDwKL0YxIDQgMCBSCi9GMiA1IDAgUgo+PgovUHJvY1NldCBbIC9QREYgL1RleHQgXQo+PgovTWVkaWFCb3ggWyAwLjAgMC4wIDYxMiA3OTIgXQovUGFyZW50IDIgMCBSCi9Db250ZW50cyA5IDAgUgo+PgplbmRvYmoKOSAwIG9iago8PAovTGVuZ3RoIDEwNTkKPj4Kc3RyZWFtCkJUIDAgVHIgL0YyIDE2IFRmIDcyIDcwMCBUZCAoSGFydmVzdCBieSBjcm9wKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiA3MiA2NzYgVGQgKFRvdGFscyB3ZXJlIHdlaWdoZWQgYXQgdGhlIHNoZWQgc2NhbGUgZXZlcnkgU2F0dXJkYXkgbW9ybmluZy4pIFRqIEVUCkJUIDAgVHIgL0YyIDExIFRmIDc4IDYyNCBUZCAoQ3JvcCkgVGogRVQKQlQgMCBUciAvRjIgMTEgVGYgMjM4IDYyNCBUZCAoQmVkcyBwbGFudGVkKSBUaiBFVApCVCAwIFRyIC9GMiAxMSBUZiAzNTggNjI0IFRkIChIYXJ2ZXN0IFwoa2dcKSkgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgNzggNjAwIFRkIChUb21hdG8pIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDIzOCA2MDAgVGQgKDEyKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiAzNTggNjAwIFRkICgzNDApIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDc4IDU3NiBUZCAoR3JlZW4gYmVhbikgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgMjM4IDU3NiBUZCAoOCkgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgMzU4IDU3NiBUZCAoOTUpIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDc4IDU1MiBUZCAoU3F1YXNoKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiAyMzggNTUyIFRkICg1KSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiAzNTggNTUyIFRkICgyMTApIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDcyIDUwMCBUZCAoVG9tYXRvZXMgYWdhaW4gcHJvZHVjZWQgdGhlIG1vc3Qgd2VpZ2h0IHBlciBiZWQuIEJlYW5zIHdlcmUgcGxhbnRlZCBsYXRlKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiA3MiA0ODUgVGQgKGFuZCB3aWxsIG1vdmUgdG8gdGhlIHN1bm5pZXIgbm9ydGggcm93IG5leHQgc3ByaW5nLikgVGogRVQKMC44IHcKNzIgNjQwIG0gNDcyIDY0MCBsIFMKNzIgNjE2IG0gNDcyIDYxNiBsIFMKNzIgNTkyIG0gNDcyIDU5MiBsIFMKNzIgNTY4IG0gNDcyIDU2OCBsIFMKNzIgNTQ0IG0gNDcyIDU0NCBsIFMKNzIgNjQwIG0gNzIgNTQ0IGwgUwoyMzIgNjQwIG0gMjMyIDU0NCBsIFMKMzUyIDY0MCBtIDM1MiA1NDQgbCBTCjQ3MiA2NDAgbSA0NzIgNTQ0IGwgUwplbmRzdHJlYW0KZW5kb2JqCnhyZWYKMCAxMAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwMDEyNSAwMDAwMCBuIAowMDAwMDAwMTkwIDAwMDAwIG4gCjAwMDAwMDAyMzkgMDAwMDAgbiAKMDAwMDAwMDMzNiAwMDAwMCBuIAowMDAwMDAwNDM4IDAwMDAwIG4gCjAwMDAwMDA2MDQgMDAwMDAgbiAKMDAwMDAwMTU0NCAwMDAwMCBuIAowMDAwMDAxNzEwIDAwMDAwIG4gCnRyYWlsZXIKPDwKL1NpemUgMTAKL1Jvb3QgMyAwIFIKL0luZm8gMSAwIFIKL0lEIFsgPDZmNzA2NTZlNjM2YzYxNzcyZDYxNjM3NDZmNzI3MzIxPiA8NmY3MDY1NmU2MzZjNjE3NzJkNjE2Mzc0NmY3MjczMjE+IF0KPj4Kc3RhcnR4cmVmCjI4MjEKJSVFT0YK",
  "ocr": "auto",
  "maxPages": 500,
  "outputs": [
    "text",
    "markdown",
    "chunks",
    "tables"
  ],
  "chunkChars": 1500
}
```

# Actor output Schema

## `pages` (type: `string`):

One row per page (text, markdown, tables, facts, ocr, legible) and a final document row with the file links.

## `markdown` (type: `string`):

The whole document as one Markdown file, pages separated by  comments.

## `chunks` (type: `string`):

Chunks sized by chunkChars, each with its text, character count and first and last page.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "base64": "JVBERi0xLjMKJeLjz9MKMSAwIG9iago8PAovUHJvZHVjZXIgKG9wZW5jbGF3XDA1NWFjdG9ycyBzeW50aGV0aWMgZml4dHVyZSkKL1RpdGxlIChDb21tdW5pdHkgR2FyZGVuIFNlYXNvbiBSZXBvcnQpCj4+CmVuZG9iagoyIDAgb2JqCjw8Ci9UeXBlIC9QYWdlcwovQ291bnQgMgovS2lkcyBbIDYgMCBSIDggMCBSIF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDIgMCBSCj4+CmVuZG9iago0IDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL0hlbHZldGljYQovRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwo+PgplbmRvYmoKNSAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9IZWx2ZXRpY2EtQm9sZAovRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwo+PgplbmRvYmoKNiAwIG9iago8PAovVHlwZSAvUGFnZQovUmVzb3VyY2VzIDw8Ci9Gb250IDw8Ci9GMSA0IDAgUgovRjIgNSAwIFIKPj4KL1Byb2NTZXQgWyAvUERGIC9UZXh0IF0KPj4KL01lZGlhQm94IFsgMC4wIDAuMCA2MTIgNzkyIF0KL1BhcmVudCAyIDAgUgovQ29udGVudHMgNyAwIFIKPj4KZW5kb2JqCjcgMCBvYmoKPDwKL0xlbmd0aCA4ODkKPj4Kc3RyZWFtCkJUIDAgVHIgL0YyIDIwIFRmIDcyIDcwMCBUZCAoQ29tbXVuaXR5IEdhcmRlbiBTZWFzb24gUmVwb3J0KSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiA3MiA2NjAgVGQgKFRoZSBjb21tdW5pdHkgZ2FyZGVuIGZpbmlzaGVkIGl0cyB0aGlyZCBzZWFzb24gd2l0aCBldmVyeSBiZWQgcGxhbnRlZCBhbmQgd2F0ZXJlZCBvbikgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgNzIgNjQ1IFRkIChzY2hlZHVsZS4gVm9sdW50ZWVycyBrZXB0IGEgc2ltcGxlIGxvZyBvZiB3aGF0IHdlbnQgaW50byB0aGUgZ3JvdW5kLCBob3cgb2Z0ZW4gdGhlIGJlZHMpIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDcyIDYzMCBUZCAod2VyZSB3ZWVkZWQsIGFuZCB3aGF0IGNhbWUgb3V0IGF0IHRoZSBlbmQgb2Ygc3VtbWVyLiBUaGlzIHJlcG9ydCBjb2xsZWN0cyB0aG9zZSBub3RlcykgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgNzIgNjE1IFRkIChzbyBuZXh0IHllYXIncyBwbGFudGluZyBwbGFuIGNhbiBzdGFydCBmcm9tIHJlYWwgbnVtYmVycyBpbnN0ZWFkIG9mIG1lbW9yeS4pIFRqIEVUCkJUIDAgVHIgL0YyIDE0IFRmIDcyIDU4MCBUZCAoV2hhdCB3b3JrZWQpIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDcyIDU1NiBUZCAoTXVsY2hpbmcgdGhlIHRvbWF0byBiZWRzIGVhcmx5IGtlcHQgdGhlIHNvaWwgbW9pc3QgdGhyb3VnaCB0aGUgZHJ5IHdlZWtzKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiA3MiA1NDEgVGQgKGFuZCBjdXQgdGhlIHdlZWRpbmcgdGltZSByb3VnaGx5IGluIGhhbGYuIFRoZSBkcmlwIGxpbmUgb24gdGhlIGVhc3Qgc2lkZSkgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgNzIgNTI2IFRkICh3YXMgdGhlIHNpbmdsZSBiZXN0IHB1cmNoYXNlIG9mIHRoZSB5ZWFyLikgVGogRVQKZW5kc3RyZWFtCmVuZG9iago4IDAgb2JqCjw8Ci9UeXBlIC9QYWdlCi9SZXNvdXJjZXMgPDwKL0ZvbnQgPDwKL0YxIDQgMCBSCi9GMiA1IDAgUgo+PgovUHJvY1NldCBbIC9QREYgL1RleHQgXQo+PgovTWVkaWFCb3ggWyAwLjAgMC4wIDYxMiA3OTIgXQovUGFyZW50IDIgMCBSCi9Db250ZW50cyA5IDAgUgo+PgplbmRvYmoKOSAwIG9iago8PAovTGVuZ3RoIDEwNTkKPj4Kc3RyZWFtCkJUIDAgVHIgL0YyIDE2IFRmIDcyIDcwMCBUZCAoSGFydmVzdCBieSBjcm9wKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiA3MiA2NzYgVGQgKFRvdGFscyB3ZXJlIHdlaWdoZWQgYXQgdGhlIHNoZWQgc2NhbGUgZXZlcnkgU2F0dXJkYXkgbW9ybmluZy4pIFRqIEVUCkJUIDAgVHIgL0YyIDExIFRmIDc4IDYyNCBUZCAoQ3JvcCkgVGogRVQKQlQgMCBUciAvRjIgMTEgVGYgMjM4IDYyNCBUZCAoQmVkcyBwbGFudGVkKSBUaiBFVApCVCAwIFRyIC9GMiAxMSBUZiAzNTggNjI0IFRkIChIYXJ2ZXN0IFwoa2dcKSkgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgNzggNjAwIFRkIChUb21hdG8pIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDIzOCA2MDAgVGQgKDEyKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiAzNTggNjAwIFRkICgzNDApIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDc4IDU3NiBUZCAoR3JlZW4gYmVhbikgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgMjM4IDU3NiBUZCAoOCkgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgMzU4IDU3NiBUZCAoOTUpIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDc4IDU1MiBUZCAoU3F1YXNoKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiAyMzggNTUyIFRkICg1KSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiAzNTggNTUyIFRkICgyMTApIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDcyIDUwMCBUZCAoVG9tYXRvZXMgYWdhaW4gcHJvZHVjZWQgdGhlIG1vc3Qgd2VpZ2h0IHBlciBiZWQuIEJlYW5zIHdlcmUgcGxhbnRlZCBsYXRlKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiA3MiA0ODUgVGQgKGFuZCB3aWxsIG1vdmUgdG8gdGhlIHN1bm5pZXIgbm9ydGggcm93IG5leHQgc3ByaW5nLikgVGogRVQKMC44IHcKNzIgNjQwIG0gNDcyIDY0MCBsIFMKNzIgNjE2IG0gNDcyIDYxNiBsIFMKNzIgNTkyIG0gNDcyIDU5MiBsIFMKNzIgNTY4IG0gNDcyIDU2OCBsIFMKNzIgNTQ0IG0gNDcyIDU0NCBsIFMKNzIgNjQwIG0gNzIgNTQ0IGwgUwoyMzIgNjQwIG0gMjMyIDU0NCBsIFMKMzUyIDY0MCBtIDM1MiA1NDQgbCBTCjQ3MiA2NDAgbSA0NzIgNTQ0IGwgUwplbmRzdHJlYW0KZW5kb2JqCnhyZWYKMCAxMAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwMDEyNSAwMDAwMCBuIAowMDAwMDAwMTkwIDAwMDAwIG4gCjAwMDAwMDAyMzkgMDAwMDAgbiAKMDAwMDAwMDMzNiAwMDAwMCBuIAowMDAwMDAwNDM4IDAwMDAwIG4gCjAwMDAwMDA2MDQgMDAwMDAgbiAKMDAwMDAwMTU0NCAwMDAwMCBuIAowMDAwMDAxNzEwIDAwMDAwIG4gCnRyYWlsZXIKPDwKL1NpemUgMTAKL1Jvb3QgMyAwIFIKL0luZm8gMSAwIFIKL0lEIFsgPDZmNzA2NTZlNjM2YzYxNzcyZDYxNjM3NDZmNzI3MzIxPiA8NmY3MDY1NmU2MzZjNjE3NzJkNjE2Mzc0NmY3MjczMjE+IF0KPj4Kc3RhcnR4cmVmCjI4MjEKJSVFT0YK"
};

// Run the Actor and wait for it to finish
const run = await client.actor("atarivo/pdf-image-text-markdown-extractor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "base64": "JVBERi0xLjMKJeLjz9MKMSAwIG9iago8PAovUHJvZHVjZXIgKG9wZW5jbGF3XDA1NWFjdG9ycyBzeW50aGV0aWMgZml4dHVyZSkKL1RpdGxlIChDb21tdW5pdHkgR2FyZGVuIFNlYXNvbiBSZXBvcnQpCj4+CmVuZG9iagoyIDAgb2JqCjw8Ci9UeXBlIC9QYWdlcwovQ291bnQgMgovS2lkcyBbIDYgMCBSIDggMCBSIF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDIgMCBSCj4+CmVuZG9iago0IDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL0hlbHZldGljYQovRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwo+PgplbmRvYmoKNSAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9IZWx2ZXRpY2EtQm9sZAovRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwo+PgplbmRvYmoKNiAwIG9iago8PAovVHlwZSAvUGFnZQovUmVzb3VyY2VzIDw8Ci9Gb250IDw8Ci9GMSA0IDAgUgovRjIgNSAwIFIKPj4KL1Byb2NTZXQgWyAvUERGIC9UZXh0IF0KPj4KL01lZGlhQm94IFsgMC4wIDAuMCA2MTIgNzkyIF0KL1BhcmVudCAyIDAgUgovQ29udGVudHMgNyAwIFIKPj4KZW5kb2JqCjcgMCBvYmoKPDwKL0xlbmd0aCA4ODkKPj4Kc3RyZWFtCkJUIDAgVHIgL0YyIDIwIFRmIDcyIDcwMCBUZCAoQ29tbXVuaXR5IEdhcmRlbiBTZWFzb24gUmVwb3J0KSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiA3MiA2NjAgVGQgKFRoZSBjb21tdW5pdHkgZ2FyZGVuIGZpbmlzaGVkIGl0cyB0aGlyZCBzZWFzb24gd2l0aCBldmVyeSBiZWQgcGxhbnRlZCBhbmQgd2F0ZXJlZCBvbikgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgNzIgNjQ1IFRkIChzY2hlZHVsZS4gVm9sdW50ZWVycyBrZXB0IGEgc2ltcGxlIGxvZyBvZiB3aGF0IHdlbnQgaW50byB0aGUgZ3JvdW5kLCBob3cgb2Z0ZW4gdGhlIGJlZHMpIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDcyIDYzMCBUZCAod2VyZSB3ZWVkZWQsIGFuZCB3aGF0IGNhbWUgb3V0IGF0IHRoZSBlbmQgb2Ygc3VtbWVyLiBUaGlzIHJlcG9ydCBjb2xsZWN0cyB0aG9zZSBub3RlcykgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgNzIgNjE1IFRkIChzbyBuZXh0IHllYXIncyBwbGFudGluZyBwbGFuIGNhbiBzdGFydCBmcm9tIHJlYWwgbnVtYmVycyBpbnN0ZWFkIG9mIG1lbW9yeS4pIFRqIEVUCkJUIDAgVHIgL0YyIDE0IFRmIDcyIDU4MCBUZCAoV2hhdCB3b3JrZWQpIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDcyIDU1NiBUZCAoTXVsY2hpbmcgdGhlIHRvbWF0byBiZWRzIGVhcmx5IGtlcHQgdGhlIHNvaWwgbW9pc3QgdGhyb3VnaCB0aGUgZHJ5IHdlZWtzKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiA3MiA1NDEgVGQgKGFuZCBjdXQgdGhlIHdlZWRpbmcgdGltZSByb3VnaGx5IGluIGhhbGYuIFRoZSBkcmlwIGxpbmUgb24gdGhlIGVhc3Qgc2lkZSkgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgNzIgNTI2IFRkICh3YXMgdGhlIHNpbmdsZSBiZXN0IHB1cmNoYXNlIG9mIHRoZSB5ZWFyLikgVGogRVQKZW5kc3RyZWFtCmVuZG9iago4IDAgb2JqCjw8Ci9UeXBlIC9QYWdlCi9SZXNvdXJjZXMgPDwKL0ZvbnQgPDwKL0YxIDQgMCBSCi9GMiA1IDAgUgo+PgovUHJvY1NldCBbIC9QREYgL1RleHQgXQo+PgovTWVkaWFCb3ggWyAwLjAgMC4wIDYxMiA3OTIgXQovUGFyZW50IDIgMCBSCi9Db250ZW50cyA5IDAgUgo+PgplbmRvYmoKOSAwIG9iago8PAovTGVuZ3RoIDEwNTkKPj4Kc3RyZWFtCkJUIDAgVHIgL0YyIDE2IFRmIDcyIDcwMCBUZCAoSGFydmVzdCBieSBjcm9wKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiA3MiA2NzYgVGQgKFRvdGFscyB3ZXJlIHdlaWdoZWQgYXQgdGhlIHNoZWQgc2NhbGUgZXZlcnkgU2F0dXJkYXkgbW9ybmluZy4pIFRqIEVUCkJUIDAgVHIgL0YyIDExIFRmIDc4IDYyNCBUZCAoQ3JvcCkgVGogRVQKQlQgMCBUciAvRjIgMTEgVGYgMjM4IDYyNCBUZCAoQmVkcyBwbGFudGVkKSBUaiBFVApCVCAwIFRyIC9GMiAxMSBUZiAzNTggNjI0IFRkIChIYXJ2ZXN0IFwoa2dcKSkgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgNzggNjAwIFRkIChUb21hdG8pIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDIzOCA2MDAgVGQgKDEyKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiAzNTggNjAwIFRkICgzNDApIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDc4IDU3NiBUZCAoR3JlZW4gYmVhbikgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgMjM4IDU3NiBUZCAoOCkgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgMzU4IDU3NiBUZCAoOTUpIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDc4IDU1MiBUZCAoU3F1YXNoKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiAyMzggNTUyIFRkICg1KSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiAzNTggNTUyIFRkICgyMTApIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDcyIDUwMCBUZCAoVG9tYXRvZXMgYWdhaW4gcHJvZHVjZWQgdGhlIG1vc3Qgd2VpZ2h0IHBlciBiZWQuIEJlYW5zIHdlcmUgcGxhbnRlZCBsYXRlKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiA3MiA0ODUgVGQgKGFuZCB3aWxsIG1vdmUgdG8gdGhlIHN1bm5pZXIgbm9ydGggcm93IG5leHQgc3ByaW5nLikgVGogRVQKMC44IHcKNzIgNjQwIG0gNDcyIDY0MCBsIFMKNzIgNjE2IG0gNDcyIDYxNiBsIFMKNzIgNTkyIG0gNDcyIDU5MiBsIFMKNzIgNTY4IG0gNDcyIDU2OCBsIFMKNzIgNTQ0IG0gNDcyIDU0NCBsIFMKNzIgNjQwIG0gNzIgNTQ0IGwgUwoyMzIgNjQwIG0gMjMyIDU0NCBsIFMKMzUyIDY0MCBtIDM1MiA1NDQgbCBTCjQ3MiA2NDAgbSA0NzIgNTQ0IGwgUwplbmRzdHJlYW0KZW5kb2JqCnhyZWYKMCAxMAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwMDEyNSAwMDAwMCBuIAowMDAwMDAwMTkwIDAwMDAwIG4gCjAwMDAwMDAyMzkgMDAwMDAgbiAKMDAwMDAwMDMzNiAwMDAwMCBuIAowMDAwMDAwNDM4IDAwMDAwIG4gCjAwMDAwMDA2MDQgMDAwMDAgbiAKMDAwMDAwMTU0NCAwMDAwMCBuIAowMDAwMDAxNzEwIDAwMDAwIG4gCnRyYWlsZXIKPDwKL1NpemUgMTAKL1Jvb3QgMyAwIFIKL0luZm8gMSAwIFIKL0lEIFsgPDZmNzA2NTZlNjM2YzYxNzcyZDYxNjM3NDZmNzI3MzIxPiA8NmY3MDY1NmU2MzZjNjE3NzJkNjE2Mzc0NmY3MjczMjE+IF0KPj4Kc3RhcnR4cmVmCjI4MjEKJSVFT0YK" }

# Run the Actor and wait for it to finish
run = client.actor("atarivo/pdf-image-text-markdown-extractor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "base64": "JVBERi0xLjMKJeLjz9MKMSAwIG9iago8PAovUHJvZHVjZXIgKG9wZW5jbGF3XDA1NWFjdG9ycyBzeW50aGV0aWMgZml4dHVyZSkKL1RpdGxlIChDb21tdW5pdHkgR2FyZGVuIFNlYXNvbiBSZXBvcnQpCj4+CmVuZG9iagoyIDAgb2JqCjw8Ci9UeXBlIC9QYWdlcwovQ291bnQgMgovS2lkcyBbIDYgMCBSIDggMCBSIF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDIgMCBSCj4+CmVuZG9iago0IDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL0hlbHZldGljYQovRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwo+PgplbmRvYmoKNSAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9IZWx2ZXRpY2EtQm9sZAovRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwo+PgplbmRvYmoKNiAwIG9iago8PAovVHlwZSAvUGFnZQovUmVzb3VyY2VzIDw8Ci9Gb250IDw8Ci9GMSA0IDAgUgovRjIgNSAwIFIKPj4KL1Byb2NTZXQgWyAvUERGIC9UZXh0IF0KPj4KL01lZGlhQm94IFsgMC4wIDAuMCA2MTIgNzkyIF0KL1BhcmVudCAyIDAgUgovQ29udGVudHMgNyAwIFIKPj4KZW5kb2JqCjcgMCBvYmoKPDwKL0xlbmd0aCA4ODkKPj4Kc3RyZWFtCkJUIDAgVHIgL0YyIDIwIFRmIDcyIDcwMCBUZCAoQ29tbXVuaXR5IEdhcmRlbiBTZWFzb24gUmVwb3J0KSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiA3MiA2NjAgVGQgKFRoZSBjb21tdW5pdHkgZ2FyZGVuIGZpbmlzaGVkIGl0cyB0aGlyZCBzZWFzb24gd2l0aCBldmVyeSBiZWQgcGxhbnRlZCBhbmQgd2F0ZXJlZCBvbikgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgNzIgNjQ1IFRkIChzY2hlZHVsZS4gVm9sdW50ZWVycyBrZXB0IGEgc2ltcGxlIGxvZyBvZiB3aGF0IHdlbnQgaW50byB0aGUgZ3JvdW5kLCBob3cgb2Z0ZW4gdGhlIGJlZHMpIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDcyIDYzMCBUZCAod2VyZSB3ZWVkZWQsIGFuZCB3aGF0IGNhbWUgb3V0IGF0IHRoZSBlbmQgb2Ygc3VtbWVyLiBUaGlzIHJlcG9ydCBjb2xsZWN0cyB0aG9zZSBub3RlcykgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgNzIgNjE1IFRkIChzbyBuZXh0IHllYXIncyBwbGFudGluZyBwbGFuIGNhbiBzdGFydCBmcm9tIHJlYWwgbnVtYmVycyBpbnN0ZWFkIG9mIG1lbW9yeS4pIFRqIEVUCkJUIDAgVHIgL0YyIDE0IFRmIDcyIDU4MCBUZCAoV2hhdCB3b3JrZWQpIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDcyIDU1NiBUZCAoTXVsY2hpbmcgdGhlIHRvbWF0byBiZWRzIGVhcmx5IGtlcHQgdGhlIHNvaWwgbW9pc3QgdGhyb3VnaCB0aGUgZHJ5IHdlZWtzKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiA3MiA1NDEgVGQgKGFuZCBjdXQgdGhlIHdlZWRpbmcgdGltZSByb3VnaGx5IGluIGhhbGYuIFRoZSBkcmlwIGxpbmUgb24gdGhlIGVhc3Qgc2lkZSkgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgNzIgNTI2IFRkICh3YXMgdGhlIHNpbmdsZSBiZXN0IHB1cmNoYXNlIG9mIHRoZSB5ZWFyLikgVGogRVQKZW5kc3RyZWFtCmVuZG9iago4IDAgb2JqCjw8Ci9UeXBlIC9QYWdlCi9SZXNvdXJjZXMgPDwKL0ZvbnQgPDwKL0YxIDQgMCBSCi9GMiA1IDAgUgo+PgovUHJvY1NldCBbIC9QREYgL1RleHQgXQo+PgovTWVkaWFCb3ggWyAwLjAgMC4wIDYxMiA3OTIgXQovUGFyZW50IDIgMCBSCi9Db250ZW50cyA5IDAgUgo+PgplbmRvYmoKOSAwIG9iago8PAovTGVuZ3RoIDEwNTkKPj4Kc3RyZWFtCkJUIDAgVHIgL0YyIDE2IFRmIDcyIDcwMCBUZCAoSGFydmVzdCBieSBjcm9wKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiA3MiA2NzYgVGQgKFRvdGFscyB3ZXJlIHdlaWdoZWQgYXQgdGhlIHNoZWQgc2NhbGUgZXZlcnkgU2F0dXJkYXkgbW9ybmluZy4pIFRqIEVUCkJUIDAgVHIgL0YyIDExIFRmIDc4IDYyNCBUZCAoQ3JvcCkgVGogRVQKQlQgMCBUciAvRjIgMTEgVGYgMjM4IDYyNCBUZCAoQmVkcyBwbGFudGVkKSBUaiBFVApCVCAwIFRyIC9GMiAxMSBUZiAzNTggNjI0IFRkIChIYXJ2ZXN0IFwoa2dcKSkgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgNzggNjAwIFRkIChUb21hdG8pIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDIzOCA2MDAgVGQgKDEyKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiAzNTggNjAwIFRkICgzNDApIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDc4IDU3NiBUZCAoR3JlZW4gYmVhbikgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgMjM4IDU3NiBUZCAoOCkgVGogRVQKQlQgMCBUciAvRjEgMTEgVGYgMzU4IDU3NiBUZCAoOTUpIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDc4IDU1MiBUZCAoU3F1YXNoKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiAyMzggNTUyIFRkICg1KSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiAzNTggNTUyIFRkICgyMTApIFRqIEVUCkJUIDAgVHIgL0YxIDExIFRmIDcyIDUwMCBUZCAoVG9tYXRvZXMgYWdhaW4gcHJvZHVjZWQgdGhlIG1vc3Qgd2VpZ2h0IHBlciBiZWQuIEJlYW5zIHdlcmUgcGxhbnRlZCBsYXRlKSBUaiBFVApCVCAwIFRyIC9GMSAxMSBUZiA3MiA0ODUgVGQgKGFuZCB3aWxsIG1vdmUgdG8gdGhlIHN1bm5pZXIgbm9ydGggcm93IG5leHQgc3ByaW5nLikgVGogRVQKMC44IHcKNzIgNjQwIG0gNDcyIDY0MCBsIFMKNzIgNjE2IG0gNDcyIDYxNiBsIFMKNzIgNTkyIG0gNDcyIDU5MiBsIFMKNzIgNTY4IG0gNDcyIDU2OCBsIFMKNzIgNTQ0IG0gNDcyIDU0NCBsIFMKNzIgNjQwIG0gNzIgNTQ0IGwgUwoyMzIgNjQwIG0gMjMyIDU0NCBsIFMKMzUyIDY0MCBtIDM1MiA1NDQgbCBTCjQ3MiA2NDAgbSA0NzIgNTQ0IGwgUwplbmRzdHJlYW0KZW5kb2JqCnhyZWYKMCAxMAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwMDEyNSAwMDAwMCBuIAowMDAwMDAwMTkwIDAwMDAwIG4gCjAwMDAwMDAyMzkgMDAwMDAgbiAKMDAwMDAwMDMzNiAwMDAwMCBuIAowMDAwMDAwNDM4IDAwMDAwIG4gCjAwMDAwMDA2MDQgMDAwMDAgbiAKMDAwMDAwMTU0NCAwMDAwMCBuIAowMDAwMDAxNzEwIDAwMDAwIG4gCnRyYWlsZXIKPDwKL1NpemUgMTAKL1Jvb3QgMyAwIFIKL0luZm8gMSAwIFIKL0lEIFsgPDZmNzA2NTZlNjM2YzYxNzcyZDYxNjM3NDZmNzI3MzIxPiA8NmY3MDY1NmU2MzZjNjE3NzJkNjE2Mzc0NmY3MjczMjE+IF0KPj4Kc3RhcnR4cmVmCjI4MjEKJSVFT0YK"
}' |
apify call atarivo/pdf-image-text-markdown-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,atarivo/pdf-image-text-markdown-extractor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/M7Q95Hiieq4VxstV8/builds/qKQr36UlCl6usoMvH/openapi.json
