Акты из СберБизнеса часто нужно подписывать не электронной подписью, а обычной картинкой. Особенно если работаешь с подрядчиками или вахтовиками, у которых нет ЭЦП, или когда заказчику нужна именно визуальная подпись на PDF.
Открывать каждый файл, искать PNG с подписью и аккуратно класть её на строку «Исполнитель → Подпись» быстро надоедает. Когда в таблице разное число услуг, блок уезжает вниз, и целиться приходится заново.
Я изучаю Python и решил автоматизировать эту мелочь для себя. Получилось небольшое консольное приложение sign-acts. Возможно, кому-то тоже пригодится.
Что делает утилита
Скрипт работает с тремя папками:
inbox/— кладёте неподписанные PDF;signatures/— храните картинки подписей (по умолчаниюdefault.png);signed/— появляются готовые файлы с суффиксом_подписан.pdf.
Поиск якоря построен на pdfplumber. Скрипт ищет блок «Исполнитель» и линию или слово «Подпись», вычисляет координаты и через reportlab накладывает изображение. Ширина подписи по умолчанию 58 пунктов PDF, её можно менять.
Поддерживаются два основных шаблона:
- акты СберБизнес / JasperReports — блок «Исполнитель» + линия «Подпись»;
- старый двухколоночный шаблон — строка «подпись / расшифровка» слева.
Если рядом с линией уже есть изображение подписи, файл пропускается. Флаг --force позволяет переподписать.
Установка
Нужен Python 3.10 или новее.
git clone https://github.com/A-Krivoshen/sign-acts.git cd sign-acts python3 -m venv .venv .venv/bin/pip install -r requirements.txt # ваша подпись cp /path/to/signature.png signatures/default.png
Зависимости: pdfplumber, pypdf, reportlab, Pillow.
Для удобства можно сделать алиас:
echo "alias sign-acts='$(pwd)/sign'" >> ~/.bash_aliases source ~/.bashrc
Или положить лаунчер в PATH:
ln -s "$(pwd)/sign" ~/.local/bin/sign-acts
Как пользоваться
Интерактивное меню
Самый простой способ — запустить без аргументов:
sign-acts # или ./sign
Появится меню со статусом папок, текущей подписью и пунктами:
- подписать всё из inbox;
- подписать выбранные файлы;
- выбрать другую подпись;
- посмотреть статус;
- открыть папку;
- настройки;
- справка.
Типичный рабочий день выглядит так:
cp ~/Загрузки/"Акт №15 от 29.07.2026.pdf" ~/Work/sign-acts/inbox/ sign-acts # выбираете пункт 1 # результат: signed/Акт №15 от 29.07.2026_подписан.pdf
CLI без меню
Для скриптов и автоматизации удобнее прямые команды:
./sign list # статус папок ./sign run # всё из inbox → signed ./sign run -s default -v # явная подпись + подробный лог ./sign run --move # исходник уйдёт в inbox/done/ ./sign run -w 70 --force # ширина 70pt, переподписать ./sign run ~/path/act.pdf # один конкретный файл
Основные флаги:
-s name— взять подписьsignatures/name.png;-w 70— ширина подписи в пунктах;--move— переместить исходник вinbox/done/после успеха;--force— переподписать даже если картинка уже есть;-v— подробный вывод.
Несколько подписей
В папку signatures/ можно положить несколько файлов:
cp ~/krivoshein.png signatures/default.png cp ~/pechat.png signatures/pechat.png
Выбор через меню (пункт 3) или флаг -s pechat.
Где обычно ломается
Утилита рассчитана на типовые шаблоны СберБизнеса и старые двухколоночные акты. Если документ сгенерирован совсем другой системой и в нём нет ни слова «Исполнитель», ни линии «Подпись» в ожидаемом месте, якорь не найдётся.
В таких случаях скрипт просто пропускает файл. Имеет смысл сначала прогнать один акт в verbose-режиме и посмотреть, что именно он видит.
Уже подписанные документы определяются по наличию изображения рядом с линией. Если нужно принудительно обновить — используйте --force.
Проверка результата
После запуска смотрите папку signed/. Откройте любой получившийся PDF и убедитесь, что подпись легла ровно над линией, не перекрывая текст и не уехав в край.
В репозитории есть интеграционные тесты на реальных актах:
./tests/run_tests.sh # или .venv/bin/python tests/test_production.py
На момент публикации: 36 из 36 тестов пройдены, детект якоря — 86 из 86.
Короткое видео
Я снял короткое видео с полным циклом: от копирования акта в inbox до готового подписанного файла. Видео показывает и меню, и результат в PDF.
Вывод
sign-acts не заменяет электронную подпись банка и не претендует на юридическую значимость. Это просто способ быстро поставить картинку подписи на PDF-акт, не открывая редактор.
Если тоже периодически сталкиваетесь с такой рутиной — пока изучаете Python или просто хотите сэкономить пару минут — инструмент открыт, MIT, лежит на GitHub.