5 open-source Thai OCR libraries compared — for real-world use
I've helped clients pick OCR systems on several projects — from government document scans, receipts, financial paperwork, to handwritten forms. I've learned that "Thai OCR" is not as simple as English OCR: Thai has no spaces between words, stacked vowels and tone marks, and many font variants.
This article compares 5 open-source OCR engines that actually work with Thai across every common real-world use case — all claims come from official docs, published benchmarks, and hands-on experience, with repo links included.
Note: OCR results depend heavily on image quality, fonts, language mix, and preprocessing — numbers here are approximations for comparison, not guarantees. Always test on 50–100 of your own real documents before deciding.
TL;DR — which one to pick
- Clean scans, high volume, CPU only→ Tesseract
- Fast prototyping, simple Python, multiple languages→ EasyOCR
- Real production, diverse documents, Thai+English mixed→ PaddleOCR
- Complex documents, tables, layout, PDF→Markdown→ Surya OCR
- Thai-specific documents, forms, handwriting, Markdown output→ Typhoon OCR
1. Tesseract — the veteran that won't die
Tesseractis the oldest open-source OCR engine (since 2005, now v5.x). Thai support via tha.traineddata. License: Apache-2.0.
Strengths
- Lightest — pure CPU, no GPU, easy install, prebuilt binaries for every platform
- Complete output formats — text, hOCR, ALTO, TSV, searchable PDF — great for archives/libraries
- Stable and proven — over a decade of real use, bugs already found and fixed
- Largest community — Thai traineddata available, custom training possible
Weaknesses
- Bad with low-quality images — docs admit you must improve image quality first; blurry/skewed/dark scans tank accuracy fast
- No layout analysis — multi-column pages and tables come out as flat text
- No Thai word segmentation — output is continuous characters; you must segment words yourself (PyThaiNLP newmm/maxcut helps)
- Weak on tables/forms — cells come out as lines of text, not structure
Best for: clean scans, high volume, low infra budget, archive digitization, searchable PDFs
2. EasyOCR — easiest to set up
EasyOCRis a Python library wrapping deep-learning models (CRAFT detector + CRNN), supporting 80+ languages including Thai. License: Apache-2.0. Just pip install easyocr and go — ideal for prototyping.
Strengths
- Easiest setup — no model config needed
- Multi-language in one pass — Thai+English+Chinese in the same document
- Decent detector — finds text regions well, handles moderate rotation/skew
- Python-native — integrates into data pipelines easily
Weaknesses
- Slow release cadence — latest 1.7.2 (Sep 2024), little major activity since
- Lower accuracy ceiling — below production-grade engines on hard documents
- No layout/table understanding — gives text + bounding boxes, no reading order or tables
- No dedicated Thai traineddata — generic multilingual model only
Best for: prototypes, PoCs, simple documents, teams that want to start fast
3. PaddleOCR — the production contender
PaddleOCRfrom Baidu — the most complete open-source OCR toolkit. License: Apache-2.0 for both code and weights. Latest v3.7.0 (Jun 2026) with PP-OCRv6 models, 50 languages in one model including Thai (th).
Strengths
- Highest accuracy among general open-source engines — PP-OCRv5/v6 tops multiple benchmarks such as OmniDocBench (note: Thai-specific public benchmarks are still limited — always measure on your own documents)
- Strong on real-world images — photos, screenshots, skewed documents, rotated text
- PP-StructureV3 — layout analysis + table recognition + document parsing in one pipeline
- Full multilingual — Thai, English, Chinese, etc. in one model
- Active community — frequent updates, pretrained weights
Weaknesses
- Heavier — needs PaddlePaddle framework or ONNX runtime (via RapidOCR)
- GPU recommended — CPU works but much slower than Tesseract at volume
- Steeper learning curve — more config than EasyOCR
- Thai still needs word segmentation — like every engine, no in-model word breaking
Best for: real production, diverse documents, mid-quality photos/scans, table extraction
4. Surya OCR — document understanding at VLM level
Suryafrom Datalab — not plain OCR but a vision-language model(689M params) doing OCR + layout analysis + reading order + table recognition in one model. 91 languages including Thai (th). Code: Apache-2.0; weights: OpenRAIL-M (free for research/personal/ startups under $5M revenue).
Strengths
- Best layout understanding — knows headings, tables, figures, captions; correct reading order
- Tables → HTML with merged cells — far more complete structure than other engines
- Top benchmark scores — 83.3% olmOCR-bench, best open model under 3B params per the Surya team
- Structured document output — ideal for RAG and document-AI pipelines
- 91 languages — strong on multilingual documents
Weaknesses
- Needs GPU or inference backend — vLLM/llama.cpp (CPU works but very slow at volume)
- OpenRAIL-M weights license — not plain Apache; check terms for large-company use cases
- Document-focused, not photos/scenes — natural-scene text is not its strength
- More complex setup — requires inference server
Best for: RAG pipelines, document AI, documents needing complete structure, teams with GPU infra
5. Typhoon OCR — built specifically for Thai
Typhoon OCRfrom SCB 10X (Thailand) — a VLM trained specifically for Thai+English real-world documents: government forms, receipts, handwriting. License: Apache-2.0 code + open weights. Latest Typhoon OCR 1.5 (2B params, Qwen3-VL base) — smaller, faster, better on handwriting and forms.
Strengths
- Understands real Thai documents — trained on Thai government forms, receipts, handwriting
- Structured Markdown/HTML output — layout, tables, hierarchy nearly ready to use
- Forms and handwriting beat general engines — where Tesseract/EasyOCR typically fail
- Prompt-based extraction — ask for specific fields, e.g. "extract doc number, date, amount"
- Thai-native — no multilingual dilution problem
Weaknesses
- Needs GPU or vLLM server — 2B–7B params locally require decent GPU or hosted API
- Young project (started 2025) — smaller community than Western engines
- No Windows support (Linux/Mac only for now)
- No turnkey batch pipeline — you write your own wrapper for volume
- Weak beyond Thai+English — other languages are not its focus
Best for: serious Thai documents — government, forms, handwriting, receipts, structured output
6. Deep comparison by real use case
6.1 Clean printed scans, high volume (archiving)
- Tesseract wins — cheapest, lightest, most stable if scans are clean
- PaddleOCR is faster but needs GPU at volume
- Surya/Typhoon are overkill here
6.2 Receipts / invoices / financial documents
- PaddleOCR or Typhoon OCR — mid-quality photos, Thai+digits mixed, field extraction needed
- Tesseract works but needs heavy preprocessing
- EasyOCR is fast but not accurate enough for critical numbers
6.3 Government forms / official documents
- Typhoon OCR is strongest — trained on real Thai documents: layout + field extraction + handwriting
- Surya second — good layout, Thai handwriting may lag
- Tesseract/EasyOCR only for clean printed text
6.4 Multilingual documents (Thai+English+Chinese)
- PaddleOCR — one multilingual model, 50 languages
- Surya supports 91 languages
- Typhoon excels only at Thai+English
- Tesseract needs multiple traineddata packs manually
6.5 Tables / contracts / complex structured documents
- Surya OCR — table → HTML with merged cells, correct reading order
- Typhoon OCR second — good Markdown/HTML output
- PaddleOCR PP-StructureV3 can too but needs extra config
- Tesseract/EasyOCR not suited for this
6.6 Thai handwriting
- Typhoon OCR — its real strength: forms + handwriting
- Surya second — handwriting benchmark trails Typhoon
- Other engines barely handle Thai handwriting
6.7 RAG / document-AI pipelines
- Surya OCR — structured output with layout, reading order, table HTML — best fit for RAG
- Typhoon OCR second — Markdown output is great for ingestion
- Other engines need heavy post-processing you write yourself
7. Thai-specific problems every engine shares
Whichever engine you pick, these issues remain:
- No spaces between words — OCR output is continuous characters; you need word segmentation — recommendPyThaiNLP (
newmmdictionary ornewmm-safewhich doesn't over-split) — or LLM cleanup later - Stacked vowels and tone marks — OCR may misread positions, especially with overlapping marks; normalize output
- Diverse Thai fonts — TH Sarabun, Angsana, Cordia, Adobe Thai — each looks different; always test with fonts you actually use
- Thai vs Arabic numerals — Thai docs often use ๐–๙ while computers use 0–9; normalize yourself
- Abbreviations and royal vocabulary — OCR may misread words like "ท่าน" or "พระ"; dictionary correction helps
What actually works: LLM post-processing — feed OCR output to an LLM (Claude/GPT) to review and fix; it cuts error rates significantly for important documents. Watch data privacy for confidential material.
8. Licenses — check before production
| Library | Code | Weights | Commercial use |
|---|---|---|---|
| Tesseract | Apache-2.0 | Apache-2.0 | Full |
| EasyOCR | Apache-2.0 | Apache-2.0 | Full |
| PaddleOCR | Apache-2.0 | Apache-2.0 | Full |
| Surya | Apache-2.0 | OpenRAIL-M | Depends on use case* |
| Typhoon OCR | Apache-2.0 | Apache-2.0 | Full |
*Surya's OpenRAIL-M — free for research/personal/startups under $5M revenue; larger companies should check additional terms at the repo.
9. How to test before choosing (most important)
Don't trust anyone's benchmark — test on your own documents:
- Collect 50–100 real samples — covering every document type you'll process (don't cherry-pick pretty ones)
- Run each engine and measure CER/WER — character or word error rate against your own ground truth
- Measure field-level accuracy — for financial docs, measure "% of doc numbers correct", not just "% of characters correct"
- Test edge cases — unusual fonts, skewed scans, phone photos, handwriting, complex tables, multi-page docs
- Measure speed and cost — pages/sec on your actual hardware + GPU cost if any
- Test post-processing — word segmentation, LLM correction, validation rules
I've seen projects pick an engine from benchmarks and then hit problems on real documents — benchmarks use clean docs, reality is always messier.
10. Real test results I ran myself (Nov 13, 2026)
To keep this article honest, I generated 7 real Thai test images (rendered with actual macOS Thai fonts: Thonburi, Ayuthaya, Krungthep, Sathu) covering: a clean company document, a receipt, different fonts, a low-quality image, a 3°-skewed document, and a mixed Thai+English invoice — then ran real OCR on my Mac (Apple Silicon, CPU).
Environment: Tesseract 5.5.3 (tha+eng, psm 6), EasyOCR 1.7.2 (th,en, CPU), RapidOCR ONNX (default models) — scored by CER (Character Error Rate = % of characters wrong)against my own ground truth (whitespace + Thai digits normalized before scoring).Lower is better — e.g. CER 2% ≈ ~98% correct, CER 25% ≈ about 1 in 4 characters wrong.
| Test image | Tesseract error | EasyOCR error | RapidOCR error |
|---|---|---|---|
| Company doc, Thonburi font (clean) | 24.3% | 31.2% | 76.4% |
| Company doc, Ayuthaya font (clean) | 3.5% | 4.2% | 77.8% |
| Company doc, Krungthep font (clean) | 12.5% | 4.2% | 76.4% |
| Receipt, Sathu font (clean) | 2.2% | 4.9% | 69.7% |
| Receipt, Thonburi font (noisy) | 5.4% | 25.9% | 73.0% |
| Company doc, 3° skew | 22.2% | 46.5% | 81.2% |
| Mixed Thai+English invoice | 23.9% | 47.8% | 67.2% |
What the real results tell us:
- Tesseract clearly won this test set — especially on skewed documents and mixed-language text. EasyOCR produced heavy stray-symbol noise (e.g.
:::inserted inside Thai words) - Font matters a lot — Thonburi (a thin, elegant font common in real printed work) broke Tesseract badly (24%) while Ayuthaya/Sathu (bold, easy-reading fonts) scored 2–4% → always test with your actual fonts
- RapidOCR's default models can't read Thai at all — the bundled ONNX models only cover Chinese+English (you need PaddleOCR's multilingual weights for Thai)
- EasyOCR is slower and paragraph grouping got messy — ~10–22s/image on CPU vs ~1s/image for Tesseract
Honest limitations of this test:the images are synthetic renders, not real scanner output — real scans have noise, shadows, and yellowed paper that's harder than this. PaddleOCR, Surya, and Typhoon OCR need a GPU or the PaddlePaddle framework, which isn't installed on this machine, so they weren't measured. Treat these numbers as a "first signal", not a guarantee — your real documents may score very differently.
Bottom line: for real work, don't trust one small test — but if you need to start today without time to benchmark, my test suggests Tesseract + tha traineddata is still a strong baseline, especially with good image preprocessing first.
11. Summary: decision guide
- Fast prototype → EasyOCR
- Clean scans, high volume, cheapest → Tesseract
- General production, diverse documents → PaddleOCR
- Document AI, RAG, complete structure → Surya OCR
- Serious Thai documents: forms, handwriting → Typhoon OCR
Final advice from real experience:for serious Thai work, I recommend a hybrid approach — use PaddleOCR or Tesseract as the base OCR (fast, cheap, stable), then use Typhoon OCR or an LLM as post-processor for hard documents — high accuracy without paying for GPU constantly. And for RAG/document AI — Surya is worth learning.
Remember: Thai OCR is still "a problem not fully solved" — no engine is perfect for every case. What matters is picking an engine that's "good enough" for your use case, then investing in good preprocessing + post-processing — rather than hunting for the "best" engine.
All repo links are in this article — clone them and test on your real documents.