# PDF, Word & PowerPoint to Text/Markdown \[$3/1K 💰] (`cybermax/pdf-to-text`) Actor

💰 $3 per 1,000 documents, no start fee; failed and no-text files free. PDF, Word (DOCX) and PowerPoint (PPTX) to clean text and Markdown with headings, lists and tables kept, page rows and RAG chunks. Cheaper than memo23's PDF extractor ($5/1K + start fee). Changed-files monitor.

- **URL**: https://apify.com/cybermax/pdf-to-text.md
- **Developed by:** [CyberMax](https://apify.com/cybermax) (community)
- **Categories:** AI, Developer tools, MCP servers
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 document converteds

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

## Pageshuck: PDF to Text & Markdown Extractor (PDF, Word, PowerPoint)

#### Turn any PDF, Word or PowerPoint file into clean text and Markdown, with tables kept

Pageshuck downloads your **PDF, DOCX and PPTX** files and returns clean, LLM-ready **Markdown** (headings, bullet lists and tables kept) and **plain text** in reading order, plus page count, word count and document metadata. It reads two-column papers in the right order, rejoins words split across lines, and can split the text into **RAG chunks** for embeddings. One row per document, or one row per page for citations. **$3 per 1,000 documents, no start fee.**

**[▶ Try it now with a prefilled input](https://apify.com/cybermax/pdf-to-text)** · $0.003 per document (100 PDFs = $0.30) · up to 500 pages per document by default · Apify's free plan includes $5 of credit a month

**Built for:** RAG and AI-agent pipelines that need documents as Markdown · analysts pulling text from reports, filings and research papers · legal, finance and compliance teams searching contracts and policies · developers who need a PDF-to-text API without running their own parser

**Real output** (real run on Apify, 10 Nov 2026: 5 links, 3 documents converted (23 pages) in 2.9 s, platform cost $0.0002; the other 2 links answered 403 and 404 and were not charged):

| Document | Type | Pages | Words | Markdown (start) |
|---|---|---|---|---|
| IRS Form W-9 (fw9.pdf) | pdf | 6 | 6,525 | form header as a table: Form W-9 · Request for Taxpayer Identification Number and Certification · Give form to the requester… |
| BERT paper (arxiv.org/pdf/1810.04805, two columns) | pdf | 16 | 10,654 | `## BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding` · Abstract · We introduce a new language representation model… |
| calibre demo.docx | docx | 3 | 1,650 | Demonstration of DOCX support in calibre · This document demonstrates the ability of the calibre DOCX Input plugin… |

```json
{"urls": ["https://www.irs.gov/pub/irs-pdf/fw9.pdf", "https://arxiv.org/pdf/1810.04805"], "chunkSize": 1500}
```

### What you get for each document

| Field | What it is |
|---|---|
| `url`, `type`, `status` | The file, its type (`pdf`, `docx`, `pptx`) and `ok`, `no-text` or `error`. |
| `markdown` | Headings (`#`, `##`), bullet lists and tables as GitHub Markdown; pages separated by `<!-- page break -->`. |
| `text` | Clean plain text in reading order (table cells separated by tabs). |
| `pageCount`, `pagesExtracted`, `page` | Total pages, pages read, and the page number in per-page mode. |
| `words`, `characters` | Size of the extracted text. |
| `chunks` | Text split into chunks of `chunkSize` characters at paragraph and sentence ends (optional). |
| `metadata` | Title, author, subject, keywords, creator app, producer, created and modified dates, PDF version. |
| `needsOcr` | `true` when a PDF has little or no text layer (a scan): run those pages through OCR. |
| `sha256`, `fileSizeBytes`, `change` | File fingerprint and size; `new` or `changed` in monitor mode. |
| `error` | Why a file failed (404, password-protected, not a document, too big). |

### Ready-made inputs

| Job | Input |
|---|---|
| **One PDF to Markdown** | `{"urls": ["https://example.com/report.pdf"]}` |
| **Research papers for RAG** | `{"urls": ["https://arxiv.org/pdf/1810.04805"], "formats": ["markdown"], "chunkSize": 1500}` |
| **Page-by-page with citations** | `{"urls": ["https://example.com/handbook.pdf"], "outputMode": "pages"}` |
| **Only the first pages** | `{"urls": ["https://example.com/annual-report.pdf"], "pageRange": "1-5"}` |
| **Word and PowerPoint** | `{"urls": ["https://example.com/contract.docx", "https://example.com/pitch.pptx"]}` |
| **Watch documents for changes** | `{"urls": ["https://example.com/terms.pdf"], "monitor": true}` |

### Use cases

- **RAG and AI agents:** documents in, Markdown and chunks out, ready for a vector database or an LLM prompt.
- **Search and archiving:** make a folder of PDFs searchable by text, with metadata and page numbers.
- **Document monitoring:** run on a schedule with monitor mode and get only policies, price lists or filings that changed.
- **Data extraction:** tables come out as Markdown tables you can parse into rows.

### Run it on a schedule

1. Put your document URLs in the input with `"monitor": true` and save it as a **task**.
2. **Schedules → Create**: daily (cron `0 7 * * *`) or weekly.
3. Add an integration (email, Slack, webhook to Make/Zapier/n8n). Each run returns only new or changed documents; unchanged ones cost nothing.

### Integrations

- **API (curl):**
  ```bash
  curl -X POST "https://api.apify.com/v2/acts/cybermax~pdf-to-text/run-sync-get-dataset-items?token=YOUR_TOKEN" \
    -H "Content-Type: application/json" -d '{"urls": ["https://www.irs.gov/pub/irs-pdf/fw9.pdf"]}'
  ```
- **Python:** `ApifyClient(token).actor("cybermax/pdf-to-text").call(run_input={"urls": [...]})`
- **JavaScript:** `await new ApifyClient({ token }).actor('cybermax/pdf-to-text').call({ urls: [...] })`
- **Make, Zapier, n8n:** use the Apify app or node, run `cybermax/pdf-to-text`, then map `markdown` or `text` into Google Docs, Notion, Airtable or your LLM step.
- **AI agents (MCP):** add it to the Apify MCP server: `https://mcp.apify.com?actors=cybermax/pdf-to-text`.

### Why Pageshuck

| | Pageshuck | Typical PDF text extractor on the Store |
|---|---|---|
| Formats | PDF, Word (DOCX) and PowerPoint (PPTX) in one Actor | Often PDF only |
| Markdown | Headings, lists and **tables** kept; two-column papers in reading order | Often plain text, columns mixed |
| Per-page rows | Yes, with page numbers | Sometimes |
| RAG chunks | Built in | Rare |
| Monitor mode | Only changed documents, unchanged = free | Rare |
| Price | **$3 per 1,000 documents, no start fee** | $3.45–$5 per 1,000 PDFs plus a $5 start fee per 1,000 runs (Store prices on 10 Nov 2026) |

### FAQ

**Does it do OCR for scanned PDFs?** Pageshuck reads the text layer, which most PDFs have. When a PDF is a scan, the row says `needsOcr: true` (and a fully scanned file is not charged). For images and scans, use [Inkscry: Image to Text OCR](https://apify.com/cybermax/image-to-text-ocr).

**How big can a file be?** Up to 100 MB and 500 pages by default; raise `maxFileSizeMb` (300 MB max) and `maxPages` (5,000 max) for bigger documents. You pay the same per document.

**What about password-protected PDFs?** They are reported with an error and not charged.

**Is it legal?** Pageshuck converts files you link to. Use it on documents you own or are allowed to process; it collects nothing else.

**Why not a free PDF library?** You can; Pageshuck saves the hosting, the edge cases (columns, tables, hyphenation, broken metadata) and gives you an API, schedules and integrations for $0.003 a document.

### Also from CyberMax

- [Inkscry: Image to Text OCR](https://apify.com/cybermax/image-to-text-ocr) · text from scans, screenshots and photos.
- [Docsieve: Website to Markdown](https://apify.com/cybermax/website-to-markdown) · whole websites as Markdown and llms.txt.
- [Inkpluck: Article Extractor](https://apify.com/cybermax/article-extract) · clean article text from news pages and RSS.

Found this useful? A quick rating helps others find it.

© 2026 CyberMax. All rights reserved.

# Actor input Schema

## `urls` (type: `array`):

Direct links to PDF, Word (.docx) or PowerPoint (.pptx) files. Links to files in an Apify key-value store work too.

## `formats` (type: `array`):

Markdown keeps headings, bullet lists and tables; plain text is clean reading order.

## `outputMode` (type: `string`):

Per-page rows carry a page number, handy for citations. You pay per document either way.

## `pageRange` (type: `string`):

Optional, e.g. 1-5, 8, 12-. Empty = all pages (up to Max pages).

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

Pages read per document at most; you pay per document either way.

## `chunkSize` (type: `integer`):

Optional. Adds a chunks array split at paragraph and sentence ends, ready for embeddings. 0 = off.

## `chunkOverlap` (type: `integer`):

Characters repeated between neighbouring chunks.

## `maxFileSizeMb` (type: `integer`):

Larger files are skipped and reported, not charged.

## `monitor` (type: `boolean`):

Returns only documents that are new or whose file changed since the last monitor run with the same URL list. Unchanged documents are not charged.

## `monitorKey` (type: `string`):

Optional name for this watchlist's saved state.

## Actor input object example

```json
{
  "urls": [
    "https://www.irs.gov/pub/irs-pdf/fw9.pdf",
    "https://arxiv.org/pdf/1706.03762"
  ],
  "formats": [
    "markdown",
    "text"
  ],
  "outputMode": "document",
  "maxPages": 500,
  "chunkOverlap": 150,
  "maxFileSizeMb": 100,
  "monitor": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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 = {
    "urls": [
        "https://www.irs.gov/pub/irs-pdf/fw9.pdf",
        "https://arxiv.org/pdf/1706.03762"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cybermax/pdf-to-text").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 = { "urls": [
        "https://www.irs.gov/pub/irs-pdf/fw9.pdf",
        "https://arxiv.org/pdf/1706.03762",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("cybermax/pdf-to-text").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 '{
  "urls": [
    "https://www.irs.gov/pub/irs-pdf/fw9.pdf",
    "https://arxiv.org/pdf/1706.03762"
  ]
}' |
apify call cybermax/pdf-to-text --silent --output-dataset

```

## MCP server setup

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

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/005spDU7PopRJUedL/builds/un61OU34sFi2MqVgS/openapi.json
