Image to Text OCR - Scanned PDF OCR, $2/1k Pages, Per Line
Pricing
from $1.40 / 1,000 results
Image to Text OCR - Scanned PDF OCR, $2/1k Pages, Per Line
Image to text OCR and scanned PDF OCR in bulk for $2 per 1000 images or pages. One row per image or page: text, every line with confidence and bounding box. Digital PDFs use the text layer, scans use Tesseract. 8 languages, only-new mode.
Pricing
from $1.40 / 1,000 results
Rating
0.0
(0)
Developer
Martin Petrov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Image to Text OCR - Scanned PDF OCR, Per Line, Bulk
Need the text out of images and scanned PDFs, line by line, with confidence and position? Give this actor image or PDF links and get one clean row per image or PDF page: full text, every line with confidence and bounding box, and the method used. Digital PDFs are read from their text layer (exact, instant), scanned pages and images are read with Tesseract OCR inside the container.
No external OCR service, no API key, no proxies. Your files are downloaded once with the honest User-Agent RadarOCR/1.0 (+apify.com/martin10291) and processed inside the run.
What makes this one different
- Per-line output. Each row has
lineswithtext,confidence(0-100) andbbox([left, top, width, height] in pixels), not just one text blob. Switch towordsfor per-word boxes. - Scanned and digital PDFs in one actor. Pages that already contain text are read from the text layer (
method: "text-layer"), only pages without text go through OCR (method: "ocr"), so you never pay for slow OCR where it is not needed. - Many formats. png, jpg, webp, tiff (multi-page TIFF = one row per page), bmp, gif, PDF.
- Languages. English, German, French, Spanish, Italian, Portuguese, Bulgarian, Russian, alone or combined.
- Bulk and recurring jobs. Pass hundreds of links. Only-new mode with a Monitor ID skips every file you already processed, so you pay for each file once.
- Clean failures. A broken link never stops the batch: the file is skipped, listed in
RUN_SUMMARYwith the reason, and not charged. Pages where no text is found are not delivered and not charged either.
Honest limits: Tesseract works best on clean printed text. Handwriting, very low resolution, heavy skew or decorative fonts give low confidence (check meanConfidence). No layout or table reconstruction, and no handwriting recognition. For text-layer PDF pages confidence and bbox are null, width and height are the page size in points; for OCR rows they are pixels of the processed image.
Price and speed (real numbers)
| This actor | steadydata/image-ocr-text | |
|---|---|---|
| Price per image or PDF page | $0.002 flat (free plan price) | $0.003 per image with text + $0.001 per image checked = $0.004 (free plan price, per its store page on 2026-11-04) |
| Start fee | none | $0.0005 per GB of run memory |
| Unreadable / blank pages | not delivered, not charged | failed images free, blank ones charged the $0.001 check |
| Per-line text, confidence, bbox | yes | yes |
| Scanned PDF support | yes | yes |
| Digital PDF text layer (no OCR) | yes, method: "text-layer" | not stated on its store page |
Measured by us on Apify, 10 real scanned book pages (1447 x 2521 px, English, from archive.org), whole run including download:
| Run memory | OCR time per dense page | Run time (10 pages) | Platform cost per page |
|---|---|---|---|
| 1024 MB | 8.2 s | 97 s | about $0.0003 |
| 2048 MB | 4.3 s | 60 s | about $0.0004 |
Small images (cover-size, about 300 x 500 px) take about 0.1 s each. Pages with a text layer need no OCR. Use 2048 MB or more for large batches of full-size scans; speed depends on page size and text density.
Output (one row per image or PDF page)
| Field | Meaning |
|---|---|
sourceUrl | The link you gave |
page | 1 for images, page number for PDFs and multi-page TIFF |
text | Full text of the image or page, lines joined with newlines |
lines | List of {text, confidence, bbox} per line |
words | Only in words mode: {text, confidence, bbox} per word |
meanConfidence | Average line confidence (null for text-layer pages) |
method | text-layer or ocr |
width, height | Size of the image or page |
How to use it (step by step)
- Click Try for free.
- Keep the example links or paste your own image and PDF links (one per line).
- Pick the language of your text, then click Start and download JSON, CSV or Excel, or call it by API.
API example (copy and paste)
Replace MY_APIFY_TOKEN with your token from Apify Console, Settings, Integrations.
curl -s -X POST "https://api.apify.com/v2/acts/martin10291~image-pdf-ocr/run-sync-get-dataset-items?token=MY_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"urls":["https://www.gutenberg.org/cache/epub/11/pg11.cover.medium.jpg"],"languages":["eng"],"outputMode":"lines"}'
Input
| Field | Meaning |
|---|---|
urls | Image and PDF links, one row per image or PDF page |
languages | eng, deu, fra, spa, ita, por, bul, rus (several allowed) |
outputMode | lines (default) or words |
maxPagesPerPdf | Cap per PDF (default 20), controls cost |
forceOcr | OCR every PDF page even if it has a text layer |
onlyNew + monitorId | Skip files already processed with the same Monitor ID |
Use it from AI agents (MCP)
https://mcp.apify.com?tools=martin10291/image-pdf-ocr
Run summary
Every run saves RUN_SUMMARY in the default key-value store: counts of rows, files read, files skipped, OCR pages, text-layer pages, pages without text, total OCR seconds, and lastError (null when everything worked).
Related
Website Screenshot API and URL to Markdown from the same author.
Use it as an integration (chain it after another actor)
This actor can run automatically after any actor whose results contain an image or PDF link.
- Open the source actor in Apify Console and go to the Integrations tab.
- Click Add integration -> Actor, pick this actor and set Dataset to
{{resource.defaultDatasetId}}(leaveurlsempty). Set your other options and save. - When the source run finishes, this actor reads its dataset and processes every row. The field is detected automatically; set Dataset field if your column has another name.
You can also start it by hand with datasetId (pick a dataset or paste its ID) to process an existing dataset.
Good sources to chain from:
- any actor that outputs imageUrl / pdfUrl / fileUrl
- martin10291/video-frame-extractor (frame images)