Image & Scanned PDF OCR: Image to Text (Tesseract)
Pricing
$3.00 / 1,000 page read (ocr)s
Image & Scanned PDF OCR: Image to Text (Tesseract)
Image to text: reads the text in images, screenshots and scanned PDFs with Tesseract OCR, offline: no AI, no third-party API. Plain text, per-page confidence, and optional words with bounding boxes, in 27 languages. Respects robots.txt and PDF permissions. Failed files are free.
Pricing
$3.00 / 1,000 page read (ocr)s
Rating
0.0
(0)
Developer
WrenTools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 hours ago
Last modified
Categories
Share
Image to text: read the text in photos, screenshots, scanned letters, receipts, forms and scanned PDFs. Give it links to image or PDF files, or send files inline as base64, and get back for each one: the text, line by line, a confidence score per page, and optionally every word with its position on the page.
Everything runs inside the Actor with Tesseract OCR and its tessdata_fast language models (both Apache-2.0). Your files are not sent to any AI model or third-party API, and the result for the same file is the same every time.
If your PDFs already have a text layer (they were made by a word processor, not a scanner), the
PDF to Text & Markdown Extractor reads them faster and for
less. Its pagesWithoutText field tells you which pages need OCR.
Code examples, in Python and Node, each run against this Actor before publishing: scanned PDFs and images from links, and a folder of screenshots into one searchable CSV (the files are sent inline, so they need not be online).
What you get
- Text for each file, one line per printed line, with a blank line between paragraphs and blocks.
- Confidence:
meanConfidence(0-100, weighted by characters) for the file and for each page, andlowConfidencePageslisting pages below 60, so you can send those for a human look. - Per-page results (
includePages): text, confidence and the page's pixel size. - Words with bounding boxes (
includeWords): each word's text, confidence,left,top,widthandheightin pixels, for parsing invoices and forms by position. - 27 languages: English, German, French, Spanish, Italian, Portuguese, Dutch, Polish, Czech, Swedish, Danish, Norwegian, Finnish, Turkish, Romanian, Hungarian, Greek, Russian, Ukrainian, Vietnamese, Indonesian, Japanese, Chinese (simplified and traditional), Korean, Arabic and Hindi. Up to 3 per run.
- Files: PNG, JPEG, TIFF (every page of a multi-page TIFF), GIF, BMP, WebP and PDF (every page rendered at
pdfDpi). Photos are turned upright from their EXIF orientation; transparent images are read on white. pagesWithoutTextlists pages where no text was found, anddownscaledPageslists images over 40 megapixels that were scaled down before reading.
Failed files are reported in the dataset with a reason and are not charged: fetch-failed, file-too-large,
unsupported-file, unreadable-image, image-too-large, unreadable-pdf, robots-disallowed, password-required,
extraction-not-permitted, ocr-timeout, ocr-failed, invalid-base64.
Respectful by design
- Only the files you name are downloaded, one request each. The site's robots.txt is read first and obeyed, and downloads from one site are spaced (500 ms by default). No proxy, no browser, no login.
- PDF permissions are honoured. A PDF that needs a password is refused (the Actor takes no password), and so is a PDF whose owner has forbidden copying or extracting its text: reading its pixels back would be the same extraction.
- Only public internet addresses are fetched: a URL or redirect into a private, loopback or link-local network is refused.
Process only documents you have the right to use.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
fileUrls | string[] | links to images or PDFs | |
filesBase64 | array | base64 strings, or {"name": "scan.png", "data": "<base64>"}; a data: prefix is fine | |
languages | string[] | ["eng"] | 1 to 3 codes, e.g. ["eng", "deu"] |
pageSegmentation | string | auto | auto, singleColumn, singleBlock (receipts, labels), sparse (forms, photos) |
includePages | boolean | false | per-page text and confidence |
includeWords | boolean | false | words with bounding boxes (adds pages too) |
pdfDpi | integer | 300 | 72 to 600; raise it for small print |
maxPagesPerFile | integer | 100 | longer files are marked truncated |
maxFileSizeMb | integer | 50 | larger downloads stop, uncharged |
requestDelayMs | integer | 500 | pause between downloads from one site |
Give fileUrls, filesBase64 or both. Results come back in input order.
Output
One dataset item per file (this is the Store example: a tilted, speckled phone scan of a notice):
{"source": "https://example.com/scans/notice.png","url": "https://example.com/scans/notice.png","finalUrl": "https://example.com/scans/notice.png","fileName": "notice.png","status": "ok","error": null,"fileType": "image","pageCount": 1,"pagesProcessed": 1,"truncated": false,"meanConfidence": 96.4,"pagesWithoutText": [],"lowConfidencePages": [],"downscaledPages": [],"charCount": 194,"wordCount": 31,"text": "NOTICE OF SCHEDULED MAINTENANCE\nWater service on Alder Street will be off\n\non Tuesday 4 November from 9:00 to 13:00.\n..."}
A failed file has "status": "error" and "error": {"code": "password-required", "message": "..."}. If a result is
too large for one dataset item (over 8 MB), its text and pages are stored in the run's key-value store, and the
item carries fullOutputKey and fullOutputUrl. The run's SUMMARY record counts files read and failed, and pages
read.
Pricing
Pay per event, no start fee, and nothing for files that fail:
| Event | Price | Per 1,000 |
|---|---|---|
page-ocr (one image, or one page of a PDF or TIFF, read) | $0.003 | $3.00 |
A single image costs $0.003; a 20-page scanned PDF costs $0.06. When you set a maximum charge for a run, the Actor
stops before a file it cannot pay for, and reads only the pages the remainder covers (the item is marked truncated).
Limits
- Tesseract reads printed text well and handwriting poorly. Low-contrast photos, heavy skew and decorative fonts lower
the confidence;
lowConfidencePagesshows where. - Tables come out as text lines; their cell structure is not rebuilt. Use
includeWordspositions to rebuild columns. - A page that takes over 180 seconds is stopped and reported as
ocr-timeout. Very large pages are scaled down to 40 megapixels first.