N8n Convert to PDF: Полное руководство по автоматизации создания PDF-документов
N8n — это инструмент с открытым исходным кодом для оркестрации рабочих процессов (workflow automation), который позволяет соединять различные приложения и сервисы без написания кода. Одной из распространенных задач в бизнес-процессах является преобразование данных, текстов, HTML-страниц или изображений в формат PDF. В отличие от некоторых других платформ автоматизации, в N8n нет встроенного узла (node) с единственной функцией «Convert to PDF». Однако это не ограничивает возможности платформы, а открывает множество гибких и мощных способов реализации данной задачи путем интеграции со специализированными сервисами, использования внешних API или запуска собственного кода.
Архитектурные подходы к конвертации в PDF в N8n
Существует три основных подхода к созданию PDF-файлов в рабочих процессах N8n, каждый со своими преимуществами, сложностью и сценариями применения.
- Использование специализированных узлов N8n: Применение узлов, которые могут генерировать или обрабатывать файлы, таких как «HTML to PDF» или узлы для работы с шаблонами.
- Интеграция со внешними API и сервисами: Использование узла «HTTP Request» или готовых узлов для интеграции с облачными API, которые предоставляют услуги конвертации.
- Использование пользовательского кода: Запуск скриптов на JavaScript/Python внутри N8n с использованием библиотек для генерации PDF, таких как pdfkit, jsPDF или Puppeteer.
- Установите пользовательский узел «HTML to PDF» через менеджер пакетов N8n (npm).
- Разверните Gotenberg:
docker run -p 3000:3000 gotenberg/gotenberg:7. - В рабочем процессе добавьте узел «HTML to PDF».
- В параметрах узла укажите URL вашего сервера Gotenberg (например,
http://localhost:3000). - Передайте в узел HTML-контент (как строку или из предыдущего узла, например, шаблонизатора).
- Узел вернет бинарные данные PDF-файла, которые можно сохранить с помощью узла «Write Binary File» или отправить в облачное хранилище (Google Drive, S3).
- Метод:
POST - URL:
https://v2018.api2pdf.com/chrome/html/pdf - Заголовки:
Authorization: YOUR_API_KEY,Content-Type: application/json - Тело запроса (JSON):
{ "html": "{{$node['Шаблонизатор'].json['htmlContent']}}", "fileName": "document.pdf", "options": { "marginTop": "0.5in", "marginBottom": "0.5in" } }
Детальный разбор методов конвертации
1. Использование узла «HTML to PDF» (на основе Gotenberg)
Наиболее прямой способ в экосистеме N8n — это использование неофициального, но популярного пользовательского узла «HTML to PDF». Этот узел является оберткой вокруг открытого инструмента Gotenberg. Для его использования необходимо самостоятельно развернуть сервер Gotenberg (например, через Docker) и указать его адрес в настройках узла.
Процесс настройки рабочего процесса:
2. Интеграция с внешними API через HTTP Request
Этот метод предполагает использование облачных сервисов конвертации. Вы отправляете исходные данные (HTML, URL документа) на их API и получаете готовый PDF.
| Сервис | Ключевые параметры в HTTP Request | Преимущества |
|---|---|---|
| Api2PDF | URL для конвертации или raw HTML, ключ API, опции (ориентация, размер бумаги). | Высокая надежность, поддержка Chromium, водяные знаки, шифрование. |
| PDFlayer (apilayer) | Параметр document_url или html, ключ доступа, параметры CSS. |
Простой API, возможность использования секретных ключей в N8n. |
| Own API (например, внутренний сервис) | Любые параметры, определенные вашим API. Часто используется метод POST с телом запроса в формате JSON. | Полный контроль над процессом и безопасностью данных. |
Пример настройки узла HTTP Request для Api2PDF:
3. Генерация PDF с помощью пользовательского кода (Code Node)
Узел «Code» в N8n позволяет выполнять JavaScript. С его помощью можно генерировать PDF напрямую, используя библиотеки, доступные в среде выполнения N8n.
Пример с использованием библиотеки pdfkit (предварительно должен быть установлен в папку с N8n):
const PDFDocument = require('pdfkit');
const fs = require('fs');
const streamBuffers = require('stream-buffers');
// Создаем документ
const doc = new PDFDocument({ margin: 50 });
const bufferStream = new streamBuffers.WritableStreamBuffer();
// Пишем в буферный поток
doc.pipe(bufferStream);
doc.fontSize(25).text('Заголовок документа', { align: 'center' });
doc.moveDown();
doc.fontSize(12).text('Этот PDF был сгенерирован внутри узла Code в N8n.');
// ... добавление таблиц, изображений и т.д.
doc.end();
// Ждем окончания записи и возвращаем данные
bufferStream.on('finish', () => {
const pdfBuffer = bufferStream.getContents();
// Кодируем в base64 для передачи в следующем узле
const pdfBase64 = pdfBuffer.toString('base64');
return [ { json: {}, binary: { data: pdfBase64 } } ];
});
Важно: Для сложных HTML-шаблонов лучше использовать связку узла Code с библиотекой типа Puppeteer (запуск headless Chrome), но это требует установки дополнительных зависимостей на сервер, где работает N8n.
Типовые рабочие процессы (Workflows)
Workflow 1: Создание PDF-отчета из данных базы данных
- Узел «PostgreSQL» или «MySQL»: извлечение данных (например, продажи за день).
- Узел «HTML» или «Template»: преобразование данных в HTML-строку с использованием шаблона (Handlebars).
- Узел «HTML to PDF» (или HTTP Request к API): конвертация полученного HTML в PDF.
- Узел «Google Drive» или «S3»: загрузка полученного бинарного файла в облачное хранилище.
- Узел «Email Send» (например, Gmail): отправка письма с вложенным PDF или ссылкой на файл.
Workflow 2: Конвертация входящих писем или форм в PDF
- Триггер: «Email Trigger» (IMAP) или «Webhook» (для данных с формы на сайте).
- Узел «Code»: обработка и структурирование входящих данных (текст письма, вложения, поля формы).
- Узел «HTTP Request»: отправка структурированных данных на внутренний API, который генерирует PDF, или использование шаблона, как в первом workflow.
- Узел «Airtable» или «База данных»: сохранение метаданных (дата, отправитель, ссылка на PDF) для учета.
Обработка и дальнейшие действия с PDF-файлом
После генерации PDF в бинарном формате, N8n позволяет выполнить с ним множество операций:
- Сохранение локально: Узел «Write Binary File». Укажите путь и имя файла.
- Загрузка в облако: Используйте узлы для Google Drive, Dropbox, Amazon S3, Nextcloud. Обычно требуется передать binary data и имя файла.
- Отправка по почте: Узлы для Gmail, Outlook. Вложения добавляются через параметр Attachments, где указывается binary data и имя файла.
- Объединение PDF: Для этого можно использовать внешний API (например, PDF.co, Ilovepdf) или пользовательский код с библиотекой вроде pdf-lib.
- Добавление электронной подписи или водяных знаков: Как правило, требует интеграции со специализированными API или запуска кастомного скрипта.
Оптимизация и лучшие практики
- Кеширование шаблонов: Если вы генерируете много однотипных PDF, храните HTML-шаблоны в отдельном узле «Function» или во внешнем хранилище, чтобы не дублировать код.
- Обработка ошибок: Всегда добавляйте узел «Error Trigger» или настраивайте ветку «Catch» для узлов, работающих с внешними API, чтобы обрабатывать сбои сети или некорректные данные.
- Безопасность данных: При использовании облачных API для конфиденциальных данных убедитесь в соответствии сервиса GDPR/ISO. Рассмотрите вариант использования self-hosted решений (Gotenberg, внутренний API).
- Управление памятью: Генерация больших PDF-файлов или обработка множества файлов параллельно может нагружать память. Настройте соответствующие лимиты в N8n и используйте потоковую передачу данных, где это возможно.
- Именование файлов: Динамически генерируйте понятные имена файлов на основе данных (например,
Отчет_{{дата}}_{{клиент}}.pdf).
Ответы на часто задаваемые вопросы (FAQ)
Есть ли в N8n встроенный узел для конвертации в PDF?
Нет, в стандартной поставке N8n нет узла с названием «Convert to PDF». Однако функциональность реализуется через комбинацию других узлов: «HTML to PDF» (пользовательский), «HTTP Request» (для внешних API) или «Code» (для кастомной генерации).
Какой метод конвертации самый быстрый и дешевый для массового создания PDF?
Для массовой генерации наиболее экономичным и контролируемым является self-hosted подход с использованием узла «HTML to PDF» (Gotenberg) или запуска собственного микросервиса с Puppeteer. Это исключает плату за каждый документ. Если нет возможности поддерживать свой сервер, стоит выбирать API-сервисы с помесячной подпиской и без ограничений по количеству страниц.
Как передать динамические данные (например, из таблицы) в PDF-шаблон?
Стандартный путь: данные извлекаются узлом базы данных или из приложения (типа Google Sheets). Затем они передаются в узел «HTML» или «Template», где с помощью языка шаблонов (например, Handlebars) вставляются в HTML-структуру. Этот HTML затем конвертируется в PDF.
Можно ли создать PDF не из HTML, а из Word или Excel файлов в N8n?
Прямого способа нет. Стандартная стратегия: сначала конвертировать Word/Excel в HTML или PDF с помощью внешнего сервиса. Например, можно использовать CloudConvert API (поддерживает множество форматов) через узел «HTTP Request», чтобы получить PDF, а затем обработать его далее в рабочем процессе N8n.
Как добавить нумерацию страниц, колонтитулы или оглавление в генерируемый PDF?
Эти элементы должны быть добавлены на этапе создания HTML-контента или в процессе генерации PDF. При использовании HTML+CSS для конвертации через Gotenberg или API, колонтитулы и нумерация создаются с помощью CSS-правил @page и свойств content для псевдоэлементов. В библиотеке pdfkit для Node.js это делается программно через вызовы методов для добавления текста на каждую страницу.
Где хранятся сгенерированные PDF-файлы в процессе выполнения workflow?
До момента явного сохранения файл существует только в оперативной памяти рабочего процесса в виде бинарных данных (обычно в кодировке base64). Он физически сохраняется только после прохождения через узел записи на диск («Write Binary File») или загрузки в облачное хранилище. Рекомендуется не хранить файлы долго на сервере N8n, а сразу передавать их в системы долговременного хранения (S3, Google Drive).
Как настроить повторную попытку (retry) при сбое конвертации через внешний API?
В настройках узла «HTTP Request» (и многих других узлов) есть секция «Error Handling». Там можно активировать опцию «Retry on Fail» и задать количество попыток и интервалы между ними. Это полезно при временных сбоях сети или API.
Добавить комментарий