# Indra OCR 1.1: handwriting, 80+ languages and pages at any angle

> Indra OCR 1.1 reads handwriting, OCRs 80+ languages on scans, and straightens pages at any angle. OmniParseBench headline 71.4 with --math, still on CPU.

- Canonical: https://www.datalab.to/blog/indra-ocr-1-1
- Published: 2026-10-19
- Authors: Vik Paruchuri

Today we're releasing **Indra OCR 1.1**. The [first release](/blog/indra-ocr) was fast on clean print. 1.1 is still small (a 1M-parameter OCR model, 7M parameters for the whole default pipeline), it still runs on CPU with no GPU, and it reads a lot more: handwriting, 80+ languages on scans, and pages at any angle.

On [OmniParseBench](/blog/omni-parse-bench), the headline goes from 62.3 to 66.7, and from 67.0 to **71.4** with `--math`.

<div style="overflow-x:auto">

| release       | headline |     text |   tables |   layout | handwriting |  rotated |
| ------------- | -------: | -------: | -------: | -------: | ----------: | -------: |
| 1.0           |     62.3 |     41.4 |     56.3 |     89.1 |         8.3 |     25.3 |
| **1.1**       | **66.7** | **46.7** | **61.1** | **92.2** |    **25.2** | **50.3** |
| 1.0, math     |     67.0 |     57.5 |     54.8 |     88.6 |         8.3 |     25.1 |
| **1.1, math** | **71.4** | **62.7** | **59.6** | **92.0** |    **25.1** | **49.3** |

</div>

_math: with `--math`. All scores come from OmniParseBench's own harness, the same one behind the public leaderboard. 1.0's scores differ slightly from our first post, which used our own harness._

The gains show up across the board, including tables (+4.8) and degraded scans (+4.7).

## Handwriting

1.0 didn't read handwriting. 1.1 does: OmniParseBench handwriting tests go from 8.3% to 25.2%.

Here's a handwritten cursive letter from OmniParseBench. 1.0 turned it into a table of fragments. 1.1 reads every word:

## 80+ languages

1.0 could OCR Latin, Cyrillic, Greek, Devanagari, Bengali and Chinese. Everything else came only from a digital PDF's text layer. 1.1 OCRs Arabic, Hebrew, Japanese, Korean, Thai, Lao, Khmer, Myanmar, Sinhala, the Indic scripts, Georgian, Armenian and Ethiopic too. On held-out printed pages in 95 languages, 1.1 reaches a character F1 of 0.90 or higher on 83 of them.

The same happens with Thai script. 1.0 forced this academic calendar into Latin letters. 1.1 reads it, table rows included:

And with Hebrew script, which 1.0 read as letters and digits:

Per script, on OmniParseBench:

| script     | tests |  1.0 |  1.1 |
| ---------- | ----: | ---: | ---: |
| Latin      | 9,406 | 56.6 | 61.7 |
| Korean     |    24 |  4.2 | 83.3 |
| Hebrew     |    30 | 26.7 | 80.0 |
| Armenian   |    60 | 46.7 |  100 |
| Greek      |   104 | 44.2 | 55.8 |
| Ethiopic   |    43 | 37.2 |  100 |
| Vietnamese |    26 | 65.4 | 80.8 |
| Hausa      |    23 | 69.6 | 91.3 |
| Thai       |    39 | 28.2 | 87.2 |
| Lao        |    52 | 38.5 | 96.2 |
| Khmer      |    34 | 38.2 | 70.6 |
| Tamil      |    25 | 28.0 | 84.0 |
| Telugu     |    33 | 42.4 | 87.9 |
| Kannada    |    48 | 45.8 | 93.8 |
| Malayalam  |    40 | 37.5 | 65.0 |
| Gujarati   |    15 | 40.0 | 80.0 |

Most scripts have few tests, so one test moves a score by 2 to 8 points. Myanmar and Sinhala are new too. Latin-script languages gain as well, such as Vietnamese (65.4 to 80.8) and Hausa (69.6 to 91.3).

## Pages at any angle

Scans and phone photos are rarely straight. 1.1 straightens pages tilted up to 45 degrees, and turns sideways and upside-down pages upright, so a page at any angle reads. In our tests, a page tilted 30 degrees went from almost no text in 1.0 to the same accuracy as an upright page. Light text on a dark background, like slides and dark table headers, reads too.

Here's a memo tilted 30 degrees. 1.0 returned nothing. 1.1 finds the angle and reads the page exactly as it reads the upright page:

Here's a table printed sideways on a journal page. 1.0 got nothing useful from it. 1.1 turns it upright and reads the whole table:

## Chinese layout

Chinese text blocks are no longer mistaken for tables. On [OmniDocBench](https://github.com/opendatalab/OmniDocBench), 1,651 Chinese and English pages read in OCR mode, the text error on Chinese pages drops by 19%, and Chinese pages that wrongly got a table go from 129 to 89 of 493:

| OmniDocBench (OCR only)       |   1.0 |   1.1 |
| ----------------------------- | ----: | ----: |
| text edit distance, Chinese ↓ | 0.292 | 0.237 |
| text edit distance, English ↓ | 0.110 | 0.114 |
| table TEDS ↑                  | 0.436 | 0.466 |

## Speed

1.1 reads far more, and it still runs on CPU. On OmniParseBench, one page at a time on an x86 machine with 4 vCPUs, the median page takes 212 ms, or 357 ms with `--math`. That's about 16% more time per page than 1.0 on the same machine. Digital PDFs with a good text layer still skip OCR and stay fast.

On an x86 AMD EPYC (Genoa) machine with no GPU, in OCR mode with one single-threaded worker per core, 1.1 reads about 44 pages per second on 32 cores. That's 15x Tesseract and 10x PaddleOCR's PP-OCR text models on the same machine type:

<div style="overflow-x:auto">

| pages per second, AMD EPYC (Genoa) | 4 cores |  8 cores | 16 cores | 32 cores |
| ---------------------------------- | ------: | -------: | -------: | -------: |
| **Indra OCR 1.1**                  | **6.2** | **11.9** | **23.7** | **43.9** |
| Tesseract 5                        |    0.78 |     1.37 |     2.27 |     2.92 |
| PaddleOCR PP-OCR text models       |    0.65 |     1.24 |     2.42 |     4.28 |

</div>

_300 OmniParseBench pages, OCR mode. PP-OCR text models: RapidOCR PP-OCRv6 small._

## Quickstart

```bash
pip install -U indra-ocr
indra-ocr paper.pdf                   # markdown to stdout
indra-ocr scan.png --format json      # lines, boxes, layout blocks
indra-ocr notes.jpg --math            # math as LaTeX
```

## Limitations

- **Handwriting:** clear writing reads well. Cursive and faint pencil are harder.
- **Complex tables:** tables with merged cells or multi-level headers can lose some structure.
- **Diacritics:** in a few Latin-script languages with many diacritics, such as Czech, Turkish and Kurmanji, a letter can come out with a similar diacritic.
- **Text-layer-only scripts:** Tibetan, Mongolian and Cantonese-only characters come from a PDF's text layer, not from OCR.

The full list is in the [README](https://github.com/datalab-to/indra).

## Try it

- Code: [github.com/datalab-to/indra](https://github.com/datalab-to/indra)
- Models: [huggingface.co/datalab-to/indra-ocr](https://huggingface.co/datalab-to/indra-ocr)
- Benchmark: [OmniParseBench](/blog/omni-parse-bench)

Tell us what you run it on, and where it breaks.
