# Audion Office OCR AI

[English](README_EN.md) · [Руководство](USER_GUIDE_RU.md) · [История](CHANGELOG_EN.md)

**Содержание**

- [Зачем это сделано](#зачем-это-сделано)
- [Что в пакете](#что-в-пакете)
- [Что собирается из пакета](#что-собирается-из-пакета)
- [Принципы](#принципы)
- [Дальше](#дальше)
- [Техническая часть](#техническая-часть)
  - [Источник и назначение](#источник-и-назначение)
  - [Второй проход](#второй-проход)
  - [Полный архив](#полный-архив)

Распознавание сканов и офисная конверсия: из бумаги в редактируемый документ,
таблицу, проверяемый PDF и всё остальное — за одно распознавание.

## Зачем это сделано

Распознавание стоит денег и времени. Обычный порядок работы этого не учитывает:
прогнали скан, получили Word — а через неделю понадобилась таблица. Прогнали
заново. Понадобился PDF с текстовым слоем — ещё раз.

Каждый прогон — новые деньги, новая очередь и новый результат, который может
отличаться от прежнего.

Здесь порядок другой:

```
источники → распознавание → пакет документа → проверка → любые форматы
```

**Платите за распознавание один раз.** Результат складывается в независимый
пакет `<имя>.document`, и дальше все форматы собираются из него локально — без
обращения к платной службе.

## Что в пакете

Не текст, а всё, из чего он получился:

* точная копия исходника;
* изображения всех страниц до и после подготовки;
* хэши;
* текст и координаты **всех** кандидатов распознавания, а не только выбранных;
* порядок чтения, таблицы, объединения ячеек;
* уверенность по каждому фрагменту;
* сверка между разными движками;
* сырой ответ поставщика;
* место для ручных исправлений.

**Полнота здесь означает отсутствие потерь исходных данных**, а не обещание
безошибочного распознавания. Ошибка распознавания видна и исправима, потому что
рядом лежит всё, на чём она основана.

## Что собирается из пакета

Восемь результатов, независимо и одновременно: DOCX, XLSX, PDF с текстовым
слоем, ODT, Markdown, JSON распознавания, HTML и лист проверки.

По умолчанию собирается только DOCX — форматных наборов нет, лишнее не
производится. Пересборка идёт локально, сторонний офисный пакет для неё не
нужен. Предельный размер страницы — A3.

## Принципы

**Второй проход другим движком — независимый.** Он получает тот же очищенный
растр, но не видит текста первого. Так расхождение между ними означает реальную
неоднозначность, а не подсказку, повторённую следом.

**Таблицы разбираются по физической сетке.** Для линованных таблиц строится
сетка по длинным линиям растра, а число столбцов проверяется по строке нумерации
`1…N` из координат распознанных слов. И только потом движки сравниваются внутри
точных ячеек.

Объединения восстанавливаются **только в шапке** — там они предсказуемы. В теле
таблицы объединённая ячейка чаще означает ошибку разбора, чем замысел автора.

**Расхождения цифр сохраняются.** Если движки прочли число по-разному, оба
варианта остаются в пакете. Число — то место, где ошибка распознавания дороже
всего, и решать её должен человек.

**Markdown — не центр системы.** Он удобен как контрольный формат и как вход для
языковых моделей, но пакет документа устроен не вокруг него.

Файлы PDF программа читает и пишет библиотекой PyMuPDF, а она распространяется
под GNU AGPL 3.0. Собственный код программы остаётся под Apache 2.0, но сборка
целиком — программа вместе с PyMuPDF — идёт на условиях GNU AGPL 3.0; подробнее —
в файле `NOTICE`.

## Дальше

* [Руководство](USER_GUIDE_RU.md) — работа по шагам.
* [История](CHANGELOG_EN.md) — что менялось.

---

## Техническая часть

### Источник и назначение

Строки путей называются **Источник** и **Назначение**. Источник может быть
отдельным файлом или папкой - выбранной, введённой или брошенной в окно; история
путей держит закреплённые сверху. **Сбросить** возвращает оба пути к папкам
программы, **Список** называет, что лежит в источнике, корзина очищает источник,
назначение или оба - в Корзину.

Внешний источник перед запуском копируется во внутреннюю папку `input`, результаты
копируются в выбранное назначение. Если в `input` или `output` что-то лежит, окно
сначала спрашивает - перед копированием они очищаются.

### Второй проход

| значение | что делает |
|---|---|
| нет | только основной движок |
| Tesseract | локальная сверка |
| Yandex | облачная сверка |
| Yandex и Tesseract | обе |

### Полный архив

Сборка всего пакета в один архив осталась возможностью движка ради
совместимости, но среди основных кнопок не показывается: она нужна редко, а
места занимает много.
