Image to Text OCR - Scanned PDF OCR, $2/1k Pages, Per Line avatar

Image to Text OCR - Scanned PDF OCR, $2/1k Pages, Per Line

Pricing

from $1.40 / 1,000 results

Go to Apify Store
Image to Text OCR - Scanned PDF OCR, $2/1k Pages, Per Line

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

Martin Petrov

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

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 lines with text, confidence (0-100) and bbox ([left, top, width, height] in pixels), not just one text blob. Switch to words for 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_SUMMARY with 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 actorsteadydata/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 feenone$0.0005 per GB of run memory
Unreadable / blank pagesnot delivered, not chargedfailed images free, blank ones charged the $0.001 check
Per-line text, confidence, bboxyesyes
Scanned PDF supportyesyes
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 memoryOCR time per dense pageRun time (10 pages)Platform cost per page
1024 MB8.2 s97 sabout $0.0003
2048 MB4.3 s60 sabout $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)

FieldMeaning
sourceUrlThe link you gave
page1 for images, page number for PDFs and multi-page TIFF
textFull text of the image or page, lines joined with newlines
linesList of {text, confidence, bbox} per line
wordsOnly in words mode: {text, confidence, bbox} per word
meanConfidenceAverage line confidence (null for text-layer pages)
methodtext-layer or ocr
width, heightSize of the image or page

How to use it (step by step)

  1. Click Try for free.
  2. Keep the example links or paste your own image and PDF links (one per line).
  3. 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

FieldMeaning
urlsImage and PDF links, one row per image or PDF page
languageseng, deu, fra, spa, ita, por, bul, rus (several allowed)
outputModelines (default) or words
maxPagesPerPdfCap per PDF (default 20), controls cost
forceOcrOCR every PDF page even if it has a text layer
onlyNew + monitorIdSkip 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).

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.

  1. Open the source actor in Apify Console and go to the Integrations tab.
  2. Click Add integration -> Actor, pick this actor and set Dataset to {{resource.defaultDatasetId}} (leave urls empty). Set your other options and save.
  3. 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)