Линии сетки — это границы, по которым текст режется на ячейки. Если линия не нашлась, две соседние клетки бланка слипаются в одну; если легла мимо разлиновки — ячейка рвётся там, где на бумаге ничего не нарисовано. Здесь проверено, как ложатся линии на всех 8 страницах пяти примеров: на странице как есть, на её выцветшей копии и на копии с остаточным перекосом 0.7°.
Одна и та же страница, один и тот же кусок. Красным нанесены линии, которые нашёл алгоритм: слева — как было, справа — как стало. На бумаге линии идут по границам клеток, значит и красные линии должны идти по ним же.






«Мимо разлиновки» — линия, у которой меньше 80% длины проходит по чернилам самой страницы. Считается одинаково для старой и новой версии.
| Документ | Стр. | Границ найдено было → стало | Линий мимо разлиновки было → стало |
|---|---|---|---|
| Пример 1 | 1 | 30 → 59 | 2 → 0 |
| Пример 1 | 2 | 43 → 52 | 15 → 0 |
| Пример 2 | 1 | 66 → 63 | 10 → 0 |
| Пример 2 | 2 | 49 → 62 | 9 → 0 |
| Пример 3 | 1 | 46 → 62 | 0 → 0 |
| Пример 4 | 1 | 34 → 39 | 0 → 0 |
| Пример 5 | 1 | 47 → 77 | 6 → 0 |
| Пример 5 | 2 | 24 → 37 | 0 → 0 |
| Документ | Стр. | Границ найдено было → стало | Линий мимо разлиновки было → стало |
|---|---|---|---|
| Пример 1 | 1 | 48 → 58 | 0 → 0 |
| Пример 1 | 2 | 45 → 52 | 0 → 0 |
| Пример 2 | 1 | 51 → 64 | 11 → 1 |
| Пример 2 | 2 | 58 → 53 | 9 → 2 |
| Пример 3 | 1 | 45 → 61 | 0 → 0 |
| Пример 4 | 1 | 37 → 38 | 0 → 0 |
| Пример 5 | 1 | 48 → 78 | 0 → 0 |
| Пример 5 | 2 | 23 → 35 | 0 → 0 |
Бледная копия — это скан со слабым тонером: линии остаются, но до чёрного не доходят. Раньше такие линейки были для алгоритма просто фоном. Сколько границ таблицы находится сейчас на обычной странице и на её бледной копии:
| Документ | Стр. | Линий строк обычная → бледная | Линий столбцов обычная → бледная |
|---|---|---|---|
| Пример 1 | 1 | 36 → 30 | 22 → 20 |
| Пример 1 | 2 | 31 → 26 | 20 → 20 |
| Пример 2 | 1 | 43 → 26 | 21 → 19 |
| Пример 2 | 2 | 26 → 9 | 20 → 17 |
| Пример 3 | 1 | 42 → 32 | 17 → 17 |
| Пример 4 | 1 | 21 → 20 | 17 → 17 |
| Пример 5 | 1 | 54 → 44 | 24 → 20 |
| Пример 5 | 2 | 30 → 24 | 3 → 2 |
Оставалась одна дыра: планка «насколько линия должна быть темнее бумаги» была одна и та же для любого скана. У выцветшей копии слабее ВСЁ — и буквы, и линейки, — поэтому под общую планку такая разлиновка не подходила и терялась. Теперь планка считается по самой странице: от силы её же самых заметных штрихов. На нормальном скане она прежняя, ниже зерна бумаги не опускается никогда.
Видно на глаз — выцветшая копия перекошенного примера, первая страница. Было 26 границ строк и 22 границ столбцов, стало 38 и 25. Красным нанесено то, что нашёл алгоритм:


На настоящих страницах примеров ничего не поехало: тот же перекошенный пример на экране проверки — 147 ячеек, линий поперёк ячейки 0, ячеек без рамки 0.
Тот же перекошенный пример открыт в браузере на рабочей ссылке сервиса и распознан там: 132 ячеек, 56 линий сетки, линий поперёк ячейки 0, ячеек без рамки 0, сдвиг линии от границы ячейки 0.02 px. Это снимок рабочей ссылки на момент проверки — правка планки бледности встанет туда после публикации.

Проверка от обратного. Берём страницу как есть, запоминаем каждую найденную на ней линию — и портим ту же страницу тремя способами: гасим чернила на 55% (выцветшая копия), перебиваем линейки белыми разрывами длиной 0.6% стороны листа через каждые 8% (порванная) и доворачиваем лист на 0.7° (остаточный перекос). Дальше на каждой копии ищем линии заново и смотрим, сколько прежних линий нашлось там же — целиком, одной линией, а не обрывками.
| Документ | Стр. | Линий на странице строк / столбцов | Уцелело на бледной | Уцелело на порванной | Уцелело с перекосом |
|---|---|---|---|---|---|
| Пример 1 | 1 | 36 / 22 | 30 / 22 | 27 / 21 | 32 / 22 |
| Пример 1 | 2 | 31 / 21 | 26 / 21 | 24 / 20 | 26 / 21 |
| Пример 2 | 1 | 43 / 22 | 34 / 21 | 24 / 15 | 32 / 20 |
| Пример 2 | 2 | 26 / 26 | 19 / 21 | 9 / 12 | 22 / 20 |
| Пример 3 | 1 | 42 / 19 | 35 / 19 | 27 / 15 | 32 / 19 |
| Пример 4 | 1 | 21 / 17 | 21 / 17 | 18 / 16 | 20 / 17 |
| Пример 5 | 1 | 54 / 24 | 51 / 24 | 51 / 24 | 50 / 24 |
| Пример 5 | 2 | 30 / 5 | 29 / 5 | 26 / 4 | 30 / 5 |
В каждой клетке — строки / столбцы. «Порванная» копия испорчена сильнее, чем бывает на деле: разрыв ставится через каждые 8% листа, то есть на линию через весь лист приходится больше десятка разрывов сразу.
Тот же документ открыт в браузере на рабочем адресе сервиса, распознавание запущено там же. На 2 страницах разобрано 132 ячеек, нарисовано 56 линий сетки, линий поперёк ячейки 0, ячеек без рамки 0, наибольший сдвиг линии от границы ячейки 0.02 px.

Перекошенный пример открыт в настоящем браузере на экране «Проверить и исправить», запущено распознавание, и на каждой странице посчитано: сколько ячеек в разборе, сколько линий сетки нарисовано, есть ли линия, которая режет ячейку посередине, и есть ли ячейка, которую линии не обводят целиком.
| Страница | Ячеек | Линий сетки | Линий поперёк ячейки | Ячеек без рамки | Сдвиг линии от границы |
|---|---|---|---|---|---|
| 1 | 103 | 47 | 0 | 0 | 0.01 px |
| 2 | 44 | 19 | 0 | 0 | 0.02 px |
Ошибок на странице: 0.

Соседние страницы отчёта: разбивка внутри ячейки, прогон сетки по всем пяти документам.