Фото в PDF
Цель — отдельные страницы в правильном порядке, плотные границы и сохранённые штрихи у краёв. Работай локально с фотографиями. Специальный плагин или MCP для этого процесса не требуется.
Проверенный способ
- Осмотри исходники. Учитывай EXIF. Проверь порядок по именам/времени и содержанию; время съёмки само по себе не доказывает последовательность. Найди обложку, развороты, переснятые дубли, пустые листы. Яркость не позволяет надёжно отличить бледный чертёж от пустой страницы. Если бумага лежит на светлом фоне (белый стол, лист, экран рядом) и контуры не находятся, попроси переснять на тёмной матовой поверхности.
- Разметь листы. Для отдельных листов (документы, A4, в том числе альбомный) запускай
prepare --layout pages.autoделит широкий контур только при признаках сгиба (тень корешка или линия сгиба), но на необычных листах может ошибиться.scan.py prepareсоздаёт черновой manifest и контактные листы с контурами. Детектор находит бумагу как светлую малонасыщенную область, притягивает кромки к резкому переходу «бумага → тёмный фон» и для разворота ищет сгиб. Сгиб — место, где ломаются линии разлиновки. Тень корешка лежит на одной странице, поэтому у глубокой тени сгиб ставится у основания перепада яркости с тёмной стороны. На эталонных тетрадях медианная ошибка сгиба 2–3 px. Это всё равно гипотеза. Страницы с непустымflags(gutter-*,partner-mismatch,touches-frame,aspect-outlier,one-side-unruled,margin-ink,contour,full-frame-fallback,duplicate) размечай вручную в первую очередь. Остальные проверь по фото: детектор может взять монитор, чек или одну половину разворота.scan.py inspectдаёт крупные вырезки каждого угла с делениями в долях кадра — по ним правь углы в manifest. Каждый лист получает свои четыре угла TL, TR, BR, BL в координатах после EXIF-поворота. - Исправь перспективу. По умолчанию — одна проективная матрица на лист. Не двигай отдельные строки/столбцы вслед за автоматически найденной кромкой: сетка, текст, пальцы и тени могут быть приняты за край и создать волны во всём листе. Для явно запрошенного полноценного выпрямления изогнутой книжной страницы нужен отдельный проверенный алгоритм и дополнительная проверка геометрии.
- Подгони границы. Предпочтительна плотная обрезка, а не одинаковый большой запас везде.
bleed_pxпо умолчанию 0. Добавляй небольшой запас индивидуально, только если за прямой между углами действительно остаётся запись или выгнутый край с информацией. Проверяй верхушки букв, точки над ё/й, даты слева, текст у сгиба и нижние линии чертежей. Нижняя строка часто доходит до самой кромки — там граница по медиане кромки, а не плотно. Если между плотной кромкой и краем бумаги есть штрихи пера,prepareсам сдвигает кромку к ним (полеmargin_ink, не дальше 4 % ширины). Карандаш так не защищается, поэтому даты и подписи карандашом у края проверяй глазами. Изогнутая кромка аппроксимируется прямой, поэтому углы выгнутого листа могут остаться чуть за границей. Дополнительную обрезку PDF делай командойcrop, без повторного растягивания и JPEG-пересжатия. - Сохрани бледные штрихи. Мягкая коррекция освещения допустима; жёсткая бинаризация может стереть карандаш. Для обложек, фотографий и важных цветов отключай
enhance. Не дорисовывай буквы, схемы или отсутствующие части кадра генеративной моделью. OCR добавляй только когда он нужен или запрошен. - Проверь итоговый PDF. Используй доступный навык PDF для создания/проверки, включая предусмотренный им маркер операции.
reviewрендерит все страницы, делает контактные листы и перечисляет страницы с фоном или записью у края (edges.json).compareпоказывает каждую страницу из фото с запасом 4 % и красной рамкой обрезки — видно, что осталось снаружи. Просмотри весь документ, а не только первые страницы. Экономная схема для большого объёма: сделайcompareдля всех страниц, раздай их пачками не больше 16 параллельным агентам на недорогой модели с изображениями (в Claude Code — Sonnet, в Codex —gpt-5.6-luna) с заданием из references/screening.md без изменений. Сам открывай только страницы, где проверяющий указалdefect, и страницы с флагамиprepare; правь только подтверждённое. На 32 страницах черновика с 8 известными ошибками угла > 3 % такая схема нашла все 8 (Sonnet — 7, флаги — оставшуюся) при 4 ложных тревогах; Haiku нашёл 4 и добавил только ложные тревоги, поэтому одного Haiku недостаточно. На второй тетради (32 страницы, задание не подгонялось) Sonnet иgpt-5.6-lunaнашли видимые полосы фона без ложных тревог, но пропустили страницы с ошибкой угла 1,5–2 %;gpt-6.1-terraотметил почти всё, включая 12 из 19 чистых страниц, — экономии с ним нет. Схема проверена на одной тетради, задание составлено по тем же страницам: при важном документе или сомнениях смотри все страницы сам. Номера страниц в ответах проверяющих заодно проверяют порядок. После обрезки перепроверь затронутые страницы; после изменения геометрического алгоритма — весь документ. Число страниц и корректный config не заменяют просмотр.
Для такой оцифровки пользователь предпочитает удалять подтверждённо пустые листы; явный запрос сохранить их имеет приоритет. Дубли исключай после визуальной проверки, не по сходству сетки/почерка. Обложку сохраняй, если нет другой инструкции. Разворот читай слева направо, когда так устроен источник.
Команды
Путь к скрипту определяй относительно этого навыка. Schema и параметры: references/commands.md. Не переноси углы, пути, номера страниц и пропорции из предыдущей тетради.
python3 <skill>/scripts/scan.py prepare <photos> --work <work> --layout auto
python3 <skill>/scripts/scan.py inspect <work>/manifest.json --work <work>/inspect --ids 0006-L,0006-R
python3 <skill>/scripts/scan.py build <work>/manifest.json --output <work>/draft.pdf
python3 <skill>/scripts/scan.py measure <work>/draft-pages --work <work>/measure
python3 <skill>/scripts/scan.py review <work>/draft.pdf --work <work>/review
python3 <skill>/scripts/scan.py compare <work>/draft.scan.json --work <work>/compare
Зависимости: Pillow, NumPy, OpenCV, ReportLab для фото; pypdfium2 для crop; Poppler pdftoppm для review и measure по PDF. Импорты разделены по командам. Проверь доступные интерпретаторы/готовые окружения; при необходимости используй отдельное venv, не меняя глобальный Python. Если OpenCV/NumPy стоят системными пакетами, создавай venv на том же интерпретаторе с --system-site-packages (python3 -m venv; uv venv по умолчанию берёт свой Python и системный cv2 не увидит). Сеть не предполагается обязательной. Не встраивай пути из кэша конкретной машины в навык.
Пропорции и размер листа. aspect: null оценивается по сторонам контура и под ракурсом может быть смещён на 1–2 %. Для бумаги в клетку собери черновик и запусти measure. Он находит шаг клетки, считает физический размер страниц и предлагает одно aspect на всю тетрадь и --width-mm. Значения бери из вывода, не из прошлой тетради. С одинаковым --width-mm все страницы PDF имеют один физический размер. Иначе размер считается из пикселей и --dpi и скачет вместе с расстоянием съёмки.
build требует reviewed: true у включённых страниц: это отметка проверки разметки агентом, а не дополнительное согласование с пользователем. Не спрашивай разрешение на рутинную обработку уже переданных фотографий.
Регрессии детектора. Проверенный manifest тетради — эталон. После изменения scan.py прогоняй prepare на тех же фото и eval <новый manifest> --reference <эталон>. Команда покажет ошибку углов в % ширины страницы, долю помеченных страниц и «тихие» ошибки — непомеченные страницы с ошибкой больше --tolerance (по умолчанию 3 %). Код возврата 1, если тихих ошибок больше --max-silent. Эталоны с личными фото в репозиторий навыка не клади.
Завершение
- Исходные фото не изменяй. Существующий PDF заменяй после проверки новой версии. Сохраняй разметку и параметры для точечных исправлений.
- При повторной правке сначала проверь актуальность файла. Не допускай накопительного JPEG-пересжатия.
- Сообщай результат, число страниц и существенные ограничения исходников. Если часть записи уже вне кадра, укажи это вместо заявления о восстановлении.
- Навык экономит подготовку и повторное написание кода; полностью автоматическое распознавание границ и отмену визуальной проверки он не обещает.