Сергей Маринкевич c9e728b520 Ignore local .venv created by run.sh.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-17 00:27:33 +07:00
2026-07-15 18:19:54 +07:00
2026-07-15 18:19:54 +07:00
2026-05-31 16:16:51 +07:00
2026-05-31 16:16:51 +07:00

pdf2ai

Model-free конвертер PDF → markdown для локального агента: главы по разделам, картинки рядом, grep по <!-- page N -->.

Зависимости

  • Python 3.10+
  • pip-пакеты из requirements.txt: pymupdf, pdfplumber, Pillow

Скрипт run.sh сам создаёт .venv и ставит зависимости.

Быстрый старт

chmod +x run.sh
./run.sh                          # по умолчанию RealTek-r8169.pdf
./run.sh path/to/doc.pdf          # свой PDF
./run.sh doc.pdf -o out/my-doc    # свой каталог вывода

Структура вывода out/<stem>/ (по умолчанию):

out/RealTek-r8169/
├── INDEX.md              # оглавление со ссылками на главы
├── chapters/             # одна глава = один файл
│   ├── 00001-features.md
│   └── ...
└── assets/               # embedded PNG + page PNG для сломанных layout-страниц

С флагом --single-file вместо INDEX.md и chapters/ пишется один {stem}.md (каталог assets/ всё равно создаётся).

Опции extract.py

Флаг Описание
--single-file Один {stem}.md вместо INDEX.md + chapters/
--chapter-level N Уровень встроенного оглавления PDF для границ глав: 1, 2 или 3 (default 2)
--tables Включить извлечение таблиц pdfplumber (по умолчанию выключено)
--page-dpi N DPI для PNG-рендера страниц с битым текстом (default 150)
-o DIR Каталог вывода

Grep для агента

Главы разбиты по встроенному оглавлению PDF. Уровень нарезки можно выбрать:

./run.sh doc.pdf --chapter-level 1  # крупные разделы
./run.sh doc.pdf --chapter-level 2  # подразделы, default
./run.sh doc.pdf --chapter-level 3  # самые мелкие разделы

Каждая страница помечена HTML-комментарием:

# найти упоминание регистра в главе 6
rg -n 'DTCCR' out/RealTek-r8169/chapters/06-register-descriptions.md

# все вхождения по всему документу
rg -n 'Interrupt Mask' out/RealTek-r8169/

# контекст вокруг страницы 51
rg -n -C3 'page 51' out/RealTek-r8169/chapters/09-functional-description.md

Начните с INDEX.md — там ссылки на все главы.

Ограничения (model-free)

Этот инструмент не использует LLM/VLM. Он комбинирует:

  • PyMuPDF — текст страниц и embedded-изображения
  • pdfplumber — опциональные таблицы (--tables)
  • эвристику «сломанной страницы» — PNG-рендер bitfield/diagram layout

Что хорошо: быстро, локально, детерминированно; grep по главам; картинки сохраняются рядом.

Что хуже, чем Marker/Docling: сложная вёрстка, multi-column, сканы без OCR, семантическая структура таблиц. Для таких PDF нужны модельные конвертеры или OCR.

Roadmap

См. plan.md.

S
Description
No description provided
Readme 50 KiB
Languages
Python 96.3%
Shell 3.7%