PDFMonkey помогает собирать счета, договоры, отчёты, сертификаты и другие PDF по одному шаблону: макет создаётся в визуальном конструкторе либо в HTML/CSS-редакторе, переменные подставляются из JSON, а готовый файл формируется вручную в панели, через REST API, вебхук или интеграцию с системой автоматизации.
Работа строится вокруг шаблона и набора данных. Сначала в макете размещают постоянные элементы — логотип, заголовки, табличные колонки, подписи и фон, затем связывают нужные поля с именами из тестового JSON. После проверки предпросмотра шаблон публикуют и передают ему фактические данные заказа, клиента или отчёта, не меняя оформление для каждого документа.
Для простых макетов удобен Builder с блоками текста, изображений, таблиц и QR-кодов; для сложной типографики, вычислений, условий и JavaScript подходит Code Template с HTML, CSS и Liquid. Оба способа используют один процесс генерации, поэтому шаблон можно вызывать из панели, бизнес-приложения, сценария Make или другого подключённого процесса.
Открыть PDFMonkey
- Редактирование PDF
- Русский интерфейс
- Просто новичкам
- 20 документов в месяц
- Внешние ресурсы платно
- Ссылки — только Pro+
Как устроен рабочий процесс PDFMonkey
Основной объект в PDFMonkey — шаблон, а не отдельный готовый файл. В шаблоне хранится композиция страниц, постоянный текст, стили и правила, по которым данные превращаются в видимые элементы. Документ появляется только после запуска генерации. Такой подход особенно полезен там, где один и тот же макет нужно выпускать десятки или тысячи раз: номер счёта, адрес покупателя и строки заказа меняются, а сетка, фирменные цвета, колонтитулы и порядок разделов остаются одинаковыми.
Практический цикл состоит из пяти действий. Создайте шаблон, внесите тестовые данные, настройте связи полей, проверьте результат в предпросмотре и опубликуйте макет. После публикации отправляйте реальные значения из формы, CRM, базы данных или сценария автоматизации. Когда данные меняются, перерабатывать верстку не требуется; когда меняется дизайн, достаточно исправить шаблон, не затрагивая код, который передаёт сведения о клиенте и заказе.
Шаблон следует рассматривать как контракт между дизайнером документа и передающей системой. Имена полей в JSON должны быть стабильными, типы значений — предсказуемыми, а необязательные поля — обработанными условиями или значениями по умолчанию. Если в макете ожидается массив позиций, передача строки вместо массива приведёт к пустой таблице или ошибке логики. Поэтому до подключения API полезно согласовать структуру данных и сохранить несколько тестовых наборов: минимальный, обычный и максимально длинный.
В панели шаблоны и сформированные документы разделены. В списке шаблонов открывают редактор, дублируют макет и запускают создание документа; в списке документов отслеживают состояние генерации, имя файла и доступность результата. Такое разделение помогает не путать исходный дизайн с экземплярами, которые уже были выпущены для конкретных клиентов.
Панель шаблонов, документов и настроек
Левая навигация панели ведёт к приложениям, шаблонам, документам, настройкам и интеграциям. В рабочем проекте удобно заводить отдельное приложение для продукта, подразделения или окружения. Это не только упорядочивает список: ключ API, шаблоны и документы логически относятся к выбранному приложению, поэтому тестовые операции можно изолировать от боевых сценариев.
Карточка шаблона показывает название и доступные действия. Названия лучше делать функциональными: Счёт A4, Акт с приложением, Сертификат курса, а не Новый шаблон 2. При большом количестве макетов полезно отражать в имени язык, формат страницы или назначение. Версию бизнес-макета разумнее фиксировать в своём соглашении об именах либо создавать копию перед значительной переработкой, чтобы действующие процессы продолжали обращаться к проверенной структуре.
Редактор шаблона объединяет рабочую область, тестовые данные, внешние ресурсы и пользовательский код. В Code Template основная часть экрана занята исходным кодом и предпросмотром, а в Builder — холстом, деревом элементов и панелью свойств. Кнопка сохранения фиксирует изменения, но для выдачи документов через рабочий процесс нужен опубликованный вариант. Из-за этого распространённая ошибка выглядит так: предпросмотр уже показывает новую верстку, а интеграция продолжает получать прежний результат. Перед контрольным запуском проверьте, что изменения не только сохранены, но и опубликованы.
Раздел Documents полезен не только для скачивания. Здесь видно, прошёл ли экземпляр стадии подготовки и генерации, завершился ли успешно, а также какое имя получил файл. При отладке сначала найдите неудачный документ в этом списке и сопоставьте его время с запросом приложения. Если запись создана, но результата нет, проблема обычно находится в данных, шаблоне или ресурсах; если записи нет вообще, проверять следует авторизацию, адрес конечной точки и обработку ответа на стороне отправителя.
В Settings находятся параметры приложения и данные, используемые для подключения API. Секретный ключ нельзя вставлять в клиентский JavaScript, открытый конструктор сайта или мобильный пакет: любой пользователь сможет его извлечь. Запросы к PDFMonkey должны идти с сервера либо через платформу автоматизации, где секрет хранится в защищённом соединении. При подозрении на утечку ключ следует заменить и обновить его во всех сценариях.
Визуальный конструктор Builder
Builder предназначен для сборки макета из готовых блоков без ручной верстки каждой детали. Слева расположены дерево документа и библиотека элементов, в центре — страница, справа — вкладки Style и Settings выбранного объекта. Верхняя панель даёт доступ к тестовым данным, внешним ресурсам, CSS, JavaScript, предпросмотру, сохранению и публикации. Такое устройство позволяет сначала выстроить структуру, затем настроить внешний вид и только после этого добавить динамическую логику.
В библиотеке доступны Page, Container, Text, Heading, Image, HTML, Table и QR Code. Page задаёт лист и служит корнем композиции. Container группирует связанные элементы и помогает управлять отступами, фоном, границами и повторением. Text и Heading предназначены для обычного и акцентного текста. HTML нужен для фрагмента, который проще описать разметкой. Table создаёт структурированную таблицу, а QR Code формирует машиночитаемый код из постоянного текста или переменной.
Начинайте не с мелких надписей, а с крупных областей: шапка, реквизиты сторон, таблица, блок итогов, примечание и подвал. Для каждой области создайте контейнер. Это упрощает перестановку элементов и позволяет целиком скрыть либо повторить группу. Если сразу разместить десятки независимых текстовых блоков на странице, правка отступов и условий быстро превращается в ручную работу.
Дерево элементов показывает вложенность. Выбор объекта на холсте должен подсвечивать соответствующую строку в дереве, а выбор строки — объект на странице. Перед удалением контейнера проверьте, какие дочерние элементы находятся внутри: удаление родителя затрагивает всю группу. При сложной структуре давайте пользовательским классам осмысленные имена, чтобы отличать одинаковые контейнеры в CSS и отладке.
Страница, поля и область печати
Размер страницы и поля определяют доступную ширину макета. Таблица, которая выглядит нормально в широком холсте, может переносить названия товаров после учёта полей. Сначала установите формат и ориентацию, затем задавайте колонки. Если документ печатают, оставляйте безопасные отступы у краёв и не размещайте важный текст вплотную к границе. Для длинного содержимого проверяйте не только первую страницу, но и перенос на вторую и последующие.
Фиксированная высота удобна для карточек и этикеток, но опасна для блоков с переменным текстом. Длинное название компании, многострочный адрес или примечание могут выйти за рамки. Для таких областей используйте естественную высоту, ограничивайте только ширину и тестируйте самые длинные допустимые значения. Если бизнес-правило устанавливает жёсткий лимит, проверяйте длину до отправки данных, а не полагайтесь на случайное обрезание.
Стили элементов
Вкладка Style объединяет типографику, размеры, интервалы, фон, границы и выравнивание. Настройку лучше вести от общего к частному: сначала базовый шрифт и цвет для документа, затем стили секций, после этого исключения для отдельных полей. Одинаковые значения не стоит задавать каждому блоку вручную; пользовательский класс и Custom CSS уменьшают количество несогласованных настроек.
Для табличных чисел важнее всего единообразное выравнивание. Количество, цена, налог и итог обычно читаются быстрее при выравнивании по правому краю; описание товара остаётся слева. Денежный формат формируйте в шаблоне либо заранее при подготовке данных, но не смешивайте два способа в одном документе. Иначе одна сумма может получить запятую как десятичный разделитель, а другая — точку.
Фоновые цвета и границы должны выдерживать печать в оттенках серого. Проверяйте, различаются ли заголовок таблицы и строки без цвета. Для важных границ выбирайте достаточную толщину, а для декоративных — не перегружайте документ. PDFMonkey воспроизводит заданный макет; он не исправляет автоматически слабый контраст или слишком мелкий шрифт.
Тестовый JSON и привязка динамических данных
Тестовые данные питают предпросмотр редактора. Они не являются данными будущих клиентов и не подставляются в каждый новый документ автоматически. Их задача — показать, как шаблон реагирует на строки, числа, логические значения, массивы и вложенные объекты. Создайте реалистичный набор, который содержит все обязательные поля, а затем сохраните дополнительные варианты для пустых и предельных случаев.
Имена переменных чувствительны к точному написанию и уровню вложенности. Поле клиента внутри объекта нельзя читать так же, как поле верхнего уровня. Если передающая система формирует объект customer с ключами name и address, макет должен обращаться именно к этой структуре. Разница между customerName, customer_name и CustomerName существенна. При пустом выводе первым делом сравните фактический payload с тестовым JSON посимвольно.
Builder предлагает браузер переменных, который показывает доступные пути из тестовых данных. Это снижает риск опечатки: вместо ручного ввода можно выбрать поле из дерева. Для динамического изображения, например, укажите ключ с адресом или данными картинки. Если поле отсутствует в тестовом наборе, оно не появится в браузере, поэтому сначала обновите JSON, затем повторно откройте выбор переменной.
Разделяйте данные содержания и метаданные процесса. В payload помещайте то, что требуется шаблону: имя, позиции заказа, даты, суммы. В metadata можно передавать внутренний идентификатор операции, номер клиента или метку сценария, если эти сведения нужны для сопоставления документа, но не должны выводиться. Такой подход уменьшает риск случайно показать служебный идентификатор в макете.
Значения по умолчанию особенно полезны для необязательных строк. Вместо пустого места можно вывести нейтральный текст или полностью скрыть блок. Для чисел не подменяйте отсутствие нулём без бизнес-основания: нулевая скидка и неизвестная скидка означают разные состояния. Для массивов предусмотрите вариант без элементов — например, скрывайте заголовок приложения, если список приложений пуст.
Условия и повторение элементов
Visibility Condition определяет, показывать ли выбранный элемент. Условие подходит для подписи Оплачено, дополнительного адреса, строки скидки, примечания к поставке или раздела, который нужен только определённому типу клиента. Условие должно давать однозначный результат для всех тестовых наборов. Сравнение строки с логическим значением или числа со строкой часто приводит к неожиданному поведению, поэтому следите за типами.
Repetition повторяет элемент по массиву. Типичный пример — строка таблицы для каждой позиции заказа или карточка для каждого участника. Внутри повторяемого блока используются поля текущего элемента массива. Не дублируйте вручную десять строк на всякий случай: количество повторений определяется данными, а макет остаётся компактным.
Builder не позволяет одновременно назначить одному и тому же элементу условие видимости и повторение. Это ограничение обходится вложенностью: внешний контейнер получает условие, а внутренний — повторение, либо наоборот, в зависимости от требуемой логики. Например, весь раздел Комплектующие можно скрыть при пустом массиве, а вложенную строку повторять для каждого комплектующего.
Для вложенных массивов делите логику на уровни. Внешний контейнер повторяется по заказам, внутренний — по позициям конкретного заказа. Перед реализацией нарисуйте структуру данных и отметьте, на каком уровне доступно каждое поле. Ошибка области видимости проявляется тем, что переменная существует в JSON, но пуста именно внутри повторения.
Проверяйте макет на одном, двух и большом количестве элементов. Один элемент не показывает ошибки между строками, два обнаруживают неверный интервал, а длинный массив выявляет перенос страницы и повторение заголовка. Если каждая строка содержит изображение, дополнительно оцените скорость генерации и общий размер ресурсов.
Таблицы для счетов, актов и отчётов
Табличный блок создаёт семантическую структуру с таблицей, заголовком, телом, строками и ячейками. Это удобнее набора разрозненных контейнеров: ширины колонок и границы управляются согласованно, а повторение строк привязывается к массиву. В дереве видны уровни table, thead, tbody, tr, th и td, поэтому можно отдельно оформить заголовок и данные.
Сначала определите смысл колонок и минимальную ширину. Артикул и количество занимают мало места, описание требует гибкой колонки, цена и сумма должны сохранять читаемый денежный формат. Если общая ширина превышает страницу, уменьшение шрифта — не первое решение. Сократите избыточные подписи, перенесите второстепенные данные на новую строку или выберите альбомную ориентацию.
Режим границ border-collapse объединяет соседние линии и подходит для классической сетки. Separate оставляет промежуток между ячейками и позволяет строить карточный вид. Выбор влияет не только на внешний вид, но и на расчёт пространства. После переключения перепроверьте ширину таблицы и высоту строк.
Динамическую строку связывают с массивом позиций. В ячейках используют поля текущей позиции: название, количество, цена, ставка и сумма. Общие итоги лучше выводить отдельным блоком после таблицы, чтобы они не повторялись с каждой строкой. Если требуется группировка, заранее подготовьте сгруппированный массив либо используйте Code Template, где логика обработки данных гибче.
Чередование фона строк улучшает чтение длинного отчёта. Однако полосы должны сохраняться после переноса страниц и не конфликтовать с условным выделением просроченной позиции. Решите приоритет: например, предупреждение красной рамкой должно быть заметнее обычной зебры. В тестах используйте достаточно строк, чтобы увидеть оба состояния на нескольких страницах.
Изображения: логотипы, фотографии и подписи
Блок Image принимает постоянное изображение или значение из данных. Для фирменного логотипа удобен стабильный ресурс, для фотографии товара — переменная. Изображение можно передать внешним адресом, data URI или встроенным SVG. Внешняя загрузка зависит от доступности сервера, времени ответа и тарифных возможностей; data URI увеличивает payload, но не требует отдельного сетевого запроса.
На бесплатном плане внешние ресурсы недоступны. Это касается не только картинок, но и удалённых таблиц стилей, скриптов и веб-шрифтов. Если предпросмотр с локально вставленным изображением работает, а адрес картинки в данных не загружается, проверьте план и способ подключения ресурса. Для бесплатного теста используйте встроенные данные или загрузку в сам шаблон, когда это предусмотрено интерфейсом.
Разрешение исходника должно соответствовать размеру на странице. Маленькая картинка, растянутая на половину листа, останется размытой. Для печатного документа полезно брать исходник примерно в полтора-два раза больше отображаемого размера, но не отправлять многомегабайтную фотографию без необходимости. Оптимизация изображений снижает время генерации и размер результата.
Если картинка задаётся переменной, предусмотрите отсутствие значения. Пустой адрес не должен оставлять рамку с большой пустой областью. Можно скрыть весь контейнер условием либо подставить нейтральное изображение-заглушку. Для фотографий разной пропорции выберите правило вписывания: сохранение целого кадра с полями или заполнение области с обрезкой. Проверяйте портретные и альбомные варианты.
SVG удобен для логотипов, пиктограмм и схем: линии остаются чёткими при масштабировании. Но сложный SVG с внешними шрифтами, фильтрами или ссылками может воспроизводиться не так, как в графическом редакторе. Упростите файл, переведите критичные надписи в контуры либо используйте проверенный встроенный шрифт.
QR-коды в шаблоне
QR Code создаёт код непосредственно в макете. Содержимым может быть постоянная строка или переменная: адрес страницы оплаты, идентификатор билета, ссылка на проверку сертификата, номер заявки. Не помещайте в код чувствительные сведения, если документ может попасть постороннему; QR лишь кодирует текст, а не защищает его.
В настройках доступны размер, цвет переднего плана и фона, уровень коррекции ошибок, стиль точек и углов, а также логотип. Уровни L, M, Q и H определяют запас восстановления повреждённого кода: высокий уровень полезен при печати маленького логотипа поверх кода или при сложных условиях сканирования, но увеличивает плотность рисунка. Не уменьшайте код до размера, при котором модули сливаются.
Контраст важнее декоративности. Тёмный код на светлом фоне обычно распознаётся надёжнее инверсного варианта. Оставляйте свободное поле вокруг матрицы и не размещайте рядом активную текстуру. После генерации распечатайте образец на целевом принтере и проверьте несколькими камерами. Успешное чтение на мониторе не гарантирует чтение с мятой наклейки или матовой бумаги.
Если в центре расположен логотип, он не должен занимать чрезмерную долю кода. Используйте коррекцию Q или H и сохраняйте ключевые угловые маркеры. Для серийных билетов обязательно проверьте уникальность значения в системе, выдающей билеты: PDFMonkey отрисует переданную строку, но не контролирует, не выдавался ли такой билет раньше.
Пользовательский CSS в Builder
Custom CSS нужен, когда панели Style недостаточно: требуется общий класс, сложный селектор, печатное правило или единое оформление нескольких элементов. Редактор открывается отдельным окном с подсветкой синтаксиса. Стили применяются к предпросмотру, поэтому результат можно проверять без выхода из шаблона.
Назначайте класс через соответствующее поле элемента и обращайтесь к нему в CSS. Не полагайтесь на случайную внутреннюю структуру или автоматически созданные идентификаторы: после изменения Builder такой селектор может перестать совпадать. Пользовательский класс делает зависимость явной и облегчает сопровождение.
CSS должен дополнять визуальные настройки, а не спорить с ними. Если ширина задана в панели и одновременно переопределена правилом с высокой специфичностью, редактор может показывать одно значение, а результат — другое. Для диагностики временно отключите спорное правило или добавьте тестовый заметный стиль, чтобы убедиться, что селектор действительно применяется.
Внешние таблицы стилей подключаются через External Assets. Это удобно для фирменных шрифтов и общей дизайн-системы, но создаёт сетевую зависимость. Ресурс должен отвечать быстро и без авторизации, которую генератор не может передать. Для критичного оформления разумнее перенести минимально необходимый CSS в шаблон, чтобы сбой стороннего сервера не изменил документ.
Code Templates: HTML, CSS и Liquid
Code Template даёт прямой контроль над HTML-разметкой и печатными стилями. Такой способ подходит для многостраничных отчётов, сложной типографики, специальных колонтитулов, вычисляемых разделов и макетов, уже описанных веб-разработчиком. Редактор показывает исходный код и результат рядом, поэтому изменения структуры и стилей можно проверять сразу.
Динамические значения вставляются средствами Liquid. Простая переменная выводит одно поле, цикл проходит по массиву, условие выбирает фрагмент, а фильтр форматирует значение. Liquid выполняется до финального рендеринга, поэтому в PDF попадает уже сформированный HTML. Не переносите в шаблон бизнес-логику, которая должна быть единой для нескольких систем; налоговые правила и права доступа надёжнее вычислять в приложении, передавая готовые значения.
Тестовый JSON для Code Template выполняет ту же роль, что и в Builder. Он должен соответствовать реальному payload. Для вложенных объектов используйте точный путь, для массивов — цикл. При сложных данных полезно сначала вывести значение в простом диагностическом блоке, убедиться в его форме, а затем применять форматирование и условия.
Liquid-фильтры и подготовка текста
Стандартные фильтры помогают добавлять суффиксы, выбирать значение по умолчанию, преобразовывать дату, заменять переносы строк и фильтровать коллекции. PDFMonkey также предоставляет дополнительные операции для массивов и чисел, включая суммирование, разбиение, формирование фразы из списка, выражения выборки, работу с часовыми поясами, нормализацию протокола и числовой формат. Перед использованием редкого фильтра проверьте его на пустом значении и на неожиданном типе.
Формат даты должен учитывать способ передачи и часовой пояс. Строка без зоны может интерпретироваться не так, как ожидается в другом регионе. Для юридически значимого документа лучше передавать уже определённую бизнес-дату, а не вычислять её из текущего времени шаблона. Для отображения используйте единый формат во всём документе.
Текст из пользовательского ввода может содержать переносы, кавычки и специальные символы. Система шаблонов должна экранировать данные в нужном контексте, но нельзя вставлять непроверенный текст в JavaScript или CSS как готовый код. Если многострочный комментарий должен сохранить переносы, применяйте предназначенный для этого фильтр или CSS-свойство, а не заменяйте символы вручную цепочкой хрупких операций.
Печатная раскладка и разрывы страниц
В CSS задаются формат листа, поля, правила переноса и поведение элементов при печати. Для заголовка раздела можно запретить отрыв от следующего абзаца, для небольшой карточки — разрыв внутри, а перед новой главой — принудительный переход. Однако запрет разрыва у слишком высокого блока не может выполнить невозможное: если блок выше доступной страницы, движку всё равно придётся перенести или разделить его.
Проверяйте начало и конец каждой страницы. Одинокая строка таблицы, заголовок без содержимого или подпись, ушедшая на отдельный лист, обычно исправляются сочетанием размеров, отступов и правил разрыва. Не пытайтесь решить всё фиксированной высотой: данные разной длины снова нарушат композицию.
Для колонтитулов есть несколько подходов. Настройки шаблона подходят для повторяющейся шапки и подвала, но требуют оставить место в полях. Элемент внутри содержимого удобен, если нужен только один раз. Paged.js помогает строить более сложную постраничную композицию. Выбирайте один основной способ, иначе одинаковый текст может появиться дважды или перекрыть содержимое.
JavaScript и диаграммы
Пользовательский JavaScript применяется, когда данных и Liquid недостаточно для визуальной части: например, нужно построить диаграмму или выполнить подготовку DOM перед печатью. В Code Template можно использовать Chart.js и Day.js, а при включённой передаче данных обращаться к глобальному объекту payload. Скрипт должен завершить отрисовку до момента формирования результата; асинхронные операции без явного ожидания могут не успеть.
Для диаграммы задайте фиксированный предсказуемый размер контейнера и проверяйте наборы с нулём, одним и множеством значений. Подписи длинных категорий могут наложиться, а большие числа — выйти за шкалу. Цвета должны оставаться различимыми при печати. Если график критичен, добавьте рядом таблицу ключевых значений: это повысит доступность и поможет при чёрно-белой печати.
В Builder пользовательские функции JavaScript должны быть доступны через глобальный объект window, чтобы логика шаблона могла их вызвать. Избегайте изменения элементов, которыми управляет конструктор, без необходимости. Скрипт, напрямую перестраивающий дерево, может конфликтовать с повторением и условиями. Лучше вычислить значение и вернуть его в предназначенное поле или класс.
Внешний скрипт подключайте только с надёжного адреса и фиксированной совместимой версией. Изменение сторонней библиотеки способно внезапно поменять результат старого шаблона. Для стабильного процесса храните минимальное число зависимостей и фиксируйте контрольные примеры документов после каждого обновления.
Интерактивные поля PDF
Code Templates позволяют добавлять заполняемые поля PDF: текстовые поля, флажки, переключатели, списки и другие элементы формы. Это полезно для анкеты или договора, который получатель должен дополнить после генерации. Поля создаются специальными маркерами в HTML, а их параметры определяют имя, начальное значение и поведение.
Имена полей должны быть уникальными и стабильными. Если два поля имеют одно имя, просмотрщик может синхронизировать их значения, что иногда удобно для повторяющегося номера, но чаще вызывает путаницу. Для группы радиокнопок одинаковое имя используется осознанно, а значения вариантов различаются. Проверьте форму в нескольких распространённых просмотрщиках: поддержка сложных элементов и сценариев может отличаться.
Заполняемая форма не заменяет электронную подпись и не гарантирует неизменность документа. После заполнения пользователь может сохранить новую копию, а проверка подлинности требует отдельного процесса. Если документ должен перейти на подпись, генерируйте его с предзаполненными данными и передавайте в специализированную систему подписания.
Ручное создание документа в панели
Ручная генерация удобна для тестирования и разовых экземпляров. Откройте шаблон, выберите создание документа, вставьте данные и при необходимости метаданные. Сохранённый экземпляр сначала может находиться в черновом состоянии. После команды генерации он проходит обработку и получает результат либо ошибку.
Панельный запуск — лучший способ отделить проблему шаблона от проблемы интеграции. Если тот же JSON успешно формирует файл вручную, проверяйте запрос приложения. Если ошибка повторяется в панели, сосредоточьтесь на верстке, данных и ресурсах. Сохраняйте не только успешный набор, но и JSON проблемного экземпляра, удалив персональные сведения.
При тесте меняйте один фактор за раз. Сначала используйте минимальный набор данных и встроенные ресурсы. Затем добавьте массивы, изображения и внешние зависимости. Такой порядок позволяет точно определить, после какого шага появляется пустая страница, задержка или неверный перенос.
REST API и жизненный цикл документа
API принимает запрос с авторизацией Bearer и данными документа. Секрет передаётся в заголовке, а не в адресной строке. Запрос обычно содержит идентификатор шаблона и payload. Ответ нужно проверять по HTTP-коду и телу: успешное создание записи ещё не всегда означает, что бинарный PDF уже готов.
Асинхронный процесс проходит состояния draft, pending, generating, success или failure. Черновик сохранён, но ещё не отправлен на рендеринг. Pending ожидает обработки, generating выполняется, success означает готовый результат, failure — завершение с ошибкой. Приложение должно обрабатывать каждое состояние, а не считать отсутствие ссылки признаком сетевого сбоя.
Для массовой или длительной работы предпочтителен асинхронный запрос: приложение создаёт документ, сохраняет его идентификатор и ждёт вебхук либо периодически запрашивает состояние с разумным интервалом. Синхронная конечная точка удобна для небольшого интерактивного действия, когда пользователь ожидает результат, но она удерживает соединение до завершения и ограничена временем обработки.
Не запускайте бесконечный опрос каждую секунду. Используйте увеличение интервала и общий тайм-аут. Если документ долго остаётся pending, запишите идентификатор и продолжите проверку фоновым процессом. Пользователю лучше показать состояние готовится, чем заставлять его повторно нажимать кнопку и создавать дубликаты.
Повтор запроса после сетевого тайм-аута требует осторожности: сервер мог принять исходный запрос, хотя клиент не получил ответ. Сохраняйте собственный идентификатор операции в metadata и перед повторной генерацией ищите уже созданный экземпляр в своей системе учёта. Иначе один заказ может породить несколько одинаковых файлов и несколько уведомлений.
Синхронная и асинхронная схема
Синхронную схему выбирайте для короткого документа с предсказуемыми ресурсами. Она проще: запрос возвращает готовый результат либо ошибку. Но большой отчёт, удалённые изображения и JavaScript увеличивают время. Если соединение между сервисами ограничено коротким тайм-аутом, переходите на асинхронную модель.
Асинхронная схема требует хранения состояния, зато лучше масштабируется и переживает временные задержки. После создания документа сохраните его идентификатор вместе с бизнес-операцией. При вебхуке найдите запись, убедитесь, что событие относится к ожидаемому приложению и документу, затем заберите свежую ссылку и сохраните файл в собственное хранилище, если он нужен дольше срока доступности.
Имена файлов, пароль и формат результата
Служебное поле _filename задаёт понятное имя результата. Используйте безопасную комбинацию типа документа и номера: invoice-10542.pdf, а не имя клиента с произвольными символами. Удаляйте слеши, управляющие знаки и чрезмерно длинные строки. Расширение должно соответствовать выбранному формату.
Поле _password включает защиту PDF паролем с шифрованием AES-256. Пароль не следует отправлять получателю в том же письме, что и документ. Передавайте его по отдельному каналу либо используйте известное получателю правило, которое не раскрывает чувствительные сведения. Хранить пароль в журнале запросов также нежелательно.
Пароль ограничивает открытие файла, но не исправляет ошибочную отправку адресату и не заменяет управление доступом. Если документ содержит персональные данные, контролируйте получателя до генерации и удаляйте временные копии. Проверьте, что целевые PDF-просмотрщики поддерживают выбранное шифрование.
Кроме PDF, шаблон может формировать WebP, PNG или JPG. Для изображения задаются тип, ширина, высота и, для WebP, качество. Такой вывод подходит для карточек, сертификатов-превью, ярлыков и графики для сообщений. PDF лучше для многостраничного документа, печати и заполняемых полей; растровый формат — для одного фиксированного кадра.
PNG сохраняет прозрачность и чёткие края, но часто весит больше. JPG эффективен для фотографий, однако добавляет артефакты вокруг мелкого текста. WebP обычно даёт хороший баланс, но совместимость со старой системой-получателем нужно проверить. Для документа с мелким шрифтом не снижайте качество до уровня, при котором цифры теряют резкость.
Ссылки на результат и хранение
Ссылка скачивания является временной подписанной ссылкой на хранилище и действует один час. Её нельзя сохранять в базе как постоянный адрес для клиента. Если пользователь открывает письмо через несколько часов и получает 403, приложение должно запросить свежие сведения о документе либо выдать файл из собственного долговременного хранилища.
Сразу после состояния success скачайте результат, если он нужен для архива, бухгалтерии или повторной отправки. Проверяйте код ответа и Content-Type, затем сохраняйте файл под контролируемым именем. Не считайте наличие непустой ссылки гарантией успешной загрузки: ссылка может истечь между получением и обращением, а сетевой запрос — прерваться.
Срок хранения сформированных документов зависит от плана. На Free и Starter он составляет один день, на Pro — семь дней, на Pro+ и Premium заявлено неограниченное хранение в рамках условий сервиса. Даже при длительном хранении бизнес-система должна иметь собственную политику архивирования, резервирования и удаления персональных данных.
Публичные share links доступны начиная с Pro+. Они удобны, когда получателю нужно открыть документ по стабильной странице без вашей инфраструктуры. Однако такая ссылка фактически является способом доступа: не публикуйте её в открытом журнале и учитывайте, что переславший пользователь может передать доступ дальше. Для чувствительных материалов предпочтительнее собственная авторизация и контролируемая выдача.
Вебхуки и надёжная обработка событий
Вебхук сообщает приложению о завершении генерации, избавляя от частого опроса. Конечная точка должна быстро принять событие, проверить его и вернуть успешный ответ. Тяжёлую загрузку файла, отправку письма и обновление нескольких систем выполняйте в фоновой очереди, иначе медленный обработчик вызовет повторные доставки.
Проверяйте подпись вебхука по правилам документации и используйте исходное тело запроса в том виде, в котором оно пришло. Повторное преобразование JSON до проверки может изменить байты и привести к ложному отказу. Секрет проверки храните так же строго, как ключ API.
События могут приходить повторно или не по порядку. Обработчик должен быть идемпотентным: если документ уже сохранён и уведомление отправлено, повторное событие не должно отправлять второе письмо. Сохраняйте идентификатор события или пару документ — итоговое состояние и обновляйте запись только при допустимом переходе.
После события success не используйте слепо переданный адрес через долгое время. Получите или проверьте актуальные данные документа и скачайте файл в пределах срока ссылки. При failure сохраните диагностическое сообщение, шаблон и безопасный фрагмент структуры payload, чтобы разработчик мог воспроизвести проблему без доступа к персональным данным.
Интеграции без самостоятельного кода
PDFMonkey подключается к Make, Zapier, n8n, Workato, Bubble, Glide и другим системам автоматизации. Общая схема одинакова: событие в исходной системе запускает модуль создания документа, поля сценария превращаются в JSON, затем готовый файл передаётся в почту, облачное хранилище, CRM или следующий шаг.
В Make сначала создают защищённое соединение, выбирают приложение и опубликованный шаблон, затем сопоставляют поля. Dynamic Data должен быть корректным JSON. Значения из предыдущих модулей подставляются в нужные ключи, а metadata используют для внутреннего номера операции. После генерации файл следует скачать сразу, а не хранить временную ссылку для последующего шага через несколько часов.
Кавычки и переносы пользовательского текста могут нарушить JSON, если собирать его строковой конкатенацией. Используйте структурированный модуль формирования JSON или встроенное экранирование платформы. Особенно внимательно проверяйте многострочные комментарии, адреса и названия с кавычками.
В n8n и похожих системах удобно разделить процесс на узлы: подготовка данных, запрос генерации, ожидание события или проверка статуса, скачивание бинарного файла, сохранение и уведомление. Такое разделение облегчает повтор отдельного шага и показывает, где возникла ошибка. Не помещайте ключ API в текст общего workflow, который экспортируется в публичный репозиторий.
Bubble и Glide позволяют запускать генерацию из пользовательского приложения, но секретный запрос всё равно должен выполняться серверной частью или защищённым коннектором. Не вызывайте API непосредственно из браузера пользователя с постоянным ключом. Ограничьте, какие шаблоны и данные может запросить конкретная роль.
Рабочие сценарии
Счёт или коммерческое предложение
Для счёта создайте контейнер шапки с логотипом и реквизитами, блок покупателя, таблицу позиций, итоги и платёжные данные. Массив items повторяет строки. Налог, скидку и общий итог лучше передавать уже рассчитанными, а шаблон использовать для форматирования. Добавьте условие для строки скидки и отдельное условие для пометки об оплате.
Проверьте длинное название товара, нулевую ставку, несколько ставок, многострочный адрес и документ на несколько страниц. Заголовок таблицы должен оставаться понятным после переноса, а итог — не отрываться от подписи. Имя файла формируйте по номеру счёта, а внутренний идентификатор заказа храните в metadata.
Договор из анкеты
Договор удобно собирать из постоянных формулировок и условных разделов. Данные сторон, предмет, сроки и суммы приходят из анкеты или CRM. Вариативные пункты включаются условиями, но юридическую логику не следует строить из десятков неочевидных выражений внутри шаблона. Лучше передать готовый набор разрешённых положений и явно отобразить его.
Для подписания сформируйте окончательный PDF, проверьте нумерацию страниц и передайте в систему электронной подписи. Если получатель должен заполнить несколько полей вручную, используйте PDF-форму, но не смешивайте обязательные данные сделки с полями, которые легко оставить пустыми.
Сертификат и билет
Для сертификата макет обычно одностраничный: фон, имя, название курса, дата, номер и QR-код проверки. Длинные имена требуют адаптивного размера или ограничений ввода. QR должен содержать уникальный адрес проверки, а не только визуальный номер, который легко скопировать.
Для билета создайте один документ на участника либо повторяемые карточки на странице. Первый вариант проще для отправки и контроля доступа; второй экономит бумагу при печати. Перед массовым выпуском сгенерируйте тестовые билеты и убедитесь, что все коды различны и сканируются после печати.
Отчёт с диаграммой
Отчёт объединяет сводные показатели, таблицы и графики. Данные для диаграммы передавайте в компактном массиве, а пояснения и итоговые выводы — отдельными полями. JavaScript рисует график, но числовая таблица остаётся точным представлением значений. Для длинных отчётов настройте разрывы и колонтитулы.
Генерацию отчёта лучше запускать после завершения расчётов, а не собирать данные в самом шаблоне сетевыми запросами. Так результат становится воспроизводимым: один payload всегда даёт тот же набор показателей, а сбой стороннего API не оставляет пустую диаграмму.
Карточка товара или изображение для сообщения
Растровый вывод позволяет создавать карточку фиксированного размера: фотография, цена, короткое описание и QR. Установите точные ширину и высоту, используйте изображения подходящей пропорции и ограничьте длину текста. Для карточек разных каналов лучше иметь отдельные шаблоны, чем пытаться одним макетом обслужить квадрат, вертикальный и широкий формат.
JPG выбирайте для фото, PNG — для прозрачности и текста, WebP — для уменьшения размера при поддержке получателя. После генерации проверяйте не только визуальное качество, но и фактические размеры пикселей, чтобы платформа не масштабировала изображение непредсказуемо.
Ограничения планов, которые влияют на проектирование
Бесплатный план ограничен двадцатью документами в месяц. Этого достаточно для знакомства и небольшого прототипа, но не для регулярной выдачи счетов или отчётов. Считайте документом каждую генерацию, включая повторные тесты. До массового запуска оцените месячный объём, пики и количество экземпляров, которые создаются при одной бизнес-операции.
Новые аккаунты получают тридцатидневный пробный доступ уровня Pro с лимитом 300 документов. Используйте этот период не только для дизайна: проверьте интеграцию, обработку ошибок, реальные размеры файлов, время генерации и поведение после истечения временной ссылки. Также протестируйте сценарий на возможностях того плана, который будет использоваться дальше, иначе прототип может зависеть от внешних ресурсов или функций, недоступных после пробного периода.
Максимальное время генерации различается: 30 секунд на Free и Starter, 2 минуты на Pro, 3 минуты на Pro+ и 5 минут на Premium. Это верхний предел обработки, а не рекомендуемое целевое время. Обычный счёт должен формироваться значительно быстрее. Если макет приближается к лимиту, уменьшайте изображения, исключайте медленные ресурсы и упрощайте JavaScript.
Внешние ресурсы доступны в платных планах и пробном периоде, но не на Free. Share links начинаются с Pro+. Срок хранения также меняется по планам. Эти различия следует учитывать до построения процесса: нельзя строить долговременное хранение на однодневном сроке или отправлять клиенту временную ссылку как постоянную.
Совместимость макета и выходного PDF
Результат следует проверять в тех программах и устройствах, которыми пользуются получатели. Базовый текст и изображения обычно отображаются одинаково, но интерактивные формы, встроенные шрифты, прозрачность и сложные печатные свойства могут различаться. Для критичного документа храните контрольные примеры и включайте просмотр хотя бы в двух независимых PDF-программах.
Печать требует отдельного теста. Поля принтера, масштаб вписать и автоматический выбор ориентации могут изменить вид. Укажите пользователю ожидаемый формат бумаги и проверьте печать при масштабе 100 процентов. Для этикетки или бланка с точными размерами используйте калибровочный образец.
Шрифты влияют на перенос строк и высоту блоков. Веб-шрифт может не загрузиться, если внешний ресурс недоступен, после чего подставится другой и изменит верстку. Для важных документов подключайте проверенный ресурс или используйте доступный встроенный шрифт. Убедитесь, что кириллица, цифры, знаки валют и специальные символы присутствуют в выбранном начертании.
Builder и Code Template — разные системы шаблонов. Builder использует свой механизм данных на основе Vue, а Code Template — Liquid. Автоматического преобразования визуального макета в кодовый нет. Выбирайте подход до глубокой проработки дизайна: перенос сложного готового шаблона означает ручное воссоздание.
Импорт существующего PDF, Word или другого документа как редактируемого шаблона не поддерживается. Макет строится заново. Можно использовать исходный документ как визуальный образец и перенести структуру, но поля и логику всё равно нужно создать средствами PDFMonkey. Если основная задача — исправить текст в уже готовом PDF, потребуется редактор PDF, а не генератор из данных.
Безопасность данных и доступов
Передавайте в payload только сведения, необходимые для документа. Внутренние токены, пароли, полные журналы и скрытые поля формы не должны попадать в шаблон. Чем меньше данных проходит через процесс генерации, тем проще ограничить последствия ошибки и выполнить запрос на удаление.
Секреты API храните в переменных окружения или защищённом хранилище платформы. Разделяйте ключи теста и производства, регулярно проверяйте, кто имеет доступ к панели, и удаляйте учётные записи бывших сотрудников. Не размещайте секрет в шаблоне, пользовательском JavaScript или исходном коде страницы.
PDFMonkey указывает размещение инфраструктуры в Европейском союзе, шифрование данных при передаче и хранении и ориентацию на требования GDPR. Эти меры не отменяют обязанностей владельца процесса: необходимо определить правовое основание, срок хранения, перечень получателей и процедуру удаления. Для регулируемых данных согласуйте условия обработки с ответственным за безопасность.
Логи интеграции должны помогать отладке, но не становиться вторым архивом персональных данных. Записывайте идентификатор документа, шаблона, состояние, длительность и техническую ошибку. Полный payload сохраняйте только при необходимости, маскируя номера документов, адреса и другие чувствительные поля.
Типовые ошибки и способы устранения
Документ пустой
Пустой результат обычно означает, что шаблон не опубликован, условие скрыло весь контент, данные не совпали с переменными или CSS сделал элементы невидимыми. Начните с простого постоянного текста без условий. Если он появляется, возвращайте динамические блоки по одному. Затем проверьте тестовый JSON и фактический payload.
В Code Template временно удалите сложные стили и JavaScript, оставив минимальную HTML-структуру. В Builder отключите условия у корневых контейнеров. Такой диагностический макет быстро показывает, относится ли проблема к рендерингу или к данным. После исправления восстановите компоненты постепенно.
Ссылка скачивания пустая
Поле ссылки остаётся пустым, пока документ не достиг состояния success. У черновика, pending или generating готового файла ещё нет. Отправьте черновик на генерацию, затем дождитесь вебхука или проверяйте состояние. Не пытайтесь скачать результат сразу после асинхронного создания.
Если состояние failure, повторный запрос той же ссылки не поможет. Изучите сообщение об ошибке и воспроизведите данные в панели. Проверьте доступность изображений, синтаксис шаблона, время выполнения скрипта и типы полей.
Ошибка 403 при скачивании
403 у ранее работавшего адреса чаще всего означает, что час действия подписанной ссылки истёк. Получите свежие данные документа и используйте новый адрес. Для клиентских писем не вставляйте временный адрес как вечную кнопку; сохраните файл у себя или используйте доступную функцию share link с подходящим контролем доступа.
Переменная не выводится
Сравните регистр, подчёркивания и вложенность. Затем убедитесь, что поле есть именно в реальном запросе, а не только в тестовом JSON. Для цикла проверьте, что значение является массивом. Временно выведите родительский объект или отдельный простой ключ, чтобы найти уровень, на котором данные теряются.
Если значение равно null или пустой строке, условие и фильтр могут вести себя по-разному. Зафиксируйте правила до передачи в шаблон: отсутствующее поле, null и пустая строка должны использоваться осознанно. Это особенно важно для дат и чисел, где пустое значение нельзя безопасно форматировать как обычное.
Не загружается изображение или шрифт
Проверьте, доступен ли ресурс без входа, возвращает ли правильный тип содержимого и отвечает ли достаточно быстро. Адрес, открывающий HTML-страницу просмотра вместо самого файла, не подходит. Убедитесь, что план разрешает внешние ресурсы. Для диагностики замените адрес небольшим известным изображением или встроенным data URI.
Сервер ресурса может запрещать запросы, требовать заголовок или ограничивать регион. Перенесите файл в хранилище с прямой выдачей либо встроите его. Для шрифта проверьте формат и наличие нужного начертания. После замены очистите старое правило и заново сформируйте документ.
Верстка расходится с предпросмотром
Убедитесь, что опубликована последняя сохранённая версия. Проверьте фиксированные размеры, внешние зависимости и шрифты. Разница может проявляться только на определённых данных: длинная строка, пустой массив или крупное изображение меняют поток. Сравнивайте предпросмотр с тем же payload, который использовался в интеграции.
Если элемент перекрывает другой, временно добавьте контрастные границы контейнерам и отключите абсолютное позиционирование. Если таблица выходит за страницу, измерьте суммарную ширину колонок с учётом padding и границ. Если подвал перекрывает текст, увеличьте нижнее поле или выберите другой способ колонтитула.
Генерация идёт слишком долго
Сначала исключите внешние ресурсы и JavaScript. Затем уменьшите изображения и количество повторяемых блоков. Большая фотография, загружаемая для каждой строки, создаёт ненужные сетевые и вычислительные затраты. Кэшируйте стабильные ресурсы и не строите сложную диаграмму из тысяч точек, если в документе видны только десятки.
Измеряйте время от принятия запроса до success, а не только длительность HTTP-вызова. Записывайте размер payload, количество страниц и шаблон. Так можно выявить, что замедление связано с конкретным типом отчёта, а не со всей системой.
Сравнение PDFMonkey с аналогами
Сервисы этого класса различаются не столько самим фактом генерации PDF, сколько способом создания макета. PDFMonkey сочетает визуальный Builder и кодовые шаблоны с данными. Некоторые конкуренты сосредоточены на преобразовании готового HTML, другие — на полностью визуальном редакторе и большом наборе интеграций.
| Программа | Лучше подходит для | Главное ограничение |
|---|---|---|
| PDFMonkey | Повторяемых документов из JSON с выбором между Builder и HTML/CSS/Liquid | Нельзя импортировать готовый PDF или Word как шаблон |
| DocRaptor | Сложного HTML-to-PDF с расширенной печатной CSS-типографикой на движке Prince | Нет визуального конструктора бизнес-шаблонов |
| PDFShift | Прямого преобразования HTML или веб-страницы в PDF через API | Не предлагает аналогичный редактор шаблонов с данными |
| APITemplate.io | PDF и изображений из визуальных или HTML-шаблонов с no-code-интеграциями | Использует другую систему шаблонов и требует переноса логики |
| CraftMyPDF | Визуальной сборки PDF и изображений с большим набором готовых блоков и интеграций | Сложный существующий HTML приходится адаптировать под его процесс |
PDFMonkey выбирают, когда нужен единый набор шаблонов для разработчиков и сотрудников, а данные уже удобно передавать в JSON. DocRaptor лучше для полиграфически сложного HTML и специальных возможностей Prince. PDFShift подходит, когда приложение уже формирует готовую страницу и требуется только надёжное преобразование. APITemplate.io и CraftMyPDF разумно рассматривать, если приоритетом являются визуальная сборка, изображения и no-code-процессы. PDF Commander решает другую задачу: вручную редактирует существующие PDF, поэтому он полезен для разовых исправлений, но не заменяет автоматическую выдачу документов из данных.
Как выбрать Builder или Code Template
Выбирайте Builder, если макет состоит из стандартных блоков, его будет поддерживать человек без постоянной работы с HTML, а условия и повторения сравнительно просты. Счета, сертификаты, карточки и короткие отчёты обычно удобно начинать именно так. Преимущество Builder — видимое дерево, панель свойств и выбор переменных.
Code Template лучше, если уже есть HTML/CSS, требуются сложные печатные правила, многочисленные циклы, специальные фильтры, интерактивные поля, Paged.js или JavaScript. Он даёт более прямой контроль, но требует дисциплины разработки: читаемой структуры, классов, тестовых данных и проверки синтаксиса.
Не выбирайте Code Template только ради одного нестандартного цвета или отступа: Builder поддерживает Custom CSS. И наоборот, не пытайтесь построить в визуальном режиме сложный многоуровневый отчёт с десятками зависимых вычислений, если кодовый шаблон выражает его яснее. Стоимость сопровождения важнее скорости первого макета.
Так как автоматического преобразования между режимами нет, создайте небольшой прототип самого трудного раздела до полного дизайна. Для счёта это длинная таблица с переносом, для отчёта — диаграмма и колонтитулы, для договора — условные разделы. Если прототип проходит предельные данные, выбранный режим подходит.
Организация шаблонов в рабочем проекте
Разделяйте тест и производство на уровне приложений и ключей. Тестовый шаблон может использовать искусственные данные и экспериментальные ресурсы, а производственный — только проверенные зависимости. Публикация должна быть осознанным шагом после контрольного просмотра, а не автоматическим следствием каждого сохранения.
Перед крупной правкой создавайте копию работающего макета. Проверьте её на наборе эталонных payload, затем переключите вызывающую систему на новый идентификатор либо перенесите изменения по принятому процессу. Храните краткое описание ожидаемых полей и несколько обезличенных примеров рядом с кодом интеграции.
Для многоязычных документов часто проще иметь отдельные шаблоны. Это позволяет менять длину подписей, порядок адреса, формат даты и правовые формулировки независимо. Один шаблон с большим словарём и десятками условий экономит число записей, но усложняет проверку и повышает риск вывести текст не на том языке.
Единицы измерения, валюта и формат чисел должны задаваться согласованно. Не передавайте символ валюты отдельно в одних сценариях и внутри строки суммы в других. Для каждой версии структуры данных сформулируйте правила: какие поля обязательны, какие могут быть null, какие массивы допустимо оставлять пустыми.
Тестирование перед массовой генерацией
Минимальный набор тестов включает пустые необязательные поля, одно и много элементов массива, длинные имена, отрицательные и нулевые числа, разные даты, кириллицу, латиницу и специальные символы. Для изображений нужны отсутствующий ресурс, вертикальный и горизонтальный кадр. Для таблицы — перенос на несколько страниц.
Создайте эталонные документы и сравнивайте их после изменений. Полностью побайтовое сравнение PDF не всегда полезно из-за метаданных, но визуальный контроль страниц и проверка ключевых текстов обнаруживают большинство регрессий. В автоматическом тесте можно убедиться, что генерация завершилась success, файл имеет ненулевой размер и содержит ожидаемое число страниц.
Нагрузочный тест должен отражать реальный пик. Не обязательно генерировать месячный объём за минуту, если бизнес-процесс распределён. Важно проверить очередь, тайм-ауты, повторные события и собственное хранилище. Отдельно измерьте сценарий с крупными изображениями и самый длинный отчёт.
После обновления шаблона проверьте не только новый пример, но и старые допустимые payload. Поле, которое недавно стало обязательным, может отсутствовать в отложенной задаче или повторной генерации старого заказа. Значение по умолчанию либо явная миграция данных предотвращает внезапный пустой блок.
Контрольный список запуска
- Формат страницы, ориентация и поля установлены до точной настройки колонок.
- Тестовый JSON совпадает с фактической структурой payload по именам и типам.
- Проверены минимальный, обычный и предельный наборы данных.
- Все внешние изображения, CSS, скрипты и шрифты доступны без ручного входа.
- Шаблон сохранён и опубликован, а интеграция использует нужный идентификатор.
- Секрет API хранится на сервере или в защищённом соединении автоматизации.
- Асинхронный процесс обрабатывает pending, generating, success и failure.
- Вебхук проверяется, повторные события не создают дубликаты действий.
- Готовый файл скачивается до истечения часовой ссылки и архивируется по правилам проекта.
- PDF открыт в целевых просмотрщиках и напечатан на нужном формате бумаги.
- Поля формы, пароль и QR-коды проверены отдельными практическими тестами.
- Логи содержат технические идентификаторы, но не раскрывают полный персональный payload.
Если хотя бы один пункт не выполнен, сначала устраните риск на тестовом приложении. Большинство проблем генерации дешевле обнаружить на одном обезличенном документе, чем после рассылки сотен файлов. Особое внимание уделяйте опубликованной версии, сроку ссылки и внешним ресурсам: эти три фактора часто дают результат, который отличается от успешного предпросмотра.
Разработка Code Template вне панели
Для кодовых шаблонов доступен официальный CLI, который переносит редактирование HTML, CSS и связанных файлов в привычную среду разработчика. Это полезно, когда макет разрастается, нужна навигация по проекту, поиск по нескольким файлам и контроль изменений. Панель остаётся местом публикации и проверки документа, а локальная работа уменьшает риск потерять крупную правку из-за случайного редактирования одной длинной вкладки.
Перед началом локальной работы зафиксируйте, с каким приложением и шаблоном связан проект. Не используйте один каталог для нескольких макетов без ясной структуры. Секрет подключения храните вне файлов, которые попадают в репозиторий. В историю версий должны входить шаблон, стили, тестовые данные без персональных сведений и краткое описание изменения, но не рабочие ключи и не реальные документы клиентов.
Локальный предпросмотр и результат сервера следует считать двумя этапами проверки. Редактор помогает быстро найти синтаксическую ошибку, однако финальное формирование зависит от движка, внешних ресурсов и настроек шаблона. После отправки изменений выполните контрольную генерацию в панели, затем опубликуйте и повторите тест через тот же API-процесс, которым пользуется приложение.
Система контроля версий особенно полезна для CSS и Liquid. Небольшая правка селектора может повлиять на несколько страниц, а изменение условия — убрать раздел только у редкого типа данных. Коммит с одной логической задачей проще проверить и откатить. Для каждого исправленного дефекта добавляйте обезличенный тестовый payload, который воспроизводил проблему.
Подключение из серверного приложения
Помимо прямых HTTP-запросов, для Ruby существует официальный клиент. Библиотека упрощает формирование запросов и работу с объектами API, но не отменяет проверку состояний и ошибок. В любом языке полезно обернуть вызов PDFMonkey в отдельный модуль: он принимает внутреннюю модель документа, преобразует её в согласованный payload, запускает генерацию и возвращает собственный результат приложения.
Такой адаптер не должен распространять детали сервиса по всему коду. Контроллер заказа не обязан знать имена служебных полей, сроки ссылки и порядок статусов. Он передаёт номер заказа и данные, а модуль генерации выбирает шаблон, задаёт имя файла, сохраняет идентификатор и обрабатывает завершение. При смене шаблона или способа ожидания правка остаётся в одном месте.
Ошибки делите на повторяемые и окончательные. Временный сетевой сбой или недоступность ресурса допускают повтор с задержкой; неверный идентификатор шаблона, ошибка Liquid или несовместимая структура данных требуют исправления, а не бесконечных попыток. Ограничивайте число повторов и переводите неуспешную операцию в очередь ручной проверки с понятной причиной.
При параллельной генерации учитывайте месячную квоту и возможные пики. Очередь приложения позволяет сгладить нагрузку, ограничить число одновременных запросов и отдавать приоритет документам, которые ждёт пользователь. Для пакетного отчёта можно сообщить о завершении позже, а для счёта после оплаты — запустить более приоритетную задачу.
Диагностика данных без раскрытия содержимого
В производственном журнале достаточно сохранять схему payload: перечень верхнеуровневых ключей, типы значений, длину массивов и контрольный идентификатор. Это позволяет увидеть, что items внезапно стал объектом или customer исчез, не записывая имена, адреса и суммы. Для строк можно фиксировать длину, для изображений — наличие и домен ресурса, для массивов — количество элементов.
Если нужна точная реплика ошибки, создайте обезличенную копию. Замените персональные строки на значения той же длины, сохраните структуру вложенности, количество строк и пропорции изображений. Простое удаление всех данных часто скрывает дефект: перенос страницы зависит от длины текста, а время генерации — от числа элементов. Обезличивание должно сохранять технические характеристики проблемного примера.
Для сравнения успешной и неуспешной генерации записывайте идентификатор шаблона, время публикации, состояние, длительность, число страниц и размер файла. Если ошибка появилась сразу после изменения макета, эти сведения быстро укажут границу. Если растёт только длительность при прежнем шаблоне, проверяйте объём данных и внешние ресурсы.
Подготовка документа к передаче пользователю
После скачивания проверьте, что файл действительно соответствует ожидаемому формату и не пуст. Имя из ответа не следует безусловно использовать как путь в файловой системе; очистите его и сохраняйте в каталоге, который не исполняет загруженное содержимое. Для отправки по почте укажите корректный MIME-тип и контролируйте максимальный размер вложения.
Если файл отправляется через ссылку вашего приложения, проверяйте право пользователя при каждом обращении. Не используйте предсказуемый номер документа как единственный секрет. Ссылка может вести на контроллер, который проверяет сессию или одноразовый токен, а затем выдаёт сохранённый PDF. Такой процесс надёжнее прямого распространения временного адреса хранилища.
Для повторной отправки используйте уже сохранённый экземпляр, если данные и юридический смысл документа не изменились. Новая генерация может попасть на изменённый шаблон и дать визуально другой файл под тем же номером. Если требуется неизменность, сохраняйте окончательный PDF и связывайте его с бизнес-операцией; повторную генерацию оформляйте как новую версию по правилам проекта.
Практический итог
Надёжный процесс с PDFMonkey начинается с простого шаблона и чёткой структуры данных. Сначала соберите постоянную композицию, добавьте тестовые переменные, затем условия, повторяемые строки и ресурсы. После публикации проверьте ручную генерацию тем же payload, который будет использовать приложение. Только затем подключайте API или сценарий автоматизации.
Для визуальных счетов, сертификатов и карточек Builder сокращает путь от макета до рабочего документа. Для многостраничной типографики, Liquid-фильтров, форм, сложных колонтитулов и диаграмм Code Template даёт нужный контроль. Выбор режима должен опираться на самый сложный элемент будущего документа и на навыки человека, который будет его сопровождать.
В рабочей эксплуатации считайте генерацию асинхронной операцией, даже если часть документов создаётся быстро. Сохраняйте идентификатор, обрабатывайте итоговое состояние, скачивайте файл до истечения временного адреса и делайте обработчик вебхука идемпотентным. Так повтор запроса, задержка ресурса или повторное событие не приведут к потере документа и двойной отправке.
PDFMonkey наиболее полезен не как способ один раз получить PDF, а как управляемый конвейер повторяемых документов. Качество такого конвейера определяется не количеством декоративных настроек, а согласованностью шаблона, данных, публикации, хранения и диагностики. Когда эти части проверены на предельных примерах, один макет стабильно выпускает документы с одинаковой структурой, а изменения дизайна остаются отделены от бизнес-данных.