Подпись PDF-актов СберБизнес картинкой из терминала

Акты из СберБизнеса часто нужно подписывать не электронной подписью, а обычной картинкой. Особенно если работаешь с подрядчиками или вахтовиками, у которых нет ЭЦП, или когда заказчику нужна именно визуальная подпись на 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.

Источники и ссылки


Комментарии загружаются…

blank
Обзор конфиденциальности

На этом сайте используются файлы cookie, что позволяет нам обеспечить наилучшее качество обслуживания пользователей. Информация о файлах cookie хранится в вашем браузере и выполняет такие функции, как распознавание вас при возвращении на наш сайт и помощь нашей команде в понимании того, какие разделы сайта вы считаете наиболее интересными и полезными.