PDF-Rechnungen mit CustomJS API generieren
Anfänger
Dies ist ein Finance-Bereich Automatisierungsworkflow mit 5 Nodes. Hauptsächlich werden Set, Code, Webhook, RespondToWebhook, Html2Pdf und andere Nodes verwendet. PDF-Rechnungen mit CustomJS API generieren
Voraussetzungen
- •HTTP Webhook-Endpunkt (wird von n8n automatisch generiert)
Verwendete Nodes (5)
Kategorie
Workflow-Vorschau
Visualisierung der Node-Verbindungen, mit Zoom und Pan
Workflow exportieren
Kopieren Sie die folgende JSON-Konfiguration und importieren Sie sie in n8n
{
"meta": {
"instanceId": "fcf18fc485cc336a31bc65574fd28e124660f468281b7aad773616b17903afe6",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "de602925-4d9d-4045-9d9d-ed37dfb65490",
"name": "HTML zu PDF",
"type": "@custom-js/n8n-nodes-pdf-toolkit.html2Pdf",
"position": [
460,
-20
],
"parameters": {
"htmlInput": "=<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Invoice</title>\n <style>\n /* Global Reset */\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n /* Body and Container */\n body {\n font-family: 'Roboto', sans-serif;\n background: #f4f7fc;\n display: flex;\n justify-content: center;\n padding: 30px;\n }\n\n .invoice-wrapper {\n width: 100%;\n max-width: 900px;\n background: linear-gradient(145deg, #ffffff, #e6f7ff);\n border-radius: 10px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n padding: 40px;\n margin-top: 50px;\n }\n\n /* Header */\n .header {\n background: linear-gradient(145deg, #3f51b5, #2196f3);\n text-align: center;\n color: #fff;\n padding: 30px;\n border-radius: 8px;\n }\n\n .header h1 {\n font-size: 40px;\n margin-bottom: 10px;\n }\n\n .header p {\n font-size: 18px;\n font-weight: 400;\n }\n\n /* Invoice Details Section */\n .invoice-details {\n display: flex;\n justify-content: space-between;\n margin-top: 30px;\n border-top: 2px solid #eee;\n padding-top: 30px;\n }\n\n .invoice-details div {\n width: 48%;\n }\n\n .invoice-details h3 {\n color: #3f51b5;\n font-size: 20px;\n margin-bottom: 15px;\n }\n\n .invoice-details p {\n font-size: 15px;\n color: #555;\n line-height: 1.6;\n }\n\n /* Table Styling */\n .table {\n width: 100%;\n border-collapse: collapse;\n margin-top: 30px;\n }\n\n .table th,\n .table td {\n padding: 16px;\n text-align: left;\n font-size: 15px;\n color: #555;\n }\n\n .table th {\n background-color: #f1f5fc;\n color: #3f51b5;\n font-weight: 500;\n }\n\n .table td {\n background-color: #fff;\n border-bottom: 1px solid #e6e9f1;\n }\n\n .table tr:last-child td {\n border-bottom: none;\n }\n\n .table .total {\n font-weight: 600;\n font-size: 18px;\n color: #333;\n background-color: #f1f5fc;\n }\n\n .table .total td {\n text-align: right;\n }\n\n .table tr:nth-child(even) {\n background-color: #f9f9f9;\n }\n\n /* Footer */\n .footer {\n text-align: center;\n margin-top: 30px;\n font-size: 15px;\n color: #777;\n }\n\n .footer a {\n color: #2196f3;\n text-decoration: none;\n font-weight: 500;\n }\n\n .footer a:hover {\n text-decoration: underline;\n }\n\n /* Button */\n .btn {\n display: inline-block;\n background-color: #2196f3;\n color: white !important;\n font-size: 16px;\n font-weight: 600;\n padding: 12px 25px;\n margin-top: 25px;\n text-decoration: none;\n border-radius: 5px;\n transition: background-color 0.3s ease;\n box-shadow: 0 6px 15px rgba(33, 150, 243, 0.2);\n }\n\n .btn:hover {\n background-color: #1976d2;\n }\n\n .btn:active {\n background-color: #1565c0;\n }\n </style>\n</head>\n<body>\n\n<div class=\"invoice-wrapper\">\n <div class=\"header\">\n <h1>Invoice</h1>\n <p>Invoice #{{ $('Set data').item.json['Invoice No'] }}</p>\n </div>\n\n <div class=\"invoice-details\">\n <div>\n <h3>Billed To:</h3>\n {{ $json.bill_to }}\n </div>\n <div>\n <h3>From:</h3>\n {{ $json.from }}\n <p>Email: {{ $('Set data').item.json.Email }}</p>\n </div>\n </div>\n\n <table class=\"table\">\n <thead>\n <tr>\n <th>Description</th>\n <th>Unit Price</th>\n <th>Quantity</th>\n <th>Total</th>\n </tr>\n </thead>\n <tbody>\n {{ $json.details }}\n <tr class=\"total\">\n <td colspan=\"3\">Total Amount</td>\n <td>${{ $json.total }}</td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"footer\">\n <p>Thank you for doing business with us!</p>\n <p>If you have any questions regarding this invoice, please contact us at <a href=\"mailto:contact@abccorp.com\">{{ $('Set data').item.json.Email }}</a>.</p>\n <a href=\"mailto:{{ $('Set data').item.json.Email }}\" class=\"btn\">Contact Us</a>\n </div>\n</div>\n\n</body>\n</html>"
},
"credentials": {
"customJsApi": {
"id": "SZkqeEHVYyWhaGem",
"name": "CustomJS account"
}
},
"typeVersion": 1
},
{
"id": "5a8efc8a-c60b-4616-a17a-6275cc326978",
"name": "Vorverarbeitung",
"type": "n8n-nodes-base.code",
"position": [
240,
-20
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "const input = $input.item.json\nconst bill_to = input['Bill To'].split('\\n').map(item => '<p>' + item + '</p>')\nconst from = input['From'].split('\\n').map(item => '<p>' + item + '</p>')\nconst details = input['Details'].map(item => {\n const price = item.price*item.qty\n return `\n <tr>\n <td>${item.description}</td>\n <td>$${item.price}</td>\n <td>${item.qty}</td>\n <td>$${price}</td>\n </tr>\n `\n})\nconst total = input['Details'].reduce((val, next) => {\n\treturn val+next.price*next.qty\n}, 0)\nreturn {\n bill_to: bill_to.join('\\n'),\n from: from.join('\\n'),\n details: details.join('\\n'),\n total\n}"
},
"typeVersion": 2
},
{
"id": "7da4fb46-1f74-44d8-8392-16fc90f23928",
"name": "Daten setzen",
"type": "n8n-nodes-base.set",
"position": [
20,
-20
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "5342001f-a513-46c3-b31f-4590e8514411",
"name": "Invoice No",
"type": "string",
"value": "1"
},
{
"id": "ec357d39-c697-4bb8-8d9d-1bc303352dd0",
"name": "Bill To",
"type": "string",
"value": "John Doe\n1234 Elm St, Apt 567\nCity, Country, 12345"
},
{
"id": "88d6b470-4075-43ec-a684-a4adfd889278",
"name": "From",
"type": "string",
"value": "ABC Corporation\n789 Business Ave\nCity, Country, 67890"
},
{
"id": "061a8020-644a-4cec-bade-3bcd7e15adee",
"name": "Details",
"type": "array",
"value": "[ { \"description\": \"Web Hosting\", \"price\": 150, \"qty\": 2 }, { \"description\": \"Domain\", \"price\": 15, \"qty\": 5 } ]"
},
{
"id": "1c2c6c4b-6aa5-4656-8cae-43ffac71d478",
"name": "Email",
"type": "string",
"value": "support@mycompany.com"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "a6d39cc4-b9c2-4eed-b4a6-46d622a87c14",
"name": "Webhook-Trigger",
"type": "n8n-nodes-base.webhook",
"position": [
-200,
-20
],
"webhookId": "526fd864-6f85-4cde-97aa-39b61a3e5b83",
"parameters": {
"path": "526fd864-6f85-4cde-97aa-39b61a3e5b83",
"options": {},
"responseMode": "responseNode"
},
"typeVersion": 2
},
{
"id": "c7d1cc1d-88e3-463a-886f-182a2ba72b11",
"name": "Auf Webhook-Trigger antworten",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
660,
-20
],
"parameters": {
"options": {},
"respondWith": "binary"
},
"typeVersion": 1.1
}
],
"pinData": {},
"connections": {
"Webhook": {
"main": [
[
{
"node": "7da4fb46-1f74-44d8-8392-16fc90f23928",
"type": "main",
"index": 0
}
]
]
},
"7da4fb46-1f74-44d8-8392-16fc90f23928": {
"main": [
[
{
"node": "5a8efc8a-c60b-4616-a17a-6275cc326978",
"type": "main",
"index": 0
}
]
]
},
"5a8efc8a-c60b-4616-a17a-6275cc326978": {
"main": [
[
{
"node": "de602925-4d9d-4045-9d9d-ed37dfb65490",
"type": "main",
"index": 0
}
]
]
},
"de602925-4d9d-4045-9d9d-ed37dfb65490": {
"main": [
[
{
"node": "Auf Webhook antworten",
"type": "main",
"index": 0
}
]
]
}
}
}Häufig gestellte Fragen
Wie verwende ich diesen Workflow?
Kopieren Sie den obigen JSON-Code, erstellen Sie einen neuen Workflow in Ihrer n8n-Instanz und wählen Sie "Aus JSON importieren". Fügen Sie die Konfiguration ein und passen Sie die Anmeldedaten nach Bedarf an.
Für welche Szenarien ist dieser Workflow geeignet?
Anfänger - Finanzen
Ist es kostenpflichtig?
Dieser Workflow ist völlig kostenlos. Beachten Sie jedoch, dass Drittanbieterdienste (wie OpenAI API), die im Workflow verwendet werden, möglicherweise kostenpflichtig sind.
Verwandte Workflows
Binance SM News & Sentiment Analyst Webhook Tool
Analyse der Kryptowährungsnachrichtenstimmung für beliebige Token mit GPT-4o und Telegram-Benachrichtigungen
Set
Code
Merge
+
Set
Code
Merge
28 NodesDon Jayamaha Jr
Finanzen
Landingpage -> PDF-Formular ausfüllen -> E-Mail
Automatisierte PDF-Formularverarbeitung mit Webformularen und E-Mail-Versand
Set
Html
Webhook
+
Set
Html
Webhook
12 NodesCustomJS
HTML mit CustomJS API in PDF umwandeln und über Webhook zurückgeben
HTML in PDF mit CustomJS API umwandeln und über Webhook zurückgeben
Webhook
Respond To Webhook
Html2 Pdf
Webhook
Respond To Webhook
Html2 Pdf
3 NodesCustomJS
Bausteine
Rechnungen und Belege mit Gmail, OpenAI und Google Drive extrahieren und kategorisieren
Rechnungen und Quittungen aus Gmail extrahieren und klassifizieren mit OpenAI und Google Drive
If
Set
Code
+
If
Set
Code
20 NodesTom
Finanzen
Landing Page -> NDA Word-Dokument (Docx) -> E-Mail
Generieren Sie benutzerdefinierte NDA-Dokumente aus Webformulareinreichungen und senden Sie sie per E-Mail
Set
Html
Webhook
+
Set
Html
Webhook
10 NodesCustomJS
ERPNext KI-Kandidatenvorauswahl-Automatisierung
ERPNext KI-gesteuerte Kandidatenvorauswahl-Automatisierung
If
Set
Code
+
If
Set
Code
39 NodesAmjid Ali
Finanzen
Workflow-Informationen
Schwierigkeitsgrad
Anfänger
Anzahl der Nodes5
Kategorie1
Node-Typen5
Autor
CustomJS
@customjsExterne Links
Auf n8n.io ansehen →
Diesen Workflow teilen