PDF Text & Table Extractor: OCR, DOCX, PPTX, XLSX to Data + RAG
Pricing
Pay per event
PDF Text & Table Extractor: OCR, DOCX, PPTX, XLSX to Data + RAG
Extract text from PDF, DOCX, PPTX, HTML, TXT, MD and EML by URL. One document in, hundreds of rows out: typed elements (titles, paragraphs, lists, tables), RAG-ready chunks and a per-document summary. Unofficial wrapper around unstructured (Apache-2.0).
Pricing
Pay per event
Rating
0.0
(0)
Developer
daehwan kim
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
PDF Text & Table Extractor — OCR, DOCX, PPTX, XLSX to Structured Data + RAG Chunks
Turn any document URL into clean, structured data. Give this Actor one or more public document URLs — PDF, DOCX, PPTX, XLSX/XLS, CSV/TSV, HTML, TXT, Markdown, EML, or PNG/JPG/TIFF/BMP images — and it returns a flat dataset of typed elements (titles, paragraphs, list items, tables and one row per table row), RAG-ready text chunks and one summary row per document with a one-line verdict. Scanned PDFs are OCR'd automatically (Tesseract) when no text layer is found, and image URLs are read with OCR directly. No manual copy-paste, no file uploads: paste URLs, get rows.
Powered by unstructured (Apache-2.0), the open-source document-parsing engine with 15,000+ GitHub stars that backs many production RAG pipelines. This is an unofficial wrapper; see the disclaimer below.
What does PDF Text Extractor do?
For every document URL you provide, three kinds of rows are produced:
| Row type | What it is | Typical volume |
|---|---|---|
document-summary | One row per document: headline verdict, verdict code, page/sheet count, word count, element counts by type, table and table-row counts, languages, strategy used | 1 per document |
chunk | Text chunks sized for embedding into a vector DB — RAG-ready. Four modes: title (section-aware), basic, page, document | 10–60 per document |
element | Optional (off by default): one row per structural element — Title, NarrativeText, ListItem, Table (with HTML), plus one TableRow per data row of every table with header, cells and a record object | 100–1,000 per document |
Measured volumes (elements on): a 15-page research paper → 423 rows; a 700-row spreadsheet → 749 rows (1 summary + 47 chunks + 1 table + 700 table rows); a 5-table DOCX → 120 rows.
Element types
Title, NarrativeText, ListItem, Table, TableRow, UncategorizedText, Header, Footer, Image, Address, EmailAddress, PageBreak and the other categories unstructured emits. Table rows keep their structure as textAsHtml; TableRow rows hang off their table via parentId and carry rowIndex, header, cells and record (header → cell). Spreadsheet rows also carry sheetName.
Verdict layer
Every document-summary row includes a headline a human can read at a glance and a verdict code you can filter on:
verdict | Meaning |
|---|---|
structured-text | Text with 3+ sections (headings) — good RAG material |
text | Plain running text |
table-heavy | Mostly tabular data (spreadsheets, financial tables) — use the TableRow elements |
scanned-ocr | No text layer; content came from OCR — check accuracy |
sparse | Fewer than 150 words extracted |
empty | Nothing extractable |
Example: XLSX, 1 sheet — 1 table, 700 data rows, 12,490 words; 47 RAG chunks (eng).
Why use it?
- RAG pipelines — skip the preprocessing step: URLs in, embedding-ready chunks out, on a schedule, via API.
- Spreadsheets & financial tables — XLSX/CSV sheets and PDF/DOCX tables become one record per row, ready for a database.
- Research & analysis — batch-convert reports, papers and filings into rows you can filter in Excel or a database.
- Content workflows — pull structured text out of decks (PPTX), articles (HTML) and docs (DOCX) with one tool instead of five.
- Apify platform — run on a schedule, call via API, pipe results into any integration, download as JSON/CSV/Excel.
How to use it
- Open the Input tab.
- Paste one or more document URLs (up to 50 per run). Links without a file extension (download links) are fine — the file type is detected from its contents.
- Optionally pick a parsing strategy and chunking mode, toggle element rows, and set the chunk size.
- Click Start. Download the dataset as JSON, CSV, Excel or HTML, or read it via the API.
Input example
{"documentUrls": ["https://arxiv.org/pdf/1706.03762","https://example.com/report.docx","https://example.com/sales.xlsx"],"strategy": "auto","chunkBy": "title","includeChunks": true,"includeElements": true,"chunkMaxChars": 1800,"maxResults": 500}
API callers may send the URL list as fileUrls instead of documentUrls; both are accepted.
Input options
| Field | Values | Notes |
|---|---|---|
strategy | auto (default), fast, ocr_only | auto reads the text layer and falls back to OCR for scans; fast never OCRs; ocr_only forces OCR. hi_res layout detection is not bundled (it would download models at run time) and is treated as auto with a notice row. |
chunkBy | title (default), basic, page, document | title never crosses a heading; page gives one or more chunks per page (per sheet for spreadsheets); document splits only by size. |
includeElements | boolean | Element rows (on by default, high volume). Set false for chunks + summaries only. |
expandTableRows | boolean (default true) | With elements on, adds one TableRow per data row of every table. |
enableOcr, ocrLanguages | boolean, ["eng","kor"] | OCR settings. |
Output example
{"rowType": "element","sourceUrl": "https://example.com/sales.xlsx","fileType": "xlsx","elementIndex": 2,"elementType": "TableRow","text": "2121 | 456 | Jane | 2011 | 842","pageNumber": 1,"sheetName": "Sheet1","rowIndex": 1,"header": ["Postcode", "Sales_Rep_ID", "Sales_Rep_Name", "Year", "Value"],"cells": ["2121", "456", "Jane", "2011", "842"],"record": { "Postcode": "2121", "Sales_Rep_ID": "456", "Sales_Rep_Name": "Jane", "Year": "2011", "Value": "842" },"parentId": "dde9d41a…"}
Pricing
Four charge events:
| Event | When it is charged |
|---|---|
| Run start | Once per run, when the run starts |
| Document summary | Per delivered document-summary row (one per parsed document) |
| RAG chunk | Per delivered chunk row |
| Structured element | Per delivered element row, including TableRow rows (on by default; off when includeElements is false) |
Typical run cost (measured on a 15-page research paper):
| Scenario | Rows | What you pay |
|---|---|---|
| 1 paper, default settings (summary + chunks) | ~30 | ≈ $0.32 (1 start + 1 summary + 29 chunks) |
1 paper with includeElements on | ~423 | ≈ $0.52 (adds 393 element rows) |
1 spreadsheet, 700 rows, includeElements on | ~749 | ≈ $0.85 (1 start + 1 summary + 47 chunks + 701 element rows) |
Control your spend with:
maxResults— a hard cost ceiling per run (default 500 rows),includeElements/includeChunks/expandTableRows— pick the row types you need,- the run's maximum charge limit in Run options.
Fetch status and quality information (HTTP status, page counts, word counts, verdict, truncation flags) are provided as data fields so you can judge every row yourself.
Free plan: runs parse up to 3 documents and return up to 25 rows per run — prioritised so you get the document summaries and RAG chunks first, then sample elements.
OCR (scanned PDFs & images)
- Scanned/image-only PDFs: when a PDF has no text layer, the Actor automatically re-reads it with OCR (Tesseract, built into the image — nothing downloads at runtime). The document's summary row carries
"ocrApplied": trueand"verdict": "scanned-ocr"so you can tell OCR'd text apart. - Image URLs (PNG, JPG, TIFF, BMP) are always read with OCR — paste a receipt or screenshot URL and get its text as rows.
- Languages: English (
eng, default) and Korean (kor) — set"ocrLanguages": ["eng", "kor"]. Other codes are ignored. - Turn OCR off entirely with
"enableOcr": falseor"strategy": "fast". - OCR rows are ordinary result rows — they are charged under the same events as any other row (no OCR surcharge).
Limitations
- OCR accuracy depends on scan quality; OCR output has no styling-based structure, so most OCR'd text arrives as paragraph elements.
hi_reslayout detection (model-based table and figure detection inside scanned PDFs) is not bundled; tables inside scanned PDFs arrive as OCR text.- Legacy binary formats (
.doc,.ppt) are not supported — convert them to DOCX/PPTX first. Legacy.xlsis supported. - Very large tables are expanded to at most 2,000
TableRowelements each; the full table is still present as HTML on itsTableelement (truncated at 5,000 characters) and in the chunks. - Files are fetched by URL (up to 50 MB each); there is no direct file upload.
- Only publicly accessible URLs — documents behind logins cannot be fetched.
FAQ & disclaimers
Is this the official unstructured Actor? No. This is an unofficial wrapper around the open-source unstructured library (Apache-2.0). This Actor is not affiliated with, endorsed by, or sponsored by Unstructured Technologies, Inc. All trademarks belong to their respective owners.
Legal — you are responsible for having the right to access and process the documents you submit, for complying with each source's Terms of Service and applicable copyright law, and you act as the data controller for any personal data contained in the documents you process.
Found a bug or need a feature? Open an issue on the Issues tab — it is checked regularly.