Все пять документов открыты в браузере на экране «Проверить и исправить», на вкладке «После выравнивания», на всех восьми страницах. Записано, где сетка врёт, и добавлен первый уровень вложенности: внутри каждой найденной ячейки ищется своя мини-таблица, а её границы показываются на скане пунктиром другого цвета.
Документы прогнаны заново — не в черновике, а на рабочей ссылке приложения, через тот же экран, которым пользуется человек. Цифры ниже сняты именно там.
| Документ | Стр. | Ячеек | Линий сетки | Ячеек без обводки | Линия режет чужую ячейку | Сдвиг линии от границы ячейки | Ячеек со своей мини-таблицей |
|---|---|---|---|---|---|---|---|
| Пример 2 — перекошенный | 1 | 88 | 34 | 0 | 0 | нет | 3 |
| Пример 2 — перекошенный | 2 | 44 | 17 | 0 | 0 | нет | 1 |
| Пример 3 | 1 | 48 | 27 | 0 | 0 | нет | 1 |
| Пример 4 | 1 | 118 | 53 | 0 | 0 | нет | 0 |
| Пример 1 | 1–2 | прогон не завершился — приложение перестало отвечать | |||||
| Пример 5 | 1–2 | прогон не завершился — приложение перестало отвечать | |||||
«Сдвиг нет» — линия ложится ровно по границе ячейки, расхождения нет вовсе. «Линия режет чужую ячейку» считалась внутри каждой таблицы: линия, проходящая не по краю ячейки, а сквозь неё. На этих четырёх страницах таких нет.
Приложение разбирает один документ пять–девять минут и держит очередь из одного места. Когда документы пошли одновременно, оно перестало отвечать и не поднялось само — поэтому «Пример 1» и «Пример 5», самые тяжёлые (по две страницы каждый), на рабочей ссылке пока не проверены. Это не про сетку: сетка на четырёх проверенных страницах ведёт себя правильно. Это про то, что приложению не хватает запаса, чтобы вытянуть проверку целиком.
Этот замер сделан раньше, до того как поправили заваленные линейки и бледные сканы. Он оставлен, чтобы было видно, что изменилось: тогда линия столбца тянулась во всю высоту таблицы и резала чужие ячейки, сейчас на перепроверенных страницах таких линий нет.
| Документ | Стр. | Ячеек | Линий сетки | Линия режет ячейку насквозь | Ячеек задето | Ячеек без обводки | Сдвиг линии от границы ячейки |
|---|---|---|---|---|---|---|---|
| Пример 1 | 1 | 293 | 62 | 32 | 24 | 0 | 0,02 точки экрана |
| Пример 1 | 2 | 361 | 40 | 0 | 0 | 0 | 0,02 |
| Пример 2 — перекошенный | 1 | 103 | 44 | 0 | 0 | 0 | 0,01 |
| Пример 2 — перекошенный | 2 | 44 | 17 | 0 | 0 | 0 | 0,02 |
| Пример 3 | 1 | 48 | 27 | 0 | 0 | 0 | 0,01 |
| Пример 4 | 1 | 118 | 53 | 44 | 31 | 0 | 0,02 |
| Пример 5 | 1 | 308 | 51 | 0 | 0 | 0 | 0,02 |
| Пример 5 | 2 | 54 | 35 | 0 | 0 | 0 | 0,01 |
Три вывода. Сетка не съезжает: линия расходится с границей ячейки не больше чем на 0,02 точки экрана — это её толщина, глазом не видно. Линии не разваливаются: ячеек, у которых не обведён хотя бы один край, нет ни на одной странице. Главная беда — лишние линии: граница столбца рисуется во всю высоту таблицы, поэтому там, где рядом стоят таблицы разной разбивки, линия проходит сквозь чужую ячейку. На первой странице «Примера 1» так задето 24 ячейки, на «Примере 4» — 31. На остальных шести страницах такого нет.
Внутри каждой найденной ячейки теперь ищется своя мини-таблица. Если у ячейки есть собственная линейка — сплошная, тонкая, с чистой бумагой рядом, — она показывается пунктиром другого цвета внутри своей ячейки, не через всю таблицу. Над картинкой появляется подпись: сколько ячеек с собственной разбивкой нашлось на этой странице.
| Документ | Стр. | Ячеек со своей мини-таблицей | Линий внутри них |
|---|---|---|---|
| Пример 1 | 1 и 2 | 0 | 0 |
| Пример 2 — перекошенный | 1 | 3 | 3 |
| Пример 2 — перекошенный | 2 | 1 | 2 |
| Пример 3 | 1 | 1 | 2 |
| Пример 4 | 1 | 0 | 0 |
| Пример 5 | 1 и 2 | 0 | 0 |
Все линии второго уровня лежат внутри своей ячейки и внутри листа — проверено в браузере, а не по коду. Правило строгое: линия рисуется только там, где на скане действительно есть сплошная линейка с чистой бумагой рядом. Сквозь строку текста линия не проводится, даже если буквы закрашивают ячейку от края до края: лучше не показать спорную линию, чем нарисовать её там, где на бланке ничего нет. Поэтому в «Примерах 1, 4, 5» вложенности пока не нашлось — это следующий шаг работы, а не отсутствие результата.
Раньше внутрь ячейки заглядывали ровно один раз. Теперь правило работает по кругу: нашли внутри ячейки линейки — режем ячейку по ним и в каждом получившемся куске ищем тем же способом заново. И так пока линии находятся. Второй, третий, четвёртый уровень разбираются одинаково — отдельного правила «на второй уровень» больше нет.
Чтобы поиск не ушёл в бесконечность, стоят четыре ограничителя: кусок, который уже разбирали, второй раз не берётся (это же защита от «ячейки внутри самой себя»); кусок обязан быть меньше того, из которого вырезан; глубже восьми уровней не спускаемся; на одну ячейку таблицы приходится не больше четырёхсот кусков.
На экране проверки уровень видно по цвету: разбивка внутри ячейки — зелёная, следующий уровень — оранжевый, дальше — фиолетовый. В подписи над картинкой, когда уровней больше одного, пишется, до какой глубины дошла вложенность.
| Документ | Стр. | Областей с разбивкой | Самый глубокий уровень |
|---|---|---|---|
| Пример 1 | 1 и 2 | 0 | — |
| Пример 2 — перекошенный | 1 | 3 | 1 |
| Пример 2 — перекошенный | 2 | 1 | 1 |
| Пример 3 | 1 | 1 | 1 |
| Пример 4 | 1 | 0 | — |
| Пример 5 | 1 и 2 | 0 | — |
Честно про глубину: в пяти документах заказчика глубже первого уровня линий нет — там, где разбивка внутри ячейки нашлась, внутри её кусков собственных линеек уже не нарисовано. Поэтому на снимках ниже видно ровно один уровень, и это не сбой поиска, а то, что есть на бланках. Что многоуровневый разбор работает, проверено двумя способами: на нарисованном листе с тремя уровнями разбора находятся все три, каждый следующий лежит внутри предыдущего; и на настоящей странице «Примера 2», где в одну ячейку дорисовали три линейки одна внутри другой, — разбор нашёл три уровня подряд. Оба листа для проверки в набор примеров не входят.
Все замеры ниже сняты на рабочей ссылке приложения, в браузере: пример открыт, нажата кнопка разбора, включена вкладка «После выравнивания», линии сетки сверены с границами ячеек.
| Документ | Стр. | Ячеек | Линий сетки | Линий внутри ячеек | Ячеек задето лишней линией | Ячеек без обводки | Сдвиг линии |
|---|---|---|---|---|---|---|---|
| Пример 3 | 1 | 48 | 29 | 2 | 0 | 0 | 0,01 точки экрана |
| Пример 4 | 1 | 118 | 53 | 0 | 31 | 0 | 0,02 точки экрана |
Что видно глазами. Пример 3: сетка ложится по границам ячеек, лишних линий нет, ни одна ячейка не осталась без обводки, и внутри ячейки видна её собственная разбивка — две линии первого уровня вложенности. Пример 4: сетка тоже стоит на месте (расхождение с границей ячейки — толщина самой линии), но границы столбцов тянутся во всю высоту таблицы и проходят сквозь 31 чужую ячейку — это главное, что осталось починить. Ошибок на странице нет ни на одном из двух.
Чего не успели. Примеры 1, 2 и 5 на живой ссылке в этот раз не домерены: сервис разбирает одну страницу по 3–7 минут, а на тяжёлых документах перестаёт отвечать и перезапускается — разбор обрывается. Пример 4 прошёл только со второй попытки. Это отдельная беда, её надо закладывать в следующий шаг: пока разбор на живой ссылке падает на больших документах, сверять по ним сетку нечем. Прошлые числа по всем восьми страницам — в таблице выше, они сняты на такой же версии, но не на живой ссылке.
Щелчок по ячейке на скане по-прежнему подсвечивает значение справа, перетаскивания изображения нет, ошибок на странице нет ни на одном примере.