Приложение для аннотирования PDF-чертежей с OCR и экспортом в Markdown.
- ✅ Открытие и просмотр PDF-чертежей
- ✅ Удаление электронных штампов (аннотации, изображения, контейнеры)
- ✅ Ручное выделение прямоугольных блоков (text/table/image)
- ✅ Автоматическая сегментация блоков (Marker + Datalab API)
- ✅ OCR распознавание (Локальные VLM + Chandra OCR)
- Локальные VLM серверы: Qwen3-VL-32B, LLaVA и др.
- Chandra OCR: таблицы, формы, рукописный текст, полная структура
- ✅ Сохранение разметки в JSON
- ✅ Экспорт кропов блоков в изображения
- ✅ Генерация Markdown отчётов по категориям
- ✅ Перенос разметки на новую версию PDF
- ✅ Сборка в .exe с PyInstaller
pip install -r requirements.txtВариант 1: Локальный VLM сервер (рекомендуется)
- Запустите Qwen3-VL-32B или другую VLM модель на
http://127.0.0.1:1234 - Используйте LM Studio, vLLM или Ollama
- Документация:
docs/LOCAL_VLM_OCR.md
Вариант 2: Chandra OCR
pip install chandra-ocr- GPU рекомендуется для ускорения
- Документация:
docs/CHANDRA_OCR.md
Для автоматической разметки через Datalab API:
copy .env.template .envОткройте .env и укажите API ключ от datalab.to
Документация: docs/DATALAB_API_INTEGRATION.md
Для автоматической загрузки результатов OCR в облако:
copy .env.template .envОткройте .env и укажите R2 credentials (Account ID, Access Key, Secret Key)
Быстрый старт: docs/R2_QUICK_START.md ⚡
Документация: docs/R2_STORAGE_INTEGRATION.md
Диагностика: docs/R2_TROUBLESHOOTING.md 🔧
python app/main.pyПриложение автоматически настраивает логирование:
- Файл логов:
logs/app.log(все события с уровнем INFO и выше) - Консоль: вывод в реальном времени
Для отладки измените уровень в app/main.py:
setup_logging(log_level=logging.DEBUG) # Подробное логированиеRD/
├── app/
│ ├── __init__.py
│ ├── main.py # Точка входа
│ ├── models.py # Дата-классы (Document, Page, Block)
│ ├── pdf_utils.py # Работа с PDF (PyMuPDF)
│ ├── annotation_io.py # Сохранение/загрузка JSON
│ ├── cropping.py # Обрезка и сохранение блоков
│ ├── ocr.py # OCR (pytesseract)
│ ├── report_md.py # Генерация Markdown
│ ├── auto_segmentation.py # Авто-сегментация (OpenCV)
│ ├── reapply.py # Перенос разметки
│ └── gui/
│ ├── __init__.py
│ ├── main_window.py # Главное окно
│ └── page_viewer.py # Виджет просмотра страниц
├── requirements.txt
└── README.md
- Нажмите "Открыть PDF" и выберите файл
- Страницы отобразятся в центральной области
- Для больших PDF: открытие происходит мгновенно
- Нарисуйте прямоугольник мышью на странице
- В правой панели задайте тип блока и описание
- Навигация: кнопки "Пред." / "След."
Marker (локально):
- Нажмите "Marker разметка" (Ctrl+M) для текущей страницы
- Или "Marker (все стр.)" (Ctrl+Shift+M) для всего документа
- Блоки определяются локально без интернета
Datalab API (облачно):
- Нажмите "Datalab разметка" (Ctrl+D) для текущей страницы
- Или "Datalab (все стр.)" (Ctrl+Shift+D) для всего документа
- Требуется API ключ от datalab.to
- Документация:
docs/DATALAB_API_INTEGRATION.md
- "Сохранить разметку" → blocks.json
- "Загрузить разметку" → загрузить существующий blocks.json
- "Запустить OCR" (Ctrl+R) → выбор движка и режима:
Движки OCR:
- Локальный VLM сервер (Qwen3-VL и др.)
- URL:
http://127.0.0.1:1234/v1 - Модель:
qwen3-vl-32b-instruct - Отличная работа с русским языком
- URL:
- Chandra OCR
- HuggingFace (локально) или vLLM сервер
- Оптимизирована для документов
Режимы:
- По блокам: распознавание с учетом типа каждого блока
- TEXT/TABLE: OCR через Chandra/Qwen
- IMAGE: детальное описание на русском
- Вся страница: автоматическая структура документа
Обработка по типам:
- ✅ TEXT/TABLE: таблицы в Markdown, формы, структура
- ✅ IMAGE: подробное описание + ссылка на кроп
- ✅ Рукописный текст
- ✅ Полное сохранение layout
Настройка промптов:
- Промпты хранятся в папке
prompts/ - Редактируйте
.txtфайлы для настройки OCR - Подробнее:
prompts/README.md
Результат:
- Структурированный Markdown документ
- Кропы изображений в
temp_crops/ - Описания изображений на русском языке
- Автоматическая загрузка в R2 (если настроен)
Документация: docs/MARKER_OCR_INTEGRATION.md
- "Экспорт кропов" → сохранить изображения блоков в папки:
output/ text/src/ table/src/ image/src/ - "Генерация MD" → создать Markdown отчёты по категориям
- Загрузите старую разметку (blocks.json)
- "Перенос разметки" → выберите новый PDF
- Координаты блоков будут автоматически адаптированы
pyinstaller --onefile --windowed --name="PDFAnnotation" app/main.pyИсполняемый файл будет в папке dist/.
| Модуль | Назначение | Особенности |
|---|---|---|
models.py |
Дата-классы для документа, страниц и блоков | Сериализация в JSON |
pdf_utils.py |
Открытие PDF и рендеринг страниц через PyMuPDF | ✨ Функции + класс, логирование, обработка ошибок |
annotation_io.py |
Сохранение/загрузка разметки в JSON | Логирование операций |
cropping.py |
Обрезка блоков и сохранение в изображения | Прогресс-логирование |
ocr.py |
OCR движки (LocalVLM + Chandra) | Высокоточное распознавание документов |
report_md.py |
Генерация Markdown отчётов | Группировка по типам |
auto_segmentation.py |
Автоматическое выделение блоков (OpenCV) | Эвристики для типов блоков |
reapply.py |
Перенос разметки на новый PDF | Автоматическое масштабирование координат |
gui/main_window.py |
Главное окно приложения | Интеграция всех компонентов |
gui/page_viewer.py |
Виджет для просмотра страниц и рисования блоков | Интерактивное рисование |
- Marker + OCR workflow — разметка и OCR по типам блоков ⭐
- Базовое использование — функции рендеринга
- Marker + OCR интеграция — обработка по типам блоков
- Datalab API интеграция — автоматическая разметка через API ⭐
- R2 Storage интеграция — автоматическая загрузка в облако ⭐
- Настройка промптов OCR — редактирование промптов ⭐
- Chandra OCR — высокоточная модель документов
- Локальные VLM — Qwen3-VL и другие
- Распознавание изображений — описание изображений
- PDF Рендеринг — документация по
pdf_utils.py - Модели данных — структуры Block, PageModel, координаты
- Marker + OCR workflow — полный пример
- PDF рендеринг — примеры рендеринга
- Модели данных — работа с блоками
from app.pdf_utils import open_pdf, render_page_to_image, render_all_pages
# Открыть PDF
doc = open_pdf("document.pdf") # Обработка ошибок встроена
# Одна страница
image = render_page_to_image(doc, page_index=0, zoom=2.0)
# Все страницы
images = render_all_pages(doc, zoom=2.0)
doc.close()Параметры zoom: 1.0 (72 DPI), 2.0 (144 DPI) ⭐, 3.0 (216 DPI)
from app.models import Block, BlockType, BlockSource, PageModel
# Создать блок с двумя системами координат
block = Block.create(
page_index=0,
coords_px=(100, 200, 500, 600), # Пиксели: x1, y1, x2, y2
page_width=1600,
page_height=2400,
category="Заголовок",
block_type=BlockType.TEXT,
source=BlockSource.USER
)
# coords_norm вычислены автоматически (0..1)
print(block.coords_norm) # (0.0625, 0.0833, 0.3125, 0.25)
# Модель страницы с изображением
page = PageModel(page_index=0, image=image)
page.add_block(block)
# Фильтрация блоков
text_blocks = page.get_blocks_by_type(BlockType.TEXT)
user_blocks = page.get_blocks_by_source(BlockSource.USER)Ключевые особенности:
- Уникальные ID блоков (UUID)
- Двойная система координат: пиксели + нормализованные (0..1)
- Автоматическая конвертация между форматами
- Перенос разметки между версиями PDF через norm координаты
Документация:
- PDF:
docs/pdf_rendering.md - Модели:
docs/DATA_MODELS.md
- ✅ Cloudflare R2 Storage - автоматическая загрузка результатов OCR в облако
- ✅ Редактируемые промпты OCR - настройка через файлы в
prompts/ - ✅ Marker + OCR интеграция - обработка блоков по типам
- ✅ IMAGE распознавание - детальное описание на русском через Qwen
- ✅ Структурированный Markdown - генерация с описаниями изображений
- Улучшение автосегментации (ML-модели)
- Горячие клавиши и удобства UI
- Пакетная обработка нескольких PDF
- Прогресс-бары для длительных операций
- Экспорт в другие форматы (DOCX, HTML)
Версия: 1.0.0
Python: 3.11
GUI: PySide6