Image to Text OCR - Photos, Screenshots & Scanned PDFs
Pricing
from $3.00 / 1,000 image or page processeds
Image to Text OCR - Photos, Screenshots & Scanned PDFs
Extract text from images, screenshots, photos and scanned PDFs with a local open-source OCR engine (PP-OCR). Line-level bounding boxes, confidence scores and clean reading-order text. No Google, no API key. Pay only per page read.
Pricing
from $3.00 / 1,000 image or page processeds
Rating
0.0
(0)
Developer
Kanto Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
Image to Text OCR - Extract Text from Photos, Screenshots & Scanned PDFs
Turn images and scanned PDFs into clean, searchable text in bulk. Paste links to PNG, JPG, WEBP, TIFF, HEIC or PDF files and get back the text of every image or page in reading order, with a bounding box and confidence score for every line.
OCR runs inside the actor with the open-source PP-OCRv6 models (Apache-2.0). No Google Lens, no Google Cloud Vision, no API key, no residential proxies - so results are stable, fast and cheap. You pay only for images and pages that were actually read.
What you can use it for
- Invoices, receipts and forms - pull totals, dates and IDs out of scans and photos.
- Scanned PDFs - make old scanned documents searchable or feed them into a RAG pipeline.
- Screenshots - extract text from app screenshots, chat logs, dashboards and error messages.
- AI agents - give an LLM agent eyes for documents via the Apify MCP server (the output is plain JSON text).
- E-commerce and ads - read text on product photos, banners and packaging (English and Chinese both work).
- Data entry automation - replace manual typing with a scheduled run plus a webhook to Make, Zapier or n8n.
Why this OCR actor
| This actor | Google-Lens-based OCR actors | |
|---|---|---|
| Engine | Local PP-OCRv6 (open source) | Scrapes Google Lens |
| Scanned PDFs | Yes, page by page | Usually images only |
| PDFs that already contain text | Uses the exact text layer (auto) | - |
| Line bounding boxes + confidence | Yes | Varies |
| Price per 1,000 images/pages | $3 | $4 - $6 |
Languages
The multilingual PP-OCRv6 models read English and other Latin-script languages (German, French, Spanish, Italian, Portuguese, Dutch, Polish, Turkish, Vietnamese...), Chinese, Japanese, numbers and symbols.
fastis the right choice for Latin-script text, screenshots and documents.- Use
accuratefor Japanese (kana), dense Chinese, stylized fonts and poor photos. In our tests the fast model garbled Japanese kana while the accurate model read the same lines perfectly.
Handwriting works only when it is neat.
Input
| Field | What it does | Default |
|---|---|---|
sources | Image or PDF URLs, one per line | 3 sample files |
quality | fast (tiny model) or accurate (small model, ~4x slower, better on dense CJK text and poor photos) | fast |
includeLines | Add every text line with its pixel box [x0, y0, x1, y1] and confidence | true |
minConfidence | Drop lines recognized below this confidence | 0.5 |
pdfMode | auto = use a page's own text layer when it has one, OCR otherwise; ocr = always OCR | auto |
maxPdfPages | Read only the first N pages of each PDF | 50 |
pdfDpi | Render resolution for scanned PDF pages (300 for small print) | 200 |
skipEmpty | Pages with no text are reported but not billed | true |
{"sources": ["https://example.com/scans/invoice-0142.pdf","https://example.com/photos/receipt.jpg"],"quality": "fast","includeLines": true}
Output
One dataset item per image or per PDF page. Real output from a test run (the lines array is
trimmed to its first two entries):
{"sourceUrl": "https://raw.githubusercontent.com/tesseract-ocr/tessdoc/main/images/eurotext.png","fileName": "eurotext.png","fileType": "image","page": 1,"pageCount": 1,"method": "ocr","width": 640,"height": 500,"text": "The (quick) [brown] {fox} jumps!\nOver the $43,456.78 <lazy> #90 dog\n& duck/goose, as 12.5% of E-mail\nfrom aspammer@website.com is spam.\nDer ,schnelle\" braune Fuchs springt\nüber den faulen Hund. Le renard brun\n«rapide» saute par-dessus le chien\nparesseux. La volpe marrone rapida\nsalta sopra il cane pigro. El zorro\nmarrón rápido salta sobre el perro\nperezoso. A raposa marrom rápida\nsalta sobre o cão preguiçoso.","lineCount": 12,"charCount": 412,"averageConfidence": 0.9842,"lines": [{ "text": "The (quick) [brown] {fox} jumps!", "confidence": 0.9792, "box": [61, 32, 522, 74] },{ "text": "Over the $43,456.78 <lazy> #90 dog", "confidence": 0.9835, "box": [61, 62, 560, 105] }],"processingTimeMs": 2106,"error": null,"quality": "fast"}
method tells you how the text was obtained: ocr, or pdf-text-layer when a PDF page already
contained selectable text (exact and instant). Files that fail are listed with an error message and
are not charged.
Pricing
Pay per event - you are billed only for results:
| Event | Price |
|---|---|
| Image or PDF page read (fast model, or PDF text layer) | $0.003 ($3 per 1,000) |
| Image or PDF page read with the accurate model | $0.008 ($8 per 1,000) |
Worked examples:
- 1,000 receipt photos, fast model: $3.00
- A 40-page scanned contract: 40 pages x $0.003 = $0.12
- 200 screenshots with the accurate model: 200 x $0.008 = $1.60
Downloads that fail, unreadable files and pages without text cost nothing. Set Maximum cost per run in the run options and the actor stops cleanly when it is reached.
FAQ
Can I upload files instead of giving URLs? Put them in an Apify key-value store (or any bucket, Google Drive/Dropbox direct-download link, your own server) and pass the record URLs.
Is my data used for anything else? No. Files are processed in the run's container and only the results you see in the dataset are stored, in your own Apify account.
How accurate is it? Clean screenshots and scans come out nearly perfect - the sample above
averages 0.98 confidence. For blurry phone photos, Japanese or dense Chinese text, or decorative
fonts, switch quality to accurate. Every line carries its own confidence, so you can flag
uncertain lines for review.
Does it keep layout? Text is returned in reading order with line breaks and blank lines between
paragraphs. Use lines[].box if you need exact positions (for example to rebuild tables or to find a
value to the right of a label).
Is there a size limit? 50 MB per file by default (up to 200 MB), and up to 500 pages per PDF.
Something is not working? Open an issue on the actor's Issues tab - it is answered quickly.