feat(reader): add PDF reading support with outline chapters, CLI blocks, and noise filtering (task 7)

This commit is contained in:
Antigravity committed 2026-10-06 10:16:40 +03:00
1 parent c38b1dae0a
commit 6dcfd59f73
67 files changed
+49444 -40

No files matched your search

+9 -9
View File
@@ -155,22 +155,22 @@
---
### 7. 📑 Поддержка чтения PDF (Cisco CCNA, O'Reilly & Tech Books с оглавлением и текстовым слоем)
- [ ] **Легковесный Pure-Python парсер (`pypdf`, Zero C-Dependency)**:
### 7. 📑 Поддержка чтения PDF (Cisco CCNA, O'Reilly & Tech Books с оглавлением и текстовым слоем) (Completed)
- [x] **Легковесный Pure-Python парсер (`pypdf`, Zero C-Dependency)**:
- Подключение `pypdf` (< 400 КБ, чистый Python, без раздувания Docker-образа и без системных библиотек `poppler-utils` / `mupdf`).
- [ ] **Извлечение оглавления и закладок PDF (`reader.outline`)**:
- [x] **Извлечение оглавления и закладок PDF (`reader.outline`)**:
- Извлечение авторского оглавления (ToC / Bookmarks), стандартного для книг Cisco Press (CCNA Official Cert Guide), O'Reilly и Wiley.
- Разбивка книги на логические главы и разделы (`Part I`, `Chapter 1`, `Chapter 2`) точно по оглавлению автора.
- [ ] **Fallback-разбивка при отсутствии оглавления**:
- [x] **Fallback-разбивка при отсутствии оглавления**:
- При отсутствии PDF-закладок — автоопределение заголовков через regex (`Chapter \d+`, `Глава \d+`) или группировка страниц порциями по ~12–15 страниц.
- [ ] **Очистка шума и колонтитулов**:
- [x] **Очистка шума и колонтитулов**:
- Фильтрация повторяющихся верхних/нижних колонтитулов («CCNA 200-301 Official Cert Guide», «Page 45 of 900»).
- [ ] **Сохранение CLI/Console блоков**:
- [x] **Сохранение CLI/Console блоков**:
- Распознавание консольного вывода и команд сетевого оборудования (`Router# show ip interface brief`, `Switch(config)#`) и оборачивание в блоки кода Markdown для читалки с кнопкой «Копировать».
- [ ] **Защита от сканов без OCR (Scanned PDF Guard)**:
- [x] **Защита от сканов без OCR (Scanned PDF Guard)**:
- Валидация наличия текстового слоя: если суммарный объём извлечённого текста < 100 слов, возврат информативной ошибки с предложением использовать текстовый PDF или OCR.
- [ ] **Интеграция в интерфейс читалки**:
- Разрешение загрузки `.pdf` в `<input type="file" accept=".epub,.txt,.md,.pdf">`.
- [x] **Интеграция в интерфейс читалки**:
- Разрешение загрузки `.pdf` в `<input type="file" accept=".epub,.pdf,.txt,.md">`.
- Обновление кнопки в библиотеке: `📁 Загрузить EPUB / PDF / TXT`.
---