PDF Text Extractor – PDF, DOCX & PPTX to Markdown avatar

PDF Text Extractor – PDF, DOCX & PPTX to Markdown

Pricing

from $1.40 / 1,000 document extracteds

Go to Apify Store
PDF Text Extractor – PDF, DOCX & PPTX to Markdown

PDF Text Extractor – PDF, DOCX & PPTX to Markdown

Turn PDF, Word (DOCX) and PowerPoint (PPTX) files into clean text and Markdown. Give URLs or uploads and get one row per document, page or RAG-ready chunk, with metadata and a status per file.

Pricing

from $1.40 / 1,000 document extracteds

Rating

0.0

(0)

Developer

OpenFeeds

OpenFeeds

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

25 days ago

Last modified

Security

Limited permissions

Share

What does PDF Text Extractor do?

PDF Text Extractor turns PDF files into clean text and Markdown in bulk, and also handles Word (DOCX) and PowerPoint (PPTX). Give it document URLs or upload files, and it returns one row per file, one row per page or slide, or one row per RAG chunk, with whitelisted metadata and a status for every file.

Use it as a PDF parser API, for PDF to Markdown for RAG, for Word to Markdown, or for PowerPoint to text. Everything runs on the Apify platform with pure-JavaScript parsers (pdf.js, mammoth and our own PowerPoint reader): no browser and no AI calls.

What it does not do: no OCR (scanned pages are detected and flagged, not read), no PDF table structure (tables inside PDFs come out as text lines), and no Excel, EPUB, HTML pages or old .doc/.ppt files.

Why use PDF Text Extractor?

  • Flat, CSV-friendly rows. Every row has the same columns, so the dataset opens cleanly in Excel, Google Sheets or a database.
  • Stable IDs for citations. docId plus pageNumber or chunkIndex identify every piece of text, run after run.
  • A status for every file, and failures are free. Broken links, web pages, scans and password-protected files each get an explicit status and are never charged.
  • Cleaner PDF text. Repeated headers, footers and page numbers are removed and two-column pages are read in order. In markdown, lines are reflowed into paragraphs, hyphenated words are joined, headings are detected by font size and bullet lists become Markdown lists. The plain text field keeps the PDF's visual lines (and any line-end hyphens), with a blank line between paragraphs.
  • Real Markdown tables for Word and PowerPoint, plus footnotes, image alt text and PowerPoint speaker notes.
  • RAG-ready chunks with size, overlap, page or slide span and the heading path. Table rows are never split, and a table that continues in the next chunk (or in its overlap) repeats its header row.
  • Metadata without personal fields. Title, language, dates and the creating application are returned; author, last-modified-by, company and comment authors are never output.
  • Publisher opt-outs respected. The Actor checks TDMRep reservations and robots.txt before it downloads a file, and again for every redirect target (a short link or download redirector cannot get around a reservation).
  • Control over cost. Page and slide selection, a per-file page cap and a file-size limit.
  • Apify platform benefits: run it from the API, on a schedule, or from Make, Zapier, n8n and other integrations; feed the dataset to LangChain or LlamaIndex loaders; or call it as a tool through the Apify MCP server.

Supported formats

FormatAccepted variantsRows in pages modeWhat is extracted
PDF.pdfone per pageText layer as text and Markdown: headings by font size, lists, reflowed paragraphs, de-hyphenation, header/footer removal, two-column order. Metadata, scanned-page and garbled-text flags. Copy restrictions are respected. PDF tables come out as text lines.
Word.docx, .docm, .dotx, .dotmone per fileHeadings from Word styles, lists, real Markdown tables, footnotes and endnotes, image alt text. Comments, revision authors, headers and footers are not output.
PowerPoint.pptx, .pptm, .ppsx, .ppsm, .potxone per slideSlides in presentation order with titles, bullets with levels, real Markdown tables, image alt text and speaker notes (optional). Hidden slides are skipped.

Formats are detected from the file's bytes, not from the URL or the server's Content-Type. Password-protected Word and PowerPoint files are not supported; save an unprotected copy.

What data can PDF Text Extractor extract?

FieldDescription
rowTypedocument, page or chunk
sourceUrlThe URL you supplied
fileTypepdf, docx or pptx
statusok or the reason the file was skipped (see below)
titleFrom the file's metadata, or detected from the first page
textPlain text in reading order
markdownMarkdown with headings, lists and tables
pageNumber / pageLabelPage or slide number, printed page label or slide title
chunkIndex / headingPathChunk number and the section headings in force
pageCount / pagesExtractedTotal and processed pages or slides
language / createdAt / modifiedAtDeclared language and dates from the metadata
isScanned / textCoverageScan detection for PDFs
tableCountMarkdown tables found in Word and PowerPoint files
charCount / wordCount / approxTokenCountSize of each row's text
contentSha256Hash of the file, for change detection
chargedEventsHow many billing events the file used (0 when free)

Statuses: ok, no_text (scanned, blank or garbled), unsupported_format (web page, Excel, EPUB, legacy Office, image), http_error, blocked (HTTP 401, 403, 407, 451, a 429 that persists, or an empty HTTP 202 answer such as a bot check), too_large, timeout, parse_error, password_required, encrypted_file, copy_restricted, tdm_reserved, robots_disallowed, unsupported_host, invalid_url and charge_limit_reached. Only ok files are charged.

How to extract text from PDF, Word and PowerPoint files

  1. Paste direct file links into Document URLs (one per line), or add files with Upload files.
  2. Choose Output rows: one row per file, one row per page or slide, or one row per chunk for RAG.
  3. Optionally limit pages with Pages or slides to extract, for example 1-5, 8, 10-.
  4. Click Start. The prefilled example (a one-page test PDF plus a sample Word memo and a sample PowerPoint deck) finishes in a few seconds.
  5. Download the results as JSON, CSV, Excel or HTML, or read them through the API.

How much does it cost to extract text from PDFs?

You pay per file that yields text, plus a small start fee per run (pay-per-event pricing, cheaper on higher Apify plans):

EventFreeBronzeSilverGoldPlatinumDiamond
Document extracted (per file)$0.0025$0.0022$0.0018$0.0014$0.0014$0.0014
Actor start (per run; once per GB of memory, the default 1 GB counts once)$0.002$0.002$0.0015$0.001$0.001$0.001

That is $2.50 per 1,000 files on the free tier, down to $1.40 per 1,000 on Gold and higher plans. The start fee is charged once per GB of run memory: the default 1 GB run pays it once, and a run with 4 GB of memory pays 4 start events ($0.008 on the free tier).

  • One PDF in one run at the default 1 GB memory: $0.002 + $0.0025 = $0.0045.
  • 100 files in one run: about $0.25.
  • 1,000 files in one run: about $2.50.

Large files count once per started 100 pages or slides, plus once per full 10 MB of file size. A Word file always counts as one unit of pages. Most files are one event:

FileEventsFree-tier price
PDF, 12 pages, 0.3 MB1$0.0025
PDF, 250 pages, 4 MB3$0.0075
PDF, 30 pages, 12 MB2$0.005
pageRange: "1-5" on a 900-page PDF1 (only 5 pages extracted)$0.0025
Word file, 40 pages of text, 2 MB1$0.0025
PowerPoint deck, 60 slides, 35 MB (images)4$0.01

Failed, blocked, unsupported, scanned (no text) and skipped files are free. The Apify free plan's $5 monthly credit covers about 2,000 normal files in one run. You can cap spending per run with the maximum charge setting. A large file that needs more events than are left is skipped with status charge_limit_reached, and smaller files after it are still processed; once the budget is used up, the Actor stops cleanly and lists the files it did not start as charge_limit_reached in the SUMMARY record (they get no dataset row).

Input

See the Input tab for every option. The most important ones:

  • Output rows (outputMode): documents gives one row per file, pages one row per PDF page or PowerPoint slide (a Word file gives one row), chunks one row per text chunk.
  • Pages or slides to extract (pageRange): numbers and ranges such as 1-5, 8, 10-. Applies to PDF and PowerPoint files; Word files are processed as one unit.
  • Chunk size and Chunk overlap (chunkSize, chunkOverlap): target length in characters (about 4 characters per token) and the characters repeated from the previous chunk. The overlap must be less than half the chunk size.
  • Include PowerPoint speaker notes (includeSpeakerNotes): adds a "Speaker notes" block under each slide.
  • Respect publisher opt-outs (respectOptOuts): skips files whose publisher reserved text and data mining (TDMRep) or that robots.txt disallows. Turn it off only for files you own or are licensed to process.
  • Custom User-Agent (userAgent): some publishers ask you to identify yourself with your organisation and a contact address.

Example input (the prefill):

{
"urls": [
"https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
"https://api.apify.com/v2/key-value-stores/openfeeds~pdf-to-text-markdown-extractor-samples/records/sample-memo.docx",
"https://api.apify.com/v2/key-value-stores/openfeeds~pdf-to-text-markdown-extractor-samples/records/sample-deck.pptx"
],
"outputMode": "documents"
}

Output

You can download the dataset in various formats such as JSON, HTML, CSV or Excel. The dataset has five views: Overview, Documents, Pages and slides, Chunks and Status and problems (sort or filter by status to find skipped files).

A PDF document row for a 51-page statute (abridged):

{
"rowType": "document",
"inputIndex": 0,
"docId": "2c969fa851870f34",
"sourceUrl": "https://www.gesetze-im-internet.de/gg/GG.pdf",
"fileName": "GG.pdf",
"fileType": "pdf",
"status": "ok",
"httpStatus": 200,
"fileSizeBytes": 271974,
"contentSha256": "bf6bda4ee99a3f3d260455cadb7941eaaee9dae4518e37f98de4887f18f1ebe2",
"title": "Grundgesetz für die Bundesrepublik Deutschland",
"titleSource": "heading",
"language": "de",
"creatorTool": "Apache FOP Version 2.6",
"createdAt": "2026-05-06T14:42:29.000Z",
"pageUnit": "page",
"pageCount": 51,
"pagesExtracted": 51,
"pagesWithText": 51,
"isScanned": false,
"tdmReserved": false,
"robotsAllowed": true,
"markdown": "<!-- page 1 -->\n# Grundgesetz für die Bundesrepublik Deutschland\n\nGG\n\nAusfertigungsdatum: 23.05.1949 …",
"charCount": 182861,
"approxTokenCount": 45716,
"truncated": false,
"chargedEvents": 1
}

A PowerPoint slide row in pages mode:

{
"rowType": "page",
"inputIndex": 2,
"fileType": "pptx",
"status": "ok",
"title": "Sample Deck",
"pageUnit": "slide",
"pageCount": 2,
"pageNumber": 2,
"pageLabel": "Regional Figures",
"hasText": true,
"widthPt": 720,
"heightPt": 405,
"markdown": "## Slide 2: Regional Figures\n\n| Region | Q1 | Q2 |\n| --- | --- | --- |\n| North | 10 | 12 |\n\n### Speaker notes\n\nMention that the North region grew fastest.",
"charCount": 111
}

A file that was skipped (never charged):

{
"rowType": "document",
"sourceUrl": "https://www.w3.org/",
"fileType": null,
"status": "unsupported_format",
"statusMessage": "Server returned a web page (often a login, cookie or share page), not a document",
"httpStatus": 200,
"contentType": "text/html",
"chargedEvents": 0
}

The run's key-value store also holds a SUMMARY record (counts per status and file type, charged events and one entry per input file) and, for documents longer than Max characters per row (or single pages over 1,000,000 characters in pages mode), the full text and Markdown (fullTextUrl and fullMarkdownUrl link to them). Full texts are stored only for files that were output and charged.

Tips

  • Pages or chunks for RAG? Use pages when you cite page numbers and want one embedding per page; use chunks for even-sized pieces with overlap and a heading path.
  • Cut cost on huge files with Pages or slides to extract; only the selected pages count.
  • Large PDFs: raise the run memory to 2–4 GB for documents with 1,000+ pages. Each GB counts as one start event, so a 4 GB run costs $0.006 more per run than the default 1 GB on the free tier.
  • Change detection: on scheduled runs, compare contentSha256 to skip files that did not change.
  • Slow websites: some sites ask robots to wait between downloads (Crawl-delay), so batches from one site can take longer. The Actor downloads at most 2 files at a time from the same site. Waiting for a turn does not count toward Timeout per file, so queued files are not cut off.

FAQ, disclaimers and support

You process files you choose, so make sure you have the rights to the documents you convert and respect their copyright and licences. By default the Actor checks text and data mining reservations (TDMRep, as foreseen by § 44b UrhG and Art. 4 of the EU DSM Directive) and robots.txt, and it never bypasses logins, paywalls, copy protection or encryption.

Our Actors are ethical and do not extract any private user data. The documents you process may still contain personal data, which is protected by the GDPR in the European Union and by other laws worldwide. PDF Text Extractor never outputs author, last-modified-by, manager, company or comment-author metadata, and it never logs document text. Do not process personal data unless you have a legitimate reason; if you are unsure, consult your lawyers.

Does it do OCR?

Not yet. Scanned pages are detected (isScanned, status no_text) and are not charged.

Why was my file skipped?

Check status and statusMessage. Common reasons: the link opens a web page instead of the file (unsupported_format), the server refuses access (blocked), the file is larger than Max file size (too_large), the PDF needs a password (password_required), the PDF forbids copying text (copy_restricted), or the publisher opted out (tdm_reserved, robots_disallowed; when a link redirects, the message names the host whose rules apply). A link without http:// or https://, or otherwise malformed, gets invalid_url. robots_disallowed also covers a site whose robots.txt answers with a server error or does not answer within 10 seconds: the robots.txt standard (RFC 9309) treats that as "do not fetch", and statusMessage says which case applies. A link whose host does not exist or cannot be reached gets http_error (for example "Host not found" or a TLS error), or invalid_url for private network addresses.

Can it read Excel, EPUB or old .doc and .ppt files?

No. Save them as DOCX, PPTX or PDF first.

Use direct download links. Google links are not supported, and share pages that show a preview return a web page.

What about password-protected files?

For PDFs, enter the password in PDF password (it is stored encrypted and never logged). PDFs that open without a password, such as ones that only restrict printing or editing, are read as they are, even when a password is set. Password-protected Word and PowerPoint files are not supported; save an unprotected copy.

Are tables extracted?

Word and PowerPoint tables become Markdown tables. Tables inside PDFs come out as text lines.

What is the maximum file size?

Up to 100 MB per file (default 50 MB), and up to 5,000 pages or slides per file (default 500).

How do I report a problem?

Open an issue on the Issues tab with the file URL (if public) and what you expected.

Can I use it from code or an AI agent?

Yes. See the API tab for HTTP, JavaScript and Python examples. The Actor also works as a tool through the Apify MCP server.

Changelog

  • 1.0 (2026-10-13): first release. PDF, Word (DOCX) and PowerPoint (PPTX); documents, pages and chunks output; TDMRep and robots.txt checks; pay-per-event pricing.