[{"data":1,"prerenderedAt":9},["ShallowReactive",2],{"$f8QGbEeMyw365Q5xfOAuXs14uD6v7uR7UgPpBPYDosd4":3},{"title":4,"description":5,"lead":6,"html":7,"slug":8},"Программное заполнение PDF форм: автоматизация через API на Python, JavaScript и cURL","Как автоматизировать заполнение PDF форм с помощью Bulldoc API. Пошаговое руководство с примерами кода на Python, Node.js и cURL. Заполняйте анкеты, заявления и отчёты без ручного труда.","Если вашему приложению нужно регулярно заполнять PDF формы — анкеты, заявления, договоры, формы отчётности — делать это вручную нерационально. В этой статье разберём, как автоматизировать заполнение PDF форм программно, и покажем готовые примеры кода на Python, Node.js и cURL с использованием Bulldoc API.","\u003Ch2>Зачем автоматизировать заполнение PDF форм\u003C\u002Fh2>\n\u003Cp>Интерактивные PDF формы повсюду: налоговые декларации, банковские анкеты, заявления в госорганы, формы статистической отчётности, опросники для клиентов. Когда таких документов десятки или сотни — ручное заполнение становится узким местом в любом рабочем процессе.\u003C\u002Fp>\n\u003Cp>Типичные сценарии, где нужна \u003Cstrong>автоматизация заполнения PDF формы\u003C\u002Fstrong>:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>CRM и ERP-системы\u003C\u002Fstrong> — автоматическая генерация заявлений, договоров и актов по данным клиента.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Порталы самообслуживания\u003C\u002Fstrong> — пользователь вводит данные в веб-форму, а на выходе получает готовый PDF.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Интеграции с госсервисами\u003C\u002Fstrong> — периодическая отправка форм отчётности с актуальными данными.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>HR-автоматизация\u003C\u002Fstrong> — массовое формирование трудовых договоров, заявлений и приказов.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>В каждом из этих случаев \u003Cstrong>программное заполнение PDF формы\u003C\u002Fstrong> через API экономит часы ручного труда и исключает ошибки.\u003C\u002Fp>\n\u003Ch2>Обзор существующих решений\u003C\u002Fh2>\n\u003Ch3>Python-библиотеки: PyPDF2, pdfrw, pypdf, reportlab\u003C\u002Fh3>\n\u003Cp>Библиотеки вроде \u003Ccode>pypdf\u003C\u002Fcode> или \u003Ccode>pdfrw\u003C\u002Fcode> позволяют работать с PDF на низком уровне прямо в Python-коде. Звучит удобно, но на практике возникают серьёзные проблемы:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Хрупкость.\u003C\u002Fstrong> PDF — сложный бинарный формат. Каждая библиотека поддерживает лишь подмножество спецификации, и конкретный файл может обрабатываться некорректно.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Проблемы с кодировками.\u003C\u002Fstrong> Кириллица в полях форм — частая головная боль. Нестандартные шрифты или нестандартное кодирование поля могут сломать результат.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Отсутствие гарантий воспроизводимости.\u003C\u002Fstrong> Заполненная форма может выглядеть иначе при открытии в разных PDF-ридерах.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Нет готовой инфраструктуры.\u003C\u002Fstrong> Хранение файлов, очереди задач, мониторинг — всё нужно строить самостоятельно.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Adobe Acrobat \u002F платные десктопные инструменты\u003C\u002Fh3>\n\u003Cp>Профессиональные инструменты Adobe решают задачу качественно, но совершенно не приспособлены для программной интеграции в веб-приложение или CI\u002FCD-пайплайн.\u003C\u002Fp>\n\u003Ch3>Self-hosted решения (LibreOffice, PDFtk)\u003C\u002Fh3>\n\u003Cp>Можно развернуть LibreOffice в headless-режиме или использовать PDFtk Server. Это бесплатно, но требует администрирования сервера, регулярных обновлений и не масштабируется без дополнительной работы.\u003C\u002Fp>\n\u003Ch3>Вывод\u003C\u002Fh3>\n\u003Cp>Все перечисленные варианты либо сложны в интеграции, либо ненадёжны при работе с реальными файлами, либо требуют значительных инженерных ресурсов на поддержку.\u003C\u002Fp>\n\u003Ch2>Что предлагает Bulldoc\u003C\u002Fh2>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fbulldoc.dev\">Bulldoc\u003C\u002Fa> — это специализированный SaaS-сервис для генерации и обработки печатных документов, разработанный с прицелом на разработчиков.\u003C\u002Fp>\n\u003Ch3>Простое и удобное REST API\u003C\u002Fh3>\n\u003Cp>Весь функционал доступен через стандартное RESTful API с поддержкой спецификации OpenAPI. Это означает:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Можно сгенерировать клиентскую библиотеку для \u003Cstrong>любого языка программирования\u003C\u002Fstrong> с помощью OpenAPI Generator.\u003C\u002Fli>\n\u003Cli>Поддержка \u003Cstrong>синхронных и асинхронных\u003C\u002Fstrong> запросов (подробнее ниже).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Гибкое ценообразование\u003C\u002Fh3>\n\u003Cp>Bulldoc работает по модели предоплаченных пакетов документов — вы платите только за то, что реально используете. Нет ежемесячной подписки, которая тикает вхолостую. Начать можно бесплатно и масштабироваться по мере роста нагрузки.\u003C\u002Fp>\n\u003Ch2>Программное заполнению PDF форм через API\u003C\u002Fh2>\n\u003Ch3>Шаг 1. Регистрация в сервисе\u003C\u002Fh3>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fapp.bulldoc.dev\u002Fuser\u002Fregister\">Зарегистрируйтесь\u003C\u002Fa> в сервисе и создайте аккаунт. Для начала работы достаточно email и пароля.\u003C\u002Fp>\n\u003Ch3>Шаг 2. Создание API-ключа\u003C\u002Fh3>\n\u003Cp>В личном кабинете перейдите в раздел настроек и создайте новый API-ключ. Сохраните его — он понадобится для аутентификации всех запросов к API.\u003C\u002Fp>\n\u003Cp>API-ключ передаётся в заголовке каждого запроса:\u003C\u002Fp>\n\u003Cdiv class=\"shiki-code\">\u003Cpre class=\"shiki material-theme-palenight\" style=\"background-color:transparent;color:#babed8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan>Authorization: Bearer &#x3C;ваш_api_ключ>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Ch3>Шаг 3. Загрузка файла формы через веб-интерфейс\u003C\u002Fh3>\n\u003Cp>Прежде чем заполнять форму через API, её нужно загрузить в сервис. Bulldoc принимает интерактивные PDF формы (с заполняемыми полями):\u003C\u002Fp>\n\u003Col>\n\u003Cli>В личном кабинете перейдите в раздел \u003Cstrong>«Формы»\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>Загрузите ваш PDF-файл с интерактивными полями.\u003C\u002Fli>\n\u003Cli>После загрузки сервис покажет \u003Cstrong>\u003Ccode>formId\u003C\u002Fcode>\u003C\u002Fstrong> — уникальный идентификатор формы. Запишите его, он используется в API-запросах.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>Совет:\u003C\u002Fstrong> Убедитесь, что в вашем PDF действительно есть интерактивные поля (AcroForm). Если форма представляет собой просто отсканированный документ без полей, её нужно предварительно подготовить в Adobe Acrobat или аналогичном инструменте.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch3>Шаг 4. Синхронные и асинхронные запросы\u003C\u002Fh3>\n\u003Cp>Bulldoc API поддерживает два режима обработки:\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Асинхронный (по умолчанию, \u003Ccode>sync: false\u003C\u002Fcode>)\u003C\u002Fstrong> — запрос возвращается немедленно с \u003Ccode>taskId\u003C\u002Fcode>. Документ обрабатывается в фоне. Статус задачи можно:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>опрашивать через \u003Ccode>GET \u002Fv1\u002Ftasks\u002F{id}\u003C\u002Fcode>,\u003C\u002Fli>\n\u003Cli>получать через вебхук, когда задача завершится.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Этот режим подходит для \u003Cstrong>массовой генерации\u003C\u002Fstrong> документов или когда не нужен мгновенный ответ.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Синхронный (\u003Ccode>sync: true\u003C\u002Fcode>)\u003C\u002Fstrong> — соединение удерживается до завершения обработки, и в ответе сразу возвращается готовый документ с URL для скачивания. Удобен для \u003Cstrong>интерактивных сценариев\u003C\u002Fstrong>, когда пользователь ждёт результата в режиме реального времени.\u003C\u002Fp>\n\u003Ch3>Шаг 5. Примеры запросов для заполнения PDF формы\u003C\u002Fh3>\n\u003Cp>Эндпоинт для заполнения форм: \u003Ccode>POST https:\u002F\u002Fapi.bulldoc.dev\u002Fv1\u002Fpdf\u002Ffill\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp>Тело запроса:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>formId\u003C\u002Fcode> — идентификатор загруженной формы\u003C\u002Fli>\n\u003Cli>\u003Ccode>data\u003C\u002Fcode> — объект с данными для заполнения полей (ключи соответствуют именам полей в форме)\u003C\u002Fli>\n\u003Cli>\u003Ccode>sync\u003C\u002Fcode> — \u003Ccode>true\u003C\u002Fcode> для синхронного режима (опционально)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>cURL\u003C\u002Fh4>\n\u003Cdiv class=\"shiki-code\">\u003Cpre class=\"shiki material-theme-palenight\" style=\"background-color:transparent;color:#babed8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFCB6B\">curl\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\"> -X\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\"> POST\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\"> https:\u002F\u002Fapi.bulldoc.dev\u002Fv1\u002Fpdf\u002Ffill\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C3E88D\">  -H\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">Authorization: Bearer &#x3C;ваш_api_ключ>\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C3E88D\">  -H\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">Content-Type: application\u002Fjson\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C3E88D\">  -d\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> '\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C3E88D\">    \"formId\": \"ваш_form_id\",\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C3E88D\">    \"sync\": true,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C3E88D\">    \"description\": \"Анкета клиента Иванов\",\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C3E88D\">    \"data\": {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C3E88D\">      \"full_name\": \"Иванов Иван Иванович\",\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C3E88D\">      \"birth_date\": \"01.01.1990\",\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C3E88D\">      \"passport_series\": \"4510\",\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C3E88D\">      \"passport_number\": \"123456\",\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C3E88D\">      \"address\": \"г. Москва, ул. Примерная, д. 1, кв. 10\",\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C3E88D\">      \"phone\": \"+7 (999) 123-45-67\",\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C3E88D\">      \"agree\": true\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C3E88D\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C3E88D\">  }\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">'\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>В синхронном режиме ответ придёт сразу и будет содержать URL для скачивания заполненного PDF.\u003C\u002Fp>\n\u003Ch4>Python — заполнить PDF форму\u003C\u002Fh4>\n\u003Cdiv class=\"shiki-code\">\u003Cpre class=\"shiki material-theme-palenight\" style=\"background-color:transparent;color:#babed8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF;font-style:italic\">import\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> requests\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">API_KEY \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">ваш_api_ключ\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">FORM_ID \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">ваш_form_id\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">url \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">https:\u002F\u002Fapi.bulldoc.dev\u002Fv1\u002Fpdf\u002Ffill\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">headers \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">    \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">Authorization\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#C792EA\"> f\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">\"Bearer \u003C\u002Fspan>\u003Cspan style=\"color:#F78C6C\">{\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\">API_KEY\u003C\u002Fspan>\u003Cspan style=\"color:#F78C6C\">}\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">    \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">Content-Type\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">application\u002Fjson\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">payload \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">    \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">formId\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> FORM_ID\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">    \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">sync\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> True,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">    \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">description\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">Анкета клиента\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">    \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">data\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">        \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">full_name\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">Иванов Иван Иванович\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">        \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">birth_date\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">01.01.1990\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">        \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">passport_series\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">4510\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">        \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">passport_number\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">123456\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">        \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">address\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">г. Москва, ул. Примерная, д. 1, кв. 10\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">        \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">phone\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">+7 (999) 123-45-67\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">        \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">agree\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> True,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">    },\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">response \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> requests\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">post\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">url\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8;font-style:italic\"> json\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">payload\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8;font-style:italic\"> headers\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">headers\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">response\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">raise_for_status\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">task \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> response\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">json\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#676E95;font-style:italic\"># В синхронном режиме документ уже готов\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">document_url \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> task\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">[\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">documents\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">][\u003C\u002Fspan>\u003Cspan style=\"color:#F78C6C\">0\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">][\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">url\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#82AAFF\">print\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#C792EA\">f\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">\"Документ готов: \u003C\u002Fspan>\u003Cspan style=\"color:#F78C6C\">{\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">document_url\u003C\u002Fspan>\u003Cspan style=\"color:#F78C6C\">}\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#676E95;font-style:italic\"># Скачиваем файл\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">pdf_response \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> requests\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">get\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">document_url\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF;font-style:italic\">with\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\"> open\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">filled_form.pdf\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">wb\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF;font-style:italic\"> as\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> f\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">    f\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">write\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">pdf_response\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#F07178\">content\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#82AAFF\">print\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">Файл сохранён: filled_form.pdf\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Для \u003Cstrong>асинхронного заполнения PDF формы на Python\u003C\u002Fstrong> — опустите \u003Ccode>sync\u003C\u002Fcode> или установите \u003Ccode>sync: False\u003C\u002Fcode>, затем опрашивайте статус:\u003C\u002Fp>\n\u003Cdiv class=\"shiki-code\">\u003Cpre class=\"shiki material-theme-palenight\" style=\"background-color:transparent;color:#babed8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF;font-style:italic\">import\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> time\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">payload\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">[\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">sync\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> False\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">response \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> requests\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">post\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">url\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8;font-style:italic\"> json\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">payload\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8;font-style:italic\"> headers\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">headers\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">task \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> response\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">json\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">task_id \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> task\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">[\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">id\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#676E95;font-style:italic\"># Ожидаем завершения\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF;font-style:italic\">while\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> True:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">    status_response \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> requests\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">get\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C792EA\">        f\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">\"https:\u002F\u002Fapi.bulldoc.dev\u002Fv1\u002Ftasks\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#F78C6C\">{\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">task_id\u003C\u002Fspan>\u003Cspan style=\"color:#F78C6C\">}\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8;font-style:italic\">        headers\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">headers\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">    )\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">    task \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> status_response\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">json\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF;font-style:italic\">    if\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> task\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">[\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">status\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> ==\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">finished\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">        document_url \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> task\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">[\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">documents\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">][\u003C\u002Fspan>\u003Cspan style=\"color:#F78C6C\">0\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">][\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">url\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#82AAFF\">        print\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#C792EA\">f\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">\"Готово: \u003C\u002Fspan>\u003Cspan style=\"color:#F78C6C\">{\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">document_url\u003C\u002Fspan>\u003Cspan style=\"color:#F78C6C\">}\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF;font-style:italic\">        break\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF;font-style:italic\">    elif\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> task\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">[\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">status\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">]\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> ==\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">failed\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#82AAFF\">        print\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#C792EA\">f\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">\"Ошибка: \u003C\u002Fspan>\u003Cspan style=\"color:#F78C6C\">{\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">task\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">get\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">'\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">errorMessage\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">'\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#F78C6C\">}\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF;font-style:italic\">        break\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">    time\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">sleep\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#F78C6C\">1\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Ch4>JavaScript \u002F Node.js — заполнить PDF форму\u003C\u002Fh4>\n\u003Cdiv class=\"shiki-code\">\u003Cpre class=\"shiki material-theme-palenight\" style=\"background-color:transparent;color:#babed8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#676E95;font-style:italic\">\u002F\u002F Требуется: Node.js 18+ (встроенный fetch) или установите node-fetch\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C792EA\">const\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> API_KEY \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">ваш_api_ключ\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C792EA\">const\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> FORM_ID \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">=\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">ваш_form_id\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C792EA\">async\u003C\u002Fspan>\u003Cspan style=\"color:#C792EA\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\"> fillPdfForm\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8;font-style:italic\">formData\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">)\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C792EA\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> response\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF;font-style:italic\"> await\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\"> fetch\u003C\u002Fspan>\u003Cspan style=\"color:#F07178\">(\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">https:\u002F\u002Fapi.bulldoc.dev\u002Fv1\u002Fpdf\u002Ffill\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F07178\">    method\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">POST\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F07178\">    headers\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F07178\">      Authorization\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> `\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">Bearer \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">${\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\">API_KEY\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">}`\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">      \"\u003C\u002Fspan>\u003Cspan style=\"color:#F07178\">Content-Type\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">application\u002Fjson\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">    },\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F07178\">    body\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> JSON\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">stringify\u003C\u002Fspan>\u003Cspan style=\"color:#F07178\">(\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F07178\">      formId\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> FORM_ID\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F07178\">      sync\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF9CAC\"> true\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F07178\">      description\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">Анкета клиента\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F07178\">      data\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> formData\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">    }\u003C\u002Fspan>\u003Cspan style=\"color:#F07178\">)\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">  }\u003C\u002Fspan>\u003Cspan style=\"color:#F07178\">)\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF;font-style:italic\">  if\u003C\u002Fspan>\u003Cspan style=\"color:#F07178\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">!\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\">response\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\">ok\u003C\u002Fspan>\u003Cspan style=\"color:#F07178\">) \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF;font-style:italic\">    throw\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> new\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\"> Error\u003C\u002Fspan>\u003Cspan style=\"color:#F07178\">(\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">`\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">Ошибка API: \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">${\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\">response\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\">status\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">}\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> ${\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\">response\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\">statusText\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">}`\u003C\u002Fspan>\u003Cspan style=\"color:#F07178\">)\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">  }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C792EA\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> task\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF;font-style:italic\"> await\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> response\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">json\u003C\u002Fspan>\u003Cspan style=\"color:#F07178\">()\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#676E95;font-style:italic\">  \u002F\u002F В синхронном режиме документ уже готов\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C792EA\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> documentUrl\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> task\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\">documents\u003C\u002Fspan>\u003Cspan style=\"color:#F07178\">[\u003C\u002Fspan>\u003Cspan style=\"color:#F78C6C\">0\u003C\u002Fspan>\u003Cspan style=\"color:#F07178\">]\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\">url\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#BABED8\">  console\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">log\u003C\u002Fspan>\u003Cspan style=\"color:#F07178\">(\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">Документ готов:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> documentUrl\u003C\u002Fspan>\u003Cspan style=\"color:#F07178\">)\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF;font-style:italic\">  return\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\"> documentUrl\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#676E95;font-style:italic\">\u002F\u002F Пример использования\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#82AAFF\">fillPdfForm\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\">(\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F07178\">  full_name\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">Иванов Иван Иванович\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F07178\">  birth_date\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">01.01.1990\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F07178\">  passport_series\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">4510\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F07178\">  passport_number\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">123456\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F07178\">  address\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">г. Москва, ул. Примерная, д. 1, кв. 10\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F07178\">  phone\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#C3E88D\">+7 (999) 123-45-67\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F07178\">  agree\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF9CAC\"> true\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#89DDFF\">}\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\">)\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#82AAFF\">catch\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\">(console\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#BABED8\">error)\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Для \u003Cstrong>асинхронного режима на Node.js\u003C\u002Fstrong> — полезно использовать вебхуки. Настройте вебхук в личном кабинете или через API (\u003Ccode>POST \u002Fv1\u002Fwebhooks\u003C\u002Fcode>), и Bulldoc пришлёт уведомление на ваш URL, когда документ будет готов.\u003C\u002Fp>\n\u003Ch2>Итог\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Программное заполнение PDF форм\u003C\u002Fstrong> через Bulldoc API — это простой и надёжный способ автоматизировать рутинные задачи с документами. Ключевые преимущества:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Нет необходимости разбираться в низкоуровневой структуре PDF.\u003C\u002Fli>\n\u003Cli>Работает с любым языком программирования через стандартный REST API.\u003C\u002Fli>\n\u003Cli>Гибкий выбор между синхронной и асинхронной обработкой.\u003C\u002Fli>\n\u003Cli>Прозрачная тарификация без обязательных подписок.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Зарегистрируйтесь на \u003Ca href=\"https:\u002F\u002Fbulldoc.dev\">bulldoc.dev\u003C\u002Fa>, загрузите вашу форму и сделайте первый API-запрос — это займёт не больше 10 минут.\u003C\u002Fp>\n","form-filling",1775924089270]