Генерируем договоры, акты и другие документы онлайн. И не паримся

Nikolay Pavlov
Сделать просто
5 min readDec 27, 2022

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

Схема работы и сервисы

Строится по следующему принципу — найти и заменить. Создаем Google документ, который будет шаблоном. Размечаем в нем места, где будем производить замену.
Прописываем в логике, что при новом запросе будет создаваться копия этого шаблона.
Заменяем все размеченные места данными из вебхука.
Скачиваем документ.
Загружаем в S3
Передаем готовый документ пользователю либо по ссылке или бинарно.
Для генерации документов вам подойдут:

  • n8n для бэкенда, создания логики.
  • Аккаунт в Google Cloud.
  • Google Drive API для создания шаблона, его копии.
  • Google Docs API для формирования запроса `find and replace`.
  • хранилище совместимое с S3 куда будем сохранять готовый файл и откуда его забирать. Например, AWS S3, подойдет S3 от TimeWeb.
    можно напрямую выкачивать документ без привязки к хранилищу, используя ссылку экспорт (этот метод менее стабилен и Google может в любой момент ограничить его).
Чтобы скачать документ через ссылку экспорт используйте ноду Http Request. В ссылке пропишите id файла, и тип файла. Вместо .pdf можно добавить .docx или другой.

n8n

Это настоящая находка для тех, кто хочет строить бэкенд процессы и различные автоматизации. В отличие от аналогов: Zapier, Make, Albato он бесплатен. Его просто установить на виртуальную машину и работать с ним.

Для нашего документа нам нужно получить данные из какого-либо источника. Это может быть вебхук из чатбота, POST запрос из админ панели, или заявка из формы.

Далее, мы формируем ветку или ветки сценария, где преобразовываем данные или просто передаем их по цепочке на генерацию.

Webhook

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

Справа раздел Body. С этим массивом данных и предстоит работать. Здесь содержится все, что мы передали из внешнего сервиса в вебхук.

Set

Эта нода в n8n позволяет манипулировать данными. Забирать их из вебхука и перезаписывать в определенные переменные.

В n8n существует свой синтаксис и язык размеки для обращения к данным из определенной ноды. Допустим вы хотите взять данные из ноды Webhook. Например, строку где содежится тип подачи документа, который хранится в переменной apply_type.

Ваше выражение будет следующим : {{$node[“Webhook”].json[“body”][“apply_type”]}} . Вы обратились к ноде Webhook, ее разделу body и конкретно к переменной где хранится записано значение типа документа apply_type.
Если в сценарии Вам надо что-то обсчитать, произвести сложные манипуляции через код. То в ноде Function Item, куда вы можете записать выражение на JavaScript вызов к ноде будет записан немного по другому:

let repnamesplit = 
String($node[“Webhook”].json[“body”][“representative_name”]);
const myArray = repnamesplit.split(“”);
return repnamesplit.toLocaleUpperCase();

В этом коде мы перезаписали значение в ноде Webhook, хранящееся в переменной representative_name (допустим здесь хранится имя прдеставителя компании, уполномоченного совершать юридические действия с документом, который мы генерируем) в переменную на JavaScript repnamesplit.

Далее, мы делим слово на отдельные буквы — repnamesplit.split(“”) и возвращаем значение return, но перед тем как его вернуть мы делаем все разделенные буквы заглавными toLocaleUpperCase(). Таким образом все преобразованное значение записывается во внутреннюю переменную ноды repnamesplit. А дальше в сценарии мы уже будем с ней работать через вызов выше в фигурных скобках.

В ноде Set мы можем разбирать массив из вебхука, переопределять его и перезаписывать для дальнейших действий.

Google Cloud

Генерировать документ мы будем на движке Google Docs. Знакомый, привычный и бесплатный инструмент. Для того, чтобы работать с сервисами Google через API нам нужен аккаунт в Google Cloud. Там нам нужно создать свое приложение. Оно может быть частным. Дать ему доступ к скоупам, сервисов Google Docs, Drive, Sheet. Создавать авторизацию Oauth2. Добавить наше новое приложение во вкладку Credetinals в n8n.

Я расскажу о том как подключить сервисы Google в n8n в отдельном материале, а пока можете прочитать об этом в инструкции n8n по ссылке.

Как разметить документ

В некоторых документах, не всегда бывает четкое количество данных. Например, в этом задано 6 переменных для видов работ. При том, что в договор может попасть и одна. Получится мусор. Как его убрать читайте ниже.

Я думаю, что это самая простая часть работы. Выбираете те места, в которые должны попасть динамические данные и заменяете их на переменные.

Выбираем директории в GoogleDrive

Как построить сценарий

Сначала мы получаем сортируем данные из вебхука — это могут быть ноды Set, IF, Switch, код. Далее, данные подаются на ноду GoogleDrive , которая копирует размеченный документ в папку которую мы предварительно назначили. В скопированном документе применяется find and replcace.

Схема работы генератора документов

Алгоритм ищет размеченные места и заменяет их нашими обогащенными данными. Если документ сложный большой, то после замены может оставаться мусор, какие-то данные, которые не удалось разметить или же их не поступало.

Так алгорим заменяет размеченные данные на нужные в Google документе.

Например, есть документы, где есть необязательные параметры. По сути эта таже нода GoogleDocs, но в ней в find and replce задана замена лишних символов.

Далее мы передаем документ на ноду GoogleDrive, где документ скачивается в бинарном формате.

После этого он подается в ноду s3, где закачивается в нужную нам директорию. Как правило, я даю дкументам унифицированные названия с переменными, чтобы их было проще выкачивать из s3.

После s3 вы можете делать с этим документом, что хотите. Скачиваете на компьютер, передаете в телеграм, сохраняете в учетной системе или личном кабинете, отправляет по электронной почте.

--

--