Recognize and extract text from images or PDFs using Surya OCR (datalab-to/surya). Use when a user uploads a document, screenshot, scan, or photo and wants the text extracted or analyzed. Surya supports 90+ languages and works on both images and PDFs without an internet connection.
Scanned 9/9/2026
Install to Claude Code
npx -y skills add yanacuti1121/Yana-AI --skill surya-ocr --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Surya Ocr?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/yanacuti1121-surya-ocr-yana-ai)More formats (shields.io, HTML) on the badges page.
---
name: surya-ocr
description: Recognize and extract text from images or PDFs using Surya OCR (datalab-to/surya). Use when a user uploads a document, screenshot, scan, or photo and wants the text extracted or analyzed. Surya supports 90+ languages and works on both images and PDFs without an internet connection.
origin: "github.com/datalab-to/surya (Apache 2.0)"
---
# Surya OCR
## Overview
Surya is a local VLM-based OCR engine that extracts text from images and PDFs with high accuracy across 90+ languages. When a user attaches a file in Yana's chat, Yana sends it to `/api/ocr`, which runs `ocr_worker.py` using Surya, and injects the extracted text into the message draft — ready for the user to add their question.
Surya runs entirely on-device. No data leaves the machine during OCR.
## When to Use
- User uploads a screenshot, photo, or scanned document and says "đọc cái này", "phân tích ảnh này", "trích xuất văn bản", "extract text", "what does this say", "summarize this document"
- User attaches a PDF and asks questions about its content
- User sends an image with handwriting, receipts, contracts, or printed text
## Installation
```bash
pip install surya-ocr
# For PDF support (converts pages to images before OCR)
pip install pdf2image
# Also need poppler (renders PDF pages):
# Ubuntu/Debian: apt install poppler-utils
# macOS: brew install poppler
# Alternative: pypdf (extracts text from text-based PDFs — no image conversion needed)
pip install pypdf
```
First run downloads ~1 GB of model weights to `~/.cache/huggingface/`. Subsequent runs use the cache.
## How Yana Uses It
1. User taps the paperclip (📎) button in chat
2. Selects an image or PDF from their device
3. Yana encodes it to base64 and sends it to `POST /api/ocr`
4. Server calls `python3 tools/yana-web/ocr_worker.py <tmpfile> [lang]`
5. Surya extracts the text, worker prints JSON: `{"ok": true, "text": "...", "pages": N}`
6. Extracted text is injected into the draft input
7. User adds their question and sends — Yana analyzes the content with full context
## Supported File Types
| Extension | Notes |
|-----------|-------|
| jpg/jpeg/png/gif/webp/bmp/tiff | Direct OCR |
| pdf | Requires pdf2image + poppler, or pypdf for text-based PDFs |
## Supported Languages
90+ languages including English, Vietnamese (vi), Chinese (zh), Japanese (ja), Korean (ko), Arabic (ar), and more. Pass a 2–5 character ISO 639-1 code as the `lang` field in the request body.
## API Contract
**Request** `POST /api/ocr`
```json
{
"fileBase64": "<base64-encoded file data>",
"filename": "scan.pdf",
"lang": "en"
}
```
**Response (success)**
```json
{
"ok": true,
"text": "Extracted text content...",
"pages": 3
}
```
**Response (failure)**
```json
{
"ok": false,
"error": "surya not installed. Run: pip install surya-ocr"
}
```
## Troubleshooting
| Error | Fix |
|-------|-----|
| `surya not installed` | `pip install surya-ocr` |
| `Pillow not installed` | `pip install Pillow` |
| PDF: `pdf2image or pypdf not installed` | `pip install pdf2image pypdf` + `apt install poppler-utils` |
| Slow first run | Model weights downloading (~1 GB), normal |
| Wrong language | Set `lang` to correct ISO code (e.g. `vi` for Vietnamese) |
## Anti-Patterns
- Do NOT call `/api/ocr` for files larger than 20 MB — use chunked uploads or compress the image first
- Do NOT pass user-constructed filenames directly to the filesystem — the server sanitizes extensions and uses a random temp name
- Do NOT assume OCR is 100% accurate — always let the user verify extracted text before acting on it
- Do NOT log extracted text if it might contain CONFIDENTIAL content (rule 68 applies)
## References
- `tools/yana-web/ocr_worker.py` — Python worker script
- `tools/yana-web/server.js` — `/api/ocr` endpoint (`handleApiOcr`)
- `tools/yana-web/desktop/chat.jsx` — desktop attach button + `handleOcr`
- `tools/yana-web/mobile/m-chat.jsx` — mobile attach button + `handleOcr`
- `github.com/datalab-to/surya` — upstream Surya OCR library
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!