PDF Text Extractor: PDF to Text, Pages & OCR
Pricing
Pay per usage
PDF Text Extractor: PDF to Text, Pages & OCR
Paste PDF links, get clean text, per-page text, RAG-ready chunks and metadata (title, author, dates, page count). Scanned pages are read with Tesseract OCR in 7 languages. Failed, encrypted and empty files are free. Free while in launch; planned price $2 per 1,000 PDFs.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Adam Hale
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 hours ago
Last modified
Categories
Share
PDF Text Extractor: PDF to text, per-page text, RAG chunks and OCR for scanned pages
Paste links to PDF files and get clean text and metadata for each one: full text, page count, word count, title, author, subject, keywords, creation and modification dates, PDF version. Pages without a text layer (scans, photographed documents) are read with Tesseract OCR in English, German, French, Spanish, Italian, Portuguese or Dutch.
- One row per PDF or one row per page, with optional chunks for RAG (cut at paragraph, sentence or word boundaries, with overlap).
- OCR only where needed: pages with embedded text are read directly; only pages with (almost) no text are rendered at 300 dpi and OCR-read.
- Fast: PDFium text extraction, no browser. A 15-page paper takes well under a second after download.
- Free while in launch; planned price $2 per 1,000 PDFs plus $3 per 1,000 OCR pages (pay per event). Files that fail to download, are not PDFs, are encrypted or contain no text would not be charged.
What can I use it for?
- RAG and AI pipelines: turn reports, papers, manuals and contracts into chunks for a vector database or an LLM prompt.
- Document search and archiving: index the text of PDFs linked from your site, a data portal or a list of filings.
- Research: bulk-extract text from papers (arXiv, journals), government publications and annual reports.
- Scanned documents: get text out of scanned letters, forms and invoices that have no text layer.
- Metadata audits: list titles, authors, producers and dates of many PDFs at once.
What data does it return?
One row per PDF (default):
| Field | Description |
|---|---|
url, finalUrl, status, httpStatus | What was requested and what happened. status is ok or why the file was not read |
text, textLength, wordCount | Full text, pages separated by a blank line |
pageCount, pagesExtracted, pagesOcr, pagesWithoutText | Page statistics |
title, author, subject, keywords, creator, producer | Document information from the PDF |
creationDate, modificationDate, pdfVersion, fileSizeBytes | ISO 8601 dates (with the PDF's time zone), version, size |
pages | [{page, text, ocr}], with Add per-page texts on |
chunks | Text pieces of at most Chunk size characters, when set |
warning, error, fetchedAt | Page limit reached, OCR failures, or why the file failed |
In One row per page mode each row has page, pageText, pageTextLength, pageOcr (and pageChunks), plus the PDF's metadata.
Files that could not be read get a row with status not_pdf, encrypted, parse_error, no_text, too_large, http_error, blocked_by_site, disallowed_by_robots_txt, robots_txt_unreachable, unreachable, timeout, skipped or invalid_url, and a readable error. SUMMARY in the key-value store counts PDFs, OCR pages and statuses.
Example output
From a real run on 2026-10-12 (text shortened):
{"url": "https://www.irs.gov/pub/irs-pdf/fw9.pdf","status": "ok","httpStatus": 200,"fileSizeBytes": 140815,"pageCount": 6,"pagesExtracted": 6,"pagesOcr": 0,"pagesWithoutText": 0,"textLength": 37689,"wordCount": 6516,"title": "Form W-9 (Rev. March 2024)","subject": "Request for Taxpayer Identification Number and Certification","keywords": "Fillable","producer": "Designer 6.5","creationDate": "2024-03-06T08:18:13-05:00","pdfVersion": "1.7","text": "Form W-9\n(Rev. March 2024)\nRequest for Taxpayer\nIdentification Number and Certification\nDepartment of the Treasury\nInternal Revenue Service …"}
A scanned page without a text layer (OCRmyPDF's skew.pdf test file, run on Apify on 2026-10-12) came back with "pagesOcr": 1, 740 words, in 8 seconds. It starts "The LinnSequencer\n\n32 Track MIDIS\n\nequence Recorder\n\nThe LinnSequencer is a state-of-the-art composition and performance tool…": body text is read well, while a skewed heading split oddly.
How much does it cost?
Free while in launch. The actor charges no fee of its own right now; you pay only the Apify platform usage of your runs (the free Apify plan includes $5 of usage a month). The prices below are planned and apply only once they are switched on; Apify notifies existing users before a price change takes effect.
| Event | Planned price |
|---|---|
| PDF read (any number of pages up to the page limit) | $0.002 (= $2 per 1,000 PDFs) |
| Scanned page read with OCR that returned text | $0.003 (= $3 per 1,000 pages) |
At the planned prices, the default input (3 PDFs, 30 pages, no scans) would cost $0.006. Not charged: failed downloads, non-PDF files, encrypted or broken PDFs, PDFs without any text, OCR that finds nothing, invalid URLs. Once pricing is on, Maximum cost per run stops the run cleanly.
For comparison (Apify Store, checked 2026-10-12), the three most-used PDF text extractors charge $3.45 per 1,000 PDFs plus $0.005 per run; $5 per 1,000 PDFs plus $15 per 1,000 OCR pages and $0.005 per run; and $20 per 1,000 PDFs plus $1 per 1,000 pages.
How to use it
- Paste direct PDF links into PDF URLs (up to 10,000).
- Choose One row per PDF or One row per page, optionally a Chunk size for RAG.
- Leave OCR scanned pages on and pick the documents' languages.
- Press Start, then export JSON, CSV or Excel, or call it from your pipeline through the API.
Input example
{"urls": ["https://arxiv.org/pdf/1706.03762", "https://bitcoin.org/bitcoin.pdf"],"outputMode": "document","chunkSize": 1500,"chunkOverlap": 200,"ocr": true,"ocrLanguages": ["eng", "deu"]}
API example
curl -X POST "https://api.apify.com/v2/acts/adamhaleworks~pdf-text-extractor-ocr/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"urls": ["https://bitcoin.org/bitcoin.pdf"], "chunkSize": 1000}'
How it works
- Text comes from PDFium (the PDF engine in Chrome), through
pypdfium2. Reading order follows the PDF's text objects; multi-column layouts usually come out column by column. - A page with fewer than 20 non-space characters is treated as scanned. With OCR on it is rendered at 300 dpi in grayscale and read with Tesseract 5.
- Downloads use one honest User-Agent,
pdf-text-extractor-ocr/1.0 (+https://apify.com/<this actor>), respect robots.txt, send at most 2 requests at a time per host and do not use proxies or get around bot protection.
Limitations
- Tables come out as text lines, not cells. Markdown headings are not generated.
- Password-protected PDFs are reported as
encryptedand skipped. - Files must be reachable by URL; private and internal addresses are refused. The maximum size is 200 MB, and 50 MB by default.
- OCR quality depends on the scan; handwriting is not supported.
Is it legal?
The actor downloads only the files you list and follows each site's robots.txt. The text stays the copyright of its owners; you are responsible for having the right to process the documents you submit.
FAQ
Why is a PDF no_text? It has no text layer and OCR was off, or OCR found nothing (for example a blank or image-only page without letters). It is not charged.
Can I upload a PDF instead of a URL? Not directly. Put it anywhere that gives a public download link that works without a login, and paste that link.
Something is wrong or missing? Open an issue on the actor's Issues tab and include the PDF URL.
Author: Adam Hale