100 lines
3.8 KiB
JavaScript
100 lines
3.8 KiB
JavaScript
|
|
// ============================================================================
|
|||
|
|
// n8n Code Node: HTML → PDF через Browserless (полная версия)
|
|||
|
|
// ============================================================================
|
|||
|
|
// Используйте этот код ПОСЛЕ ноды, которая вернула HTML или html_base64
|
|||
|
|
// ============================================================================
|
|||
|
|
|
|||
|
|
// Получаем HTML из предыдущей ноды
|
|||
|
|
let html = null;
|
|||
|
|
|
|||
|
|
if ($json.html) {
|
|||
|
|
html = $json.html;
|
|||
|
|
} else if ($json.html_base64) {
|
|||
|
|
html = Buffer.from($json.html_base64, 'base64').toString('utf8');
|
|||
|
|
} else if ($json.body?.html) {
|
|||
|
|
html = $json.body.html;
|
|||
|
|
} else if ($binary && $binary.data) {
|
|||
|
|
html = $binary.data.toString('utf8');
|
|||
|
|
} else {
|
|||
|
|
throw new Error('HTML не найден. Проверьте, что предыдущая нода вернула html или html_base64');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
console.log('📄 HTML получен, длина:', html.length);
|
|||
|
|
|
|||
|
|
// ================== НАСТРОЙКИ BROWSERLESS ==================
|
|||
|
|
const BROWSERLESS_URL = 'http://147.45.146.17:3000';
|
|||
|
|
// ⚠️ ВАЖНО: Если Browserless требует токен, замените на ваш токен
|
|||
|
|
// Если токен не требуется, оставьте пустую строку или удалите Authorization header
|
|||
|
|
const BROWSERLESS_TOKEN = ''; // Замените на ваш токен, если требуется
|
|||
|
|
|
|||
|
|
// Конвертируем HTML в data URL для передачи в Browserless
|
|||
|
|
const htmlBase64 = Buffer.from(html, 'utf8').toString('base64');
|
|||
|
|
const dataUrl = `data:text/html;base64,${htmlBase64}`;
|
|||
|
|
|
|||
|
|
// Формируем headers
|
|||
|
|
const headers = {
|
|||
|
|
'Content-Type': 'application/json'
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// Добавляем токен, если он указан
|
|||
|
|
if (BROWSERLESS_TOKEN) {
|
|||
|
|
headers['Authorization'] = `Bearer ${BROWSERLESS_TOKEN}`;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ================== ПОДГОТОВКА ЗАПРОСА ==================
|
|||
|
|
return [{
|
|||
|
|
json: {
|
|||
|
|
// Данные для HTTP Request ноды
|
|||
|
|
method: 'POST',
|
|||
|
|
url: `${BROWSERLESS_URL}/pdf`,
|
|||
|
|
headers: headers,
|
|||
|
|
|
|||
|
|
// Тело запроса - передаём HTML через data URL
|
|||
|
|
body: JSON.stringify({
|
|||
|
|
url: dataUrl,
|
|||
|
|
options: {
|
|||
|
|
format: 'A4',
|
|||
|
|
printBackground: true,
|
|||
|
|
margin: {
|
|||
|
|
top: '20mm',
|
|||
|
|
right: '15mm',
|
|||
|
|
bottom: '20mm',
|
|||
|
|
left: '15mm'
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}),
|
|||
|
|
|
|||
|
|
// Метаданные для отладки
|
|||
|
|
html_length: html.length,
|
|||
|
|
data_url_length: dataUrl.length,
|
|||
|
|
browserless_url: BROWSERLESS_URL
|
|||
|
|
}
|
|||
|
|
}];
|
|||
|
|
|
|||
|
|
// ============================================================================
|
|||
|
|
// ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ:
|
|||
|
|
// ============================================================================
|
|||
|
|
// 1. Замените BROWSERLESS_TOKEN на ваш токен (если требуется)
|
|||
|
|
// 2. Добавьте HTTP Request ноду после этого Code Node
|
|||
|
|
// 3. В HTTP Request ноде настройте:
|
|||
|
|
// - Method: {{ $json.method }}
|
|||
|
|
// - URL: {{ $json.url }}
|
|||
|
|
// - Headers: {{ $json.headers }}
|
|||
|
|
// - Body: {{ $json.body }}
|
|||
|
|
// - Response Format: Binary (Browserless возвращает PDF как binary)
|
|||
|
|
// 4. После HTTP Request добавьте Code Node для конвертации binary в base64:
|
|||
|
|
//
|
|||
|
|
// const pdfBinary = $binary.data;
|
|||
|
|
// const base64 = Buffer.isBuffer(pdfBinary)
|
|||
|
|
// ? pdfBinary.toString('base64')
|
|||
|
|
// : Buffer.from(pdfBinary).toString('base64');
|
|||
|
|
//
|
|||
|
|
// return [{
|
|||
|
|
// json: {
|
|||
|
|
// pdf_base64: base64,
|
|||
|
|
// pdf_size_bytes: Buffer.from(base64, 'base64').length,
|
|||
|
|
// success: true
|
|||
|
|
// }
|
|||
|
|
// }];
|
|||
|
|
// ============================================================================
|