# Пример Workflow для обработки рейсов с Base64 PDF ## Структура Workflow ``` HTTP Request (FlightAware) ↓ HTTP Request (FlightRadar24) ↓ Code: Process Flights Data ← N8N_CODE_PROCESS_FLIGHTS_DATA.js ↓ Code: Prepare PDF Request ← N8N_FLIGHTS_PDF_BASE64_COMPLETE.js ↓ HTTP Request (Convert to PDF) ← Внешний сервис конвертации ↓ Code: Extract Base64 PDF ← N8N_FLIGHTS_PDF_BASE64_FULL.js ↓ [Использование base64 PDF] ├─→ Save File ├─→ Send Email ├─→ Upload to S3 └─→ Return in API Response ``` ## Детальная настройка нод ### 1. HTTP Request: FlightAware - **Method:** GET/POST (в зависимости от API) - **URL:** `https://flightaware.com/api/...` - **Authentication:** По необходимости ### 2. HTTP Request: FlightRadar24 - **Method:** GET/POST (в зависимости от API) - **URL:** `https://flightradar24.com/api/...` - **Authentication:** По необходимости ### 3. Code: Process Flights Data **Код:** Скопируйте из `N8N_CODE_PROCESS_FLIGHTS_DATA.js` **Входные данные:** - Два элемента из предыдущих HTTP Request нод **Выходные данные:** ```json { "html": "...", "flights": [...], "flights_count": 2, "sources": {...}, "generated_at": "2026-01-14T..." } ``` ### 4. Code: Prepare PDF Request **Код:** Скопируйте из `N8N_FLIGHTS_PDF_BASE64_COMPLETE.js` **Настройка:** - Замените `PDF_SERVICE_URL` на URL вашего сервиса - Замените `PDF_API_KEY` на ваш API ключ **Выходные данные:** ```json { "http_method": "POST", "http_url": "https://api.htmlpdfapi.com/v1/pdf", "http_headers": {...}, "http_body": "{...}", "html_length": 12345, "flights_count": 2 } ``` ### 5. HTTP Request: Convert to PDF **Настройка:** - **Method:** `{{ $json.http_method }}` - **URL:** `{{ $json.http_url }}` - **Authentication:** По необходимости (через Headers) - **Headers:** ```json {{ $json.http_headers }} ``` - **Body:** ```json {{ $json.http_body }} ``` - **Response Format:** `JSON` или `Binary` (зависит от сервиса) **Пример для htmlpdfapi.com:** ```json { "method": "POST", "url": "https://api.htmlpdfapi.com/v1/pdf", "headers": { "Content-Type": "application/json", "Authorization": "Bearer YOUR_API_KEY" }, "body": { "html": "{{ $('Code: Process Flights Data').first().json.html }}", "options": { "format": "A4", "printBackground": true }, "base64": true } } ``` ### 6. Code: Extract Base64 PDF **Код:** Скопируйте из `N8N_FLIGHTS_PDF_BASE64_FULL.js` **Входные данные:** - Ответ от HTTP Request ноды (JSON или Binary) **Выходные данные:** ```json { "pdf_base64": "JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC9MZW5ndGg...", "pdf_size_bytes": 123456, "pdf_size_mb": "0.12", "success": true, "source": "json_response" } ``` ## Использование base64 PDF ### Вариант A: Сохранение в файл **Code Node:** ```javascript const base64 = $('Code: Extract Base64 PDF').first().json.pdf_base64; const filename = `flights-report-${new Date().toISOString().split('T')[0]}.pdf`; // Конвертируем base64 в binary const pdfBuffer = Buffer.from(base64, 'base64'); return [{ binary: { data: pdfBuffer, fileName: filename, mimeType: 'application/pdf' }, json: { filename: filename, size_bytes: pdfBuffer.length } }]; ``` Затем используйте ноду **Write Binary File** или **Save to S3**. ### Вариант B: Отправка по Email **Code Node:** ```javascript const base64 = $('Code: Extract Base64 PDF').first().json.pdf_base64; const pdfBuffer = Buffer.from(base64, 'base64'); return [{ json: { to: 'recipient@example.com', subject: 'Отчёт о рейсах', text: 'Во вложении отчёт о рейсах.', attachments: [{ filename: 'flights-report.pdf', content: pdfBuffer, contentType: 'application/pdf' }] } }]; ``` Затем используйте ноду **Email Send**. ### Вариант C: Возврат в API Response **Code Node (перед Response нодой):** ```javascript const base64 = $('Code: Extract Base64 PDF').first().json.pdf_base64; const processedData = $('Code: Process Flights Data').first().json; return [{ json: { success: true, flights_count: processedData.flights_count, pdf_base64: base64, pdf_size_mb: $('Code: Extract Base64 PDF').first().json.pdf_size_mb, generated_at: processedData.generated_at } }]; ``` ### Вариант D: Загрузка в S3/Nextcloud **Code Node:** ```javascript const base64 = $('Code: Extract Base64 PDF').first().json.pdf_base64; const pdfBuffer = Buffer.from(base64, 'base64'); const filename = `flights-report-${new Date().toISOString().split('T')[0]}.pdf`; return [{ binary: { data: pdfBuffer, fileName: filename, mimeType: 'application/pdf' }, json: { bucket: 'your-bucket', key: `reports/${filename}`, contentType: 'application/pdf' } }]; ``` Затем используйте ноду **S3 Upload** или **Nextcloud Upload**. ## Альтернативные сервисы конвертации ### 1. htmlpdfapi.com ```javascript { "url": "https://api.htmlpdfapi.com/v1/pdf", "method": "POST", "headers": { "Content-Type": "application/json", "Authorization": "Bearer YOUR_API_KEY" }, "body": { "html": "{{ HTML }}", "base64": true } } ``` ### 2. pdfshift.io ```javascript { "url": "https://api.pdfshift.io/v3/convert/pdf", "method": "POST", "headers": { "Content-Type": "application/json", "Authorization": "Basic " + Buffer.from("api:YOUR_API_KEY").toString("base64") }, "body": { "source": "{{ HTML }}", "format": "A4" } } // Ответ содержит base64 в поле "pdf" ``` ### 3. api2pdf.com ```javascript { "url": "https://v2.api2pdf.com/chrome/html", "method": "POST", "headers": { "Authorization": "YOUR_API_KEY", "Content-Type": "application/json" }, "body": { "html": "{{ HTML }}", "inlinePdf": true, "fileName": "flights-report.pdf" } } // Ответ содержит base64 в поле "pdf" ``` ### 4. Self-hosted: Gotenberg ```javascript { "url": "http://your-gotenberg-server:3000/forms/chromium/convert/html", "method": "POST", "headers": { "Content-Type": "multipart/form-data" }, "body": { "files": [{ "name": "index.html", "content": "{{ HTML }}" }] } } // Ответ - binary PDF, конвертируем в base64 ``` ## Отладка ### Проверка HTML ```javascript const html = $('Code: Process Flights Data').first().json.html; console.log('HTML length:', html.length); console.log('HTML preview:', html.substring(0, 500)); ``` ### Проверка base64 ```javascript const base64 = $('Code: Extract Base64 PDF').first().json.pdf_base64; console.log('Base64 length:', base64.length); console.log('Base64 preview:', base64.substring(0, 100)); ``` ### Проверка размера PDF ```javascript const data = $('Code: Extract Base64 PDF').first().json; console.log('PDF size:', data.pdf_size_mb, 'MB'); console.log('PDF size bytes:', data.pdf_size_bytes); ``` ## Обработка ошибок Добавьте IF Node после HTTP Request для проверки успешности: ```javascript // IF Node: Check PDF Conversion Success {{ $json.success === true }} ``` Если ошибка - отправьте уведомление или сохраните HTML для ручной конвертации.