3.2 KiB
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/ # одна глава = один файл
│ ├── 01-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/ |
--tables |
Включить извлечение таблиц pdfplumber (по умолчанию выключено) |
--page-dpi N |
DPI для PNG-рендера страниц с битым текстом (default 150) |
-o DIR |
Каталог вывода |
Grep для агента
Главы разбиты по крупным разделам документа. Каждая страница помечена 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.