Articles

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 (newmm dictionary ornewmm-safe which 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

LibraryCodeWeightsCommercial use
TesseractApache-2.0Apache-2.0Full
EasyOCRApache-2.0Apache-2.0Full
PaddleOCRApache-2.0Apache-2.0Full
SuryaApache-2.0OpenRAIL-MDepends on use case*
Typhoon OCRApache-2.0Apache-2.0Full

*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:

  1. Collect 50–100 real samples — covering every document type you'll process (don't cherry-pick pretty ones)
  2. Run each engine and measure CER/WER — character or word error rate against your own ground truth
  3. Measure field-level accuracy — for financial docs, measure "% of doc numbers correct", not just "% of characters correct"
  4. Test edge cases — unusual fonts, skewed scans, phone photos, handwriting, complex tables, multi-page docs
  5. Measure speed and cost — pages/sec on your actual hardware + GPU cost if any
  6. 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 imageTesseract errorEasyOCR errorRapidOCR 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° skew22.2%46.5%81.2%
Mixed Thai+English invoice23.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.