Мусор в оглавлении сканов: фильтр поворота, проверка заголовков, вход для DjVu
Причиной мусорных заголовков у Брикмана оказался не порог кегля, а повёрнутый на 90° текст: боковые врезки и подписи к таблицам распознаются в кашу («aoHegoduenueArdng») и попадают в h1, потому что кегль у них крупный. Замер: 105 строк из 17 300, все до одной брак. Блоки с неgоризонтальным направлением строки выбрасываются целиком (is_rotated). Остаток — подписи внутри иллюстраций — понижается до <p>, а не удаляется: looks_garbled() в bookhtml.py, шесть признаков структуры, любых двух хватает. Проверка повторяется после склейки соседних заголовков: по отдельности «LF», «FF» и «TIT» проходят как аббревиатуры, склеенные — обрывок таблицы. Вместе: 99 h1 у Брикмана против 48. djvu2html.py — третий вход конвейера. Родной текстовый слой DjVu чище нашего OCR (у Праты 10,9 против 2,8 слов со смесью алфавитов на 10 000), а через PDF он не проходит: ddjvu -format=pdf кладёт страницы картинками. Самопроверки: djvu2html.py --selftest, pdf2html.py --selftest --selftest. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XCiPWRi3Jqy4saD2LwU1Dp
This commit is contained in:
@@ -26,9 +26,44 @@
|
||||
к абзацу с предыдущей страницы;
|
||||
- переносы на конце строки снимаются, соседние `</i><i>` схлопываются;
|
||||
- иллюстрации выгружаются в `images/`, обложка рендерится со страницы 1 в 150 dpi;
|
||||
- повёрнутый на 90° текст выбрасывается целиком: боковые врезки и подписи к
|
||||
таблицам распознаются в кашу («aoHegoduenueArdng») и лезут в заголовки, потому
|
||||
что кегль у них крупный. У Брикмана это 105 строк из 17 300, и все до одной —
|
||||
брак;
|
||||
- мусорный заголовок понижается до `<p>`, а не удаляется: оглавление чистится,
|
||||
текст остаётся. Проверка — `looks_garbled()` в `scripts/bookhtml.py`, шесть
|
||||
признаков структуры, любых двух хватает. Вместе с фильтром поворота это увело
|
||||
Брикмана с 99 `<h1>` до 48;
|
||||
- позиционирование не сохраняется намеренно — текст должен течь под любой
|
||||
размер шрифта на читалке.
|
||||
|
||||
## DjVu со своим текстовым слоем: `scripts/djvu2html.py`
|
||||
|
||||
У сканов в DjVu слой распознавания обычно уже есть, и он лучше нашего прогона
|
||||
через `ocrmypdf`. Замер на Прате (C++ 6-е рус. изд., 1244 полосы): слов со
|
||||
смесью алфавитов внутри слова было 433 на 391 тысячу слов (10,9 на 10 000),
|
||||
после сборки из родного слоя — 109 (2,8).
|
||||
|
||||
⚠️ **Через PDF этот слой не проходит.** `ddjvu -format=pdf` кладёт страницы
|
||||
картинками, `pdftotext` после этого отдаёт пустоту. Текст берётся напрямую из
|
||||
`djvutxt --detail=line`, скрипт разбирает его сам.
|
||||
|
||||
Чего в слое DjVu нет вовсе — курсива и полужирного: в скане их и не было.
|
||||
Заголовки опознаются высотой строки, листинги — пунктуацией.
|
||||
|
||||
⚠️ **Высота строки в DjVu — это габарит с выносными элементами, а не кегль.**
|
||||
Строка с «Ц» или «р» выше соседней на те же 10%, поэтому пороги взяты по
|
||||
измеренным разрывам, а не «чуть выше основного текста». У Праты при основной
|
||||
строке 78: колонтитулы 85–90, разделы 105–125, названия глав 170–185.
|
||||
|
||||
Строки заголовка склеиваются подряд: название главы занимает две-три строки, и
|
||||
без склейки «Класс string и стандартная библиотека шаблонов» разваливается на
|
||||
четыре пункта оглавления.
|
||||
|
||||
Самопроверки без сети: `python3 scripts/djvu2html.py --selftest` и
|
||||
`python3 scripts/pdf2html.py --selftest --selftest` (флаг занимает оба
|
||||
обязательных аргумента).
|
||||
|
||||
## Подключение как скил Claude Code
|
||||
|
||||
Репозиторий одновременно является скилом (`SKILL.md` в корне) и клонируется
|
||||
|
||||
Reference in New Issue
Block a user