# PDF Text Extractor: Text and Pages from PDF Links | $1/1K (`one_dollar_store/pdf-text-extractor-scraper`) Actor

$1 per 1,000 results, platform usage included. Extracts text, page count and document details (title, author, dates) from PDF files at web links, one row per PDF or per page. Text layer only, no OCR. Up to 25 MB per file. No login or API key.

- **URL**: https://apify.com/one_dollar_store/pdf-text-extractor-scraper.md
- **Developed by:** [One Dollar Store](https://apify.com/one_dollar_store) (community)
- **Categories:** AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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

## PDF Text Extractor: text, pages and document details from PDF links

**$1 per 1,000 results. Platform usage included. No rental, no minimum.**

The four most used PDF text extractor actors on Apify Store charge $3.00 to $20.00 per 1,000 results (Store prices checked 10 October 2026). Some of them also read scanned files with OCR or return Markdown and tables, which this actor does not. For PDFs that already have a text layer, this actor returns the text for $1 per 1,000 PDFs (one PDF is one result in the default mode).

[Open it in Apify Console](https://console.apify.com/actors/818nm4CZijgj4OG0V/input)

### What it costs

| PDFs | This actor | Most used PDF text extractor actors on the Store |
|---|---|---|
| 1,000 | $1.00 | $3.00 to $20.00 |
| 10,000 | $10.00 | $30 to $200 |
| 100,000 | $100.00 | $300 to $2,000 |

Plus $0.001 per run. In page mode each page is one result, so a 10 page PDF costs $0.01. A daily run of 50 PDFs costs $0.051 ($0.05 for the rows and $0.001 for the run), or about $1.53 a month.

### Why people switch

- **One flat price.** Platform usage is included and the actor uses no proxy, so the bill follows the number of results and nothing else.
- **Two shapes of output.** One row per PDF with all the text, or one row per page, which suits search indexes and AI chunking. In a test run a 194 page report came back as 194 page rows in 9.6 seconds.
- **Page ranges.** Read any block of a long report with `startPage` and `maxPagesPerPdf`. You pay only for the rows you get.
- **Document details too.** Page count, title, author, subject, keywords, creator, producer, PDF version, and creation and modification dates when the file has them.
- **Failed files are not charged.** A file that is not a PDF, is password protected, is too large or has no text layer gives no row, and the run summary says why.

### Quick start

1. Open the actor, add one PDF link per line, press **Start**.
2. Or paste this input:

```json
{ "urls": ["https://www.irs.gov/pub/irs-pdf/fw9.pdf"], "outputMode": "document", "maxPagesPerPdf": 5, "maxItems": 10 }
```

3. Download the results as JSON, CSV or Excel, or read them through the API.

### Use it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/one_dollar_store~pdf-text-extractor-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://www.irs.gov/pub/irs-pdf/fw9.pdf"], "maxPagesPerPdf": 5, "maxItems": 10}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("one_dollar_store/pdf-text-extractor-scraper").call(
    run_input={"urls": ["https://www.irs.gov/pub/irs-pdf/fw9.pdf"], "maxPagesPerPdf": 5, "maxItems": 10}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["fileName"], item["pageCount"], item["wordCount"])
```

### Use it from an AI assistant

Claude, ChatGPT, Cursor and other assistants can call this actor through Apify's MCP server. Add it with this server address:

```
https://mcp.apify.com?tools=one_dollar_store/pdf-text-extractor-scraper
```

Then ask, for example: "Extract the text of the first 10 pages of this PDF link and summarise it."

### Switching from another PDF text extractor actor

Most PDF actors take a list of PDF links. Here it is `urls`, with `outputMode`, `maxPagesPerPdf`, `startPage` and `maxItems`. The core fields are `url`, `fileName`, `pageCount`, `text` and the document details. There is no OCR, table detection, Markdown output or file upload. The text layer is read with the open source pdf.js library and returned as plain text.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `urls` | list of text | none | Links to PDF files, one per line. Public links only, up to 25 MB per file. |
| `outputMode` | `document` or `pages` | `document` | One row per PDF, or one row per page. |
| `maxPagesPerPdf` | number | 100 | The most pages to read from each file (1 to 2,000). |
| `startPage` | number | 1 | Page to start reading from. With `maxPagesPerPdf` 20, a `startPage` of 10 reads pages 10 to 29. |
| `includePageTexts` | true or false | false | In document mode, also add `pageTexts`, the text of each page. |
| `maxItems` | number | 100 | The run stops after this many rows (10 to 100,000). |

The same link listed twice is read once.

### Output fields

| Field | Meaning |
|---|---|
| `url`, `finalUrl`, `fileName` | The link as given, the link after redirects, and the file name. |
| `title`, `author`, `subject`, `keywords` | Document details, when the file has them. |
| `creator`, `producer`, `pdfVersion` | The program that created the original document, the program that produced the PDF, and the PDF version. |
| `createdAt`, `modifiedAt` | Creation and modification dates in UTC. |
| `pageCount` | Pages in the whole file. |
| `text` | The text (the whole document, or one page). Long text is cut at 1.5 million characters. |
| `wordCount` | Words in the text. |
| Document mode only | `fileSizeBytes`, `pagesRead`, `firstPageRead`, `morePagesNotRead` (true when your page limit, or the time or text limit for one file, stopped the read before the last page), `charCount`, `textTruncated` and, with `includePageTexts`, `pageTexts`. |
| Page mode only | `pageNumber`, the page the row belongs to (counted from 1 in the whole file). |
| `scrapedAt` | Time of the extraction in UTC. |

Details the file does not have are left out of the row.

### Sample results

Real rows from test runs on 9 October 2026 (long text and one long subject shortened, and a web address inside one `producer` value left out). The first two are document mode, the third is page mode.

```json
[
  {"url": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf", "finalUrl": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf", "fileName": "dummy.pdf", "author": "Evangelos Vlachogiannis", "creator": "Writer", "producer": "OpenOffice.org 2.1", "createdAt": "2007-02-23T15:56:37.000Z", "pdfVersion": "1.4", "fileSizeBytes": 13264, "pageCount": 1, "pagesRead": 1, "firstPageRead": 1, "text": "Dummy PDF file", "wordCount": 3, "charCount": 14, "scrapedAt": "2026-10-09T04:42:29.484Z"},
  {"url": "https://www.irs.gov/pub/irs-pdf/fw9.pdf", "finalUrl": "https://www.irs.gov/pub/irs-pdf/fw9.pdf", "fileName": "fw9.pdf", "title": "Form W-9 (Rev. March 2024)", "author": "SE:W:CAR:MP", "subject": "Request for Taxpayer Identification Number and Certification", "keywords": "Fillable", "creator": "Designer 6.5", "producer": "Designer 6.5", "createdAt": "2024-03-06T13:18:13.000Z", "modifiedAt": "2024-03-06T13:18:13.000Z", "pdfVersion": "1.7", "fileSizeBytes": 140815, "pageCount": 6, "pagesRead": 5, "firstPageRead": 1, "morePagesNotRead": true, "text": "Form W-9\n(Rev. March 2024)\n\nRequest for Taxpayer\nIdentification Number and Certification\n\nDepartment...", "wordCount": 5801, "charCount": 34905, "scrapedAt": "2026-10-09T04:42:29.624Z"},
  {"url": "https://www.rfc-editor.org/rfc/rfc9110.pdf", "finalUrl": "https://www.rfc-editor.org/rfc/rfc9110.pdf", "fileName": "rfc9110.pdf", "title": "RFC 9110: HTTP Semantics", "author": "Roy T. Fielding, Mark Nottingham, Julian Reschke", "subject": "The Hypertext Transfer Protocol (HTTP) is a stateless applic...", "creator": "xml2rfc 3.12.10", "producer": "cairo 1.16.0", "createdAt": "2022-06-06T04:15:02.000Z", "modifiedAt": "2022-06-06T18:15:19.000Z", "pdfVersion": "1.5", "pageNumber": 1, "pageCount": 194, "text": "RFC 9110\nHTTP Semantics\n\nAbstract\n\nThe Hypertext Transfer Protocol (HTTP) is a stateless application...", "wordCount": 235, "scrapedAt": "2026-10-09T04:46:58.511Z"}
]
```

### Limits

- **Text layer only, no OCR.** A scanned PDF is a set of pictures with no text inside, so it gives no row and no charge. A password protected PDF gives no row either. If only some pages are pictures, page mode skips them and document mode joins the text of the other pages.
- **The link must lead straight to a public PDF file.** No login, cookies or custom headers. Some sites answer a program with a web page instead of the file. In one test 4 of 8 public PDF links did, and the actor skipped them without a charge.
- **25 MB per file.** A larger file gives no row. Downloading one file stops after 90 seconds, and at most 5 redirects are followed.
- **Only http and https links.** Local, private, link local and reserved addresses are refused, and so is a link that contains a user name or password. If a site's certificate fails the check, the public file is still read.
- **Up to 2,000 pages per file in one run** (100 by default). Use `startPage` to read further into a longer file. A start page past the last page gives no row.
- **Time and text caps.** Reading one file stops after 120 seconds and returns the pages read so far. A row holds at most 1.5 million characters, and in document mode reading stops once the text passes that size (`textTruncated` is true). `morePagesNotRead` tells you when pages were left.
- **Layout is not rebuilt.** Lines and paragraphs are worked out from where the text sits on the page. Columns, tables and forms come out as lines of text, perhaps not in screen order. Images are not read.
- **Row order follows the files that finish first.** Two are read at once, so match rows to your list with `url`.
- **Memory is set to 1,024 MB.** A 194 page file peaked at about 100 MB in a test.

### FAQ

**What is the cheapest PDF text extractor on Apify?**
This actor costs $1 per 1,000 results with platform usage included. The most used PDF text extractor actors on the Store charged $3.00 to $20.00 per 1,000 when we checked on 10 October 2026. Some of them also offer OCR, Markdown or tables, which this actor does not, so choose by what your files need.

**How much does it cost to extract text from 10,000 PDFs?**
$10, plus $0.001 for each run. In page mode 10,000 pages also cost $10.

**Do I pay for compute or proxy on top?**
No. Platform usage is included in the $1 per 1,000 price, and the actor uses no proxy.

**Does it read scanned PDFs, and why did a PDF give no row?**
No, it reads the text layer only, and a scanned file has none. The `RUN_SUMMARY` record in the run's key value store lists every skipped link with its reason, for example a web page instead of a file, password protected, over 25 MB or no text layer. Skipped links are not charged.

**How do I get one row per page for AI search?**
Set `outputMode` to `pages`. Each row has `pageNumber`, `pageCount`, `url` and `text`, so you can load the rows into a search index or a vector store as they are. Each page is one result.

**Is it legal?**
The actor fetches only the exact links you give it, with no login, and does not crawl. Whether you may copy, store or share a document depends on its owner's rights and the law where you live, and a PDF can contain personal data. Use files you are allowed to use that way.

**Is this an official Adobe product?**
No. It is an independent tool and is not affiliated with or endorsed by Adobe.

**Do I need an Apify account?**
Yes. Actors run from an Apify account, and a free account is enough to start: it includes $5 of platform usage every month. You can [sign up here](https://www.apify.com?fpr=ymnoit). This is a referral link and it costs you nothing.

**Is there a limit on the free plan?**
Yes. A run started from a free plan account delivers the first 10 results, then ends with a message and a link to the plans. Any paid plan returns everything you ask for, up to your own limit. The price per result is the same on every plan.

### More from The One Dollar Store

Every actor here costs $1 per 1,000 results, platform usage included. See the whole store: https://apify.com/one_dollar_store

**Website tools**

- [Website Technology Detector](https://apify.com/one_dollar_store/website-technology-detector): Frameworks, CMS, analytics and ad tags on any site.
- [Website to Markdown Converter](https://apify.com/one_dollar_store/website-to-markdown-converter): Clean Markdown text from any web page.
- [Website Contact Scraper](https://apify.com/one_dollar_store/website-emails-phones-scraper): Emails, phones and social links from company sites.
- [SEO Page Audit](https://apify.com/one_dollar_store/seo-page-audit-scraper): On-page SEO checks for any URL.

### Changelog

- October 2026: first release.

# Actor input Schema

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

Web links to PDF files, one per line. Each file can be up to 25 MB. Links must be public: no login. Local and private addresses are refused. Files that are scanned images have no text layer, and OCR is not included.

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

document gives one row per PDF with all its text. pages gives one row per page, which suits search and AI chunking. Each row is one result.

## `maxPagesPerPdf` (type: `integer`):

The most pages to read from each file, starting at the first page below. Large files take longer, so a limit keeps runs short.

## `startPage` (type: `integer`):

Page number to start reading from. 1 is the first page.

## `includePageTexts` (type: `boolean`):

In document mode, also add a pageTexts list with the text of each page. Total text per row is capped, so very long documents are cut.

## `maxItems` (type: `integer`):

The run stops after this many rows (PDFs, or pages in page mode). Minimum 10.

## Actor input object example

```json
{
  "urls": [
    "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
    "https://www.irs.gov/pub/irs-pdf/fw9.pdf",
    "https://pdfobject.com/pdf/sample.pdf",
    "https://www.rfc-editor.org/rfc/rfc9110.pdf"
  ],
  "outputMode": "document",
  "maxPagesPerPdf": 5,
  "startPage": 1,
  "includePageTexts": false,
  "maxItems": 10
}
```

# 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.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
        "https://www.irs.gov/pub/irs-pdf/fw9.pdf",
        "https://pdfobject.com/pdf/sample.pdf",
        "https://www.rfc-editor.org/rfc/rfc9110.pdf"
    ],
    "outputMode": "document",
    "maxPagesPerPdf": 5,
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("one_dollar_store/pdf-text-extractor-scraper").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.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
        "https://www.irs.gov/pub/irs-pdf/fw9.pdf",
        "https://pdfobject.com/pdf/sample.pdf",
        "https://www.rfc-editor.org/rfc/rfc9110.pdf",
    ],
    "outputMode": "document",
    "maxPagesPerPdf": 5,
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("one_dollar_store/pdf-text-extractor-scraper").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.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
    "https://www.irs.gov/pub/irs-pdf/fw9.pdf",
    "https://pdfobject.com/pdf/sample.pdf",
    "https://www.rfc-editor.org/rfc/rfc9110.pdf"
  ],
  "outputMode": "document",
  "maxPagesPerPdf": 5,
  "maxItems": 10
}' |
apify call one_dollar_store/pdf-text-extractor-scraper --silent --output-dataset

```

## MCP server setup

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

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/818nm4CZijgj4OG0V/builds/rlfJtUKX79PwTnWio/openapi.json
