اتوماسیون تبدیل فایل HTML به PDF با n8n در محیط کاری مدرن.

تبدیل فایل HTML به PDF: راهنمای اتوماسیون ۱۴۰۴

نسخه صوتی این مقاله (هوش مصنوعی کارورا)

تصور کنید یک فاکتور، گزارش یا سند حساس با فرمت HTML دارید و نیازمند تبدیل فایل به PDF تمیز و حرفه‌ای هستید.

اولین واکنش معمولاً جستجو در گوگل است که شما را با ده‌ها ابزار آنلاین مواجه می‌کند؛ اما این مسیر برای یک توسعه‌دهنده یا مدیر فنی جدی، پر از بن‌بست‌های امنیتی و هزینه‌های پنهان است.

اگر پیش‌تر آموزش کامل n8n را مطالعه کرده باشید، می‌دانید که راهکارهای بسیار هوشمندانه‌تری وجود دارد. این مقاله، نقشه فرار شما از ابزارهای محدود و ساخت یک سیستم اتوماسیون شخصی، قدرتمند و تحت کنترل کامل شماست.

کالبدشکافی درد: چرا ابزارهای آنلاین تبدیل فایل، کسب‌وکارها را فلج می‌کنند؟

تبدیل فایل HTML به PDF: راهنمای اتوماسیون ۱۴۰۴

در پروژه‌های واقعی کارورا، ما بارها با چالش تولید PDF از داده‌های داینامیک مواجه شده‌ایم. فرآیند تبدیل فایل با استفاده از ابزارهای شخص ثالث (Third-party) همیشه با مجموعه‌ای از مشکلات تکراری همراه است که در نهایت کنترل را از تیم فنی می‌گیرد:

  • محدودیت‌های فلج‌کننده: ابزارهای رایگان آنلاین تقریباً همیشه با محدودیت‌هایی مثل واترمارک روی خروجی، صف‌های انتظار طولانی، محدودیت حجم فایل یا تعداد تبدیل در روز همراه هستند. این ابزارها برای کارهای جدی و تجاری عملاً غیرقابل استفاده‌اند.
  • هزینه‌های پنهان و غیرقابل پیش‌بینی APIها: راهکار بعدی، استفاده از سرویس‌های API پولی مانند Api2Pdf یا DocRaptor است. در نگاه اول جذاب به نظر می‌رسند، اما با افزایش حجم درخواست‌ها، هزینه API تبدیل فایل به سرعت بالا می‌رود. شما برای هر سند کوچکی که تولید می‌کنید، هزینه‌ای را به یک شرکت دیگر پرداخت می‌کنید.
  • ریسک امنیتی: این بزرگترین و جدی‌ترین مشکل است. وقتی شما یک فاکتور حاوی اطلاعات مشتری، جزئیات مالی یا هر داده حساس دیگری را برای تبدیل در سرور یک شرکت دیگر آپلود می‌کنید، عملاً کنترل امنیت اطلاعات را از دست داده‌اید. بر اساس استانداردهای جهانی حفاظت از داده (مانند GDPR)، این ریسک برای اکثر کسب‌وکارها غیرقابل قبول است.
  • نتیجه نهایی، احساس وابستگی است. به جای ساختن یک سیستم پایدار و مقیاس‌پذیر، کسب‌وکار شما به یک سرویس خارجی وابسته شده که هر لحظه می‌تواند قوانین، قیمت‌ها یا کیفیت خود را تغییر دهد.

    مسیر میان‌بر: این ورک‌فلو را در ۱۰ ثانیه اجرا کنید!

    به جای کپی-پیست کردن تکه‌کدهای مختلف، فایل کامل و تست‌شده‌ی این ورک‌فلو را دانلود کرده و مستقیماً در n8n خودتان Import کنید. بدون خطا، بدون اتلاف وقت.

    دانلود فایل JSON ورک‌فلو →

    دانلود ورک‌فلو: کد JSON آماده برای Import در n8n

    برای صرفه‌جویی در زمان شما، کل ورک‌فلویی که در بالا توضیح داده شد را به صورت یک فایل JSON آماده کرده‌ایم. کافی است این کد را کپی کرده و در محیط n8n خود Import from Clipboard کنید تا کل ساختار، کدها و تنظیمات در کمتر از ۱۰ ثانیه برای شما ایجاد شود.

    نکته فنی مهم: این ورک‌فلو از نود کامیونیتی n8n-nodes-puppeteer استفاده می‌کند. قبل از ایمپورت، مطمئن شوید که این نود را از بخش Settings > Community Nodes نصب کرده‌اید.

    `json
    {
    “name”: “HTML to PDF Invoice Generation”,
    “nodes”: [
    {
    “parameters”: {},
    “name”: “Start”,
    “type”: “n8n-nodes-base.manualTrigger”,
    “typeVersion”: 1,
    “position”: [
    250,
    300
    ]
    },
    {
    “parameters”: {
    “path”: “invoice-generator”,
    “options”: {}
    },
    “name”: “Webhook”,
    “type”: “n8n-nodes-base.webhook”,
    “typeVersion”: 1,
    “position”: [
    450,
    300
    ],
    “webhookId”: “YOUR_WEBHOOK_ID_WILL_BE_GENERATED_HERE”
    },
    {
    “parameters”: {
    “jsCode”: “// دریافت داده‌های ورودی از نود قبلی\nconst invoiceData = $json.body;\n\n// محاسبه مجموع کل\nconst totalAmount = invoiceData.items.reduce((sum, item) => sum + (item.quantity * item.price), 0);\n\n// ساخت ردیف‌های جدول برای آیتم‌های فاکتور\nlet itemsHtml = ”;\nfor (const item of invoiceData.items) {\n itemsHtml += \n \n

    ${item.description}

    \n

    ${item.quantity}

    \n

    ${new Intl.NumberFormat('fa-IR').format(item.price)}

    \n

    ${new Intl.NumberFormat('fa-IR').format(item.quantity * item.price)}

    \n

    \n ;\n}\n\n// قالب کامل HTML فاکتور\nconst htmlContent = \n\n\n \n

    \n\n\n

    \n

    \n

    \n

    فاکتور فروش

    \n شماره فاکتور: ${invoiceData.invoiceId}
    \n تاریخ صدور: ${invoiceData.issueDate}
    \n سررسید: ${invoiceData.dueDate}\n

    \n

    \n برای:
    \n ${invoiceData.customerName}\n

    \n

    \n

    \n

    \n

    \n

    \n

    \n

    \n

    \n

    \n

    \n

    \n ${itemsHtml}\n

    \n

    شرح خدمات/کالا تعداد قیمت واحد (تومان) مبلغ کل (تومان)

    \n

    \n مبلغ کل قابل پرداخت: ${new Intl.NumberFormat('fa-IR').format(totalAmount)} تومان\n

    \n

    تبدیل فایل HTML به PDF: راهنمای اتوماسیون ۱۴۰۴

    \n\n\n;\n\n// برگرداندن HTML به عنوان خروجی نود\nreturn {\n json: {\n …invoiceData, // تمام داده‌های اصلی را هم منتقل می‌کنیم\n htmlForPdf: htmlContent,\n fileName: Invoice-${invoiceData.invoiceId}.pdf\n }\n};\n”
    },
    “name”: “Prepare Invoice HTML”,
    “type”: “n8n-nodes-base.code”,
    “typeVersion”: 1,
    “position”: [
    680,
    300
    ]
    },
    {
    “parameters”: {
    “html”: “={{$json.htmlForPdf}}”,
    “options”: {
    “format”: “A4”,
    “margin”: {
    “top”: “2cm”,
    “right”: “2cm”,
    “bottom”: “2cm”,
    “left”: “2cm”
    },
    “printBackground”: true
    }
    },
    “name”: “Puppeteer”,
    “type”: “n8n-nodes-puppeteer.puppeteer”,
    “typeVersion”: 1,
    “position”: [
    910,
    300
    ]
    },
    {
    “parameters”: {
    “to”: “={{ $(‘Webhook’).item.json.body.customerEmail }}”,
    “subject”: “=فاکتور جدید از شرکت شما – شماره {{ $json.invoiceId }}”,
    “html”: “با سلام،
    فاکتور شما به شماره {{ $json.invoiceId }} به پیوست ارسال می‌گردد.

    با تشکر.”,
    “attachments”: “data”,
    “options”: {
    “attachments”: [
    {
    “name”: “={{$json.fileName}}”
    }
    ]
    }
    },
    “name”: “Send Email”,
    “type”: “n8n-nodes-base.sendEmail”,
    “typeVersion”: 1,
    “position”: [
    1140,
    300
    ],
    “credentials”: {
    “smtp”: {
    “id”: “YOUR_CREDENTIAL_ID”,
    “name”: “YOUR_CREDENTIAL_NAME”
    }
    }
    }
    ],
    “connections”: {
    “Webhook”: {
    “main”: [
    [
    {
    “node”: “Prepare Invoice HTML”,
    “type”: “main”,
    “index”: 0
    }
    ]
    ]
    },
    “Prepare Invoice HTML”: {
    “main”: [
    [
    {
    “node”: “Puppeteer”,
    “type”: “main”,
    “index”: 0
    }
    ]
    ]
    },
    “Puppeteer”: {
    “main”: [
    [
    {
    “node”: “Send Email”,
    “type”: “main”,
    “index”: 0
    }
    ]
    ]
    }
    }
    }
    `

    با این سیستم، شما یک ماشین تبدیل فایل اختصاصی ساخته‌اید که نه تنها هزینه‌ها را به حداقل می‌رساند، بلکه امنیت داده‌های مالی مشتریان را تضمین می‌کند. اکنون می‌توانید بدون نگرانی از محدودیت‌های سرویس‌های خارجی، روی توسعه کسب‌وکارتان تمرکز کنید.

    راه‌حل نهایی در ۱۴۰۴: ساخت سیستم تبدیل فایل شخصی با n8n

    اینجاست که n8n وارد میدان می‌شود. n8n یک ابزار اتوماسیون ورک‌فلو متن‌باز و Self-Hosted است. این یعنی شما آن را روی سرورهای خودتان (ترجیحاً با داکر) نصب می‌کنید و کنترل کامل بر روی داده‌ها و فرآیندهای خود دارید.

    n8n جایگزین قدرتمندی برای ابزارهایی مثل Zapier است، با این تفاوت که به شما اجازه می‌دهد تا منطق‌های پیچیده‌تر و فنی‌تری را پیاده‌سازی کنید، بدون اینکه نگران هزینه‌های گزاف یا محدودیت‌های امنیتی باشید.

    در این راهنما، ما یک ورک‌فلوی کامل و کاربردی خواهیم ساخت که:
    1. از طریق یک Webhook، داده‌های لازم (مثلاً اطلاعات فاکتور) را در قالب JSON دریافت می‌کند.
    2. این داده‌ها را در یک قالب HTML استاندارد تزریق می‌کند تا ساختار سند شکل بگیرد.
    3. با استفاده از یک مرورگر Headless (با کمک نود کامیونیتی Puppeteer)، عملیات تبدیل فایل HTML به PDF باکیفیت را انجام می‌دهد.
    4. فایل PDF تولید شده را به یک ایمیل ضمیمه کرده و برای مقصد مورد نظر ارسال می‌کند.

    این سیستم کاملاً تحت کنترل شماست و داده‌های حساس شما هرگز از زیرساخت شما خارج نمی‌شوند.

    تبدیل فایل HTML به PDF: راهنمای اتوماسیون ۱۴۰۴

    معماری ورک‌فلو: دیاگرام کامل تبدیل HTML به PDF و ارسال فاکتور

    قبل از ورود به جزئیات فنی، اجازه دهید نگاهی به معماری کلی سیستم بیندازیم. درک جریان داده از ابتدا تا انتها، ساخت و عیب‌یابی ورک‌فلو را بسیار ساده‌تر می‌کند.

    `mermaid
    graph TD
    A[Webhook Trigger] –> B{دریافت داده‌های فاکتور (JSON)};
    B –> C[Code Node];
    C — تزریق داده‌ها در قالب HTML –> D[تولید کد HTML داینامیک];
    D –> E[Puppeteer Node];
    E — رندر کردن HTML در مرورگر Headless –> F{تولید فایل PDF باینری};
    F –> G[Send Email Node];
    G — ضمیمه کردن فایل PDF –> H[ارسال ایمیل به مشتری];
    `
    تشریح مراحل:

    1. Webhook Trigger: نقطه شروع ورک‌فلو. این نود یک URL منحصربه‌فرد ایجاد می‌کند که منتظر دریافت درخواست‌های POST حاوی داده‌های فاکتور می‌ماند.
    2. Code Node: مغز متفکر ورک‌فلو. این نود کد جاوا اسکریپت را اجرا می‌کند تا داده‌های JSON را به یک سند HTML کامل تبدیل کند. (در نسخه‌های قدیمی n8n به آن Function می‌گفتند، اما در نسخه جدید از نود استاندارد Code استفاده می‌کنیم).
    3. Puppeteer Node: موتور تبدیل. این نود (که باید از بخش Community Nodes نصب شود)، HTML ما را باز می‌کند و از آن یک خروجی PDF با تنظیمات دقیق می‌گیرد. خروجی این نود، داده باینری فایل PDF است.
    4. Send Email Node: مسئول تحویل نهایی. این نود به سرور SMTP شما متصل شده، داده باینری PDF را به عنوان ضمیمه ارسال می‌کند.

    آموزش گام‌به‌گام: ساخت ورک‌فلو تبدیل فایل (همراه با کد)

    حالا وارد بخش عملیاتی می‌شویم. ورک‌فلوی خود را در n8n باز کرده و این مراحل را به دقت دنبال کنید.

    قدم اول: راه‌اندازی تریگر Webhook

    اولین نود ما، نقطه ورود داده‌ها به سیستم است.

    1. یک نود Webhook به صفحه کاری خود اضافه کنید.
    2. n8n به طور خودکار یک Test URL و یک Production URL برای شما ایجاد می‌کند. فعلاً از Test URL استفاده می‌کنیم.
    3. این URL را کپی کنید.
    4. برای ارسال داده تستی، از ابزاری مانند Postman یا curl در ترمینال خود استفاده کنید و یک درخواست POST با بدنه JSON به URL کپی شده ارسال کنید.

    ⚠️ نکته امنیتی: در محیط عملیاتی (Production)، حتماً در تنظیمات Webhook گزینه Authentication را فعال کنید تا هر کسی نتواند به اندپوینت شما درخواست بفرستد.

    نمونه درخواست curl:

    `bash
    curl -X POST \
    -H “Content-Type: application/json” \
    -d ‘{
    “customerName”: “شرکت کارورا”,
    “invoiceId”: “INV-1404-001”,
    “issueDate”: “۱۴۰۴/۰۵/۱۰”,
    “dueDate”: “۱۴۰۴/۰۶/۱۰”,
    “items”: [
    { “description”: “مشاوره معماری فنی”, “quantity”: 10, “price”: 500000 },
    { “description”: “پیاده‌سازی ورک‌فلو n8n”, “quantity”: 1, “price”: 2500000 }
    ],
    “totalAmount”: 7500000,
    “customerEmail”: “finance@example.com”
    }’ \
    [YOUR_WEBHOOK_TEST_URL]
    `

    بعد از ارسال درخواست، روی دکمه Fetch test event در نود Webhook کلیک کنید تا n8n داده‌های دریافتی را شناسایی کند.

    قدم دوم: آماده‌سازی HTML با Code Node

    اینجا ساختار سند PDF را با HTML و CSS تعریف می‌کنیم و داده‌های داینامیک را در آن قرار می‌دهیم.

    1. یک نود Code به ورک‌فلو اضافه کرده و آن را به خروجی نود Webhook متصل کنید.
    2. کد جاوا اسکریپت زیر را به طور کامل در این نود کپی کنید.

    کد جاوا اسکریپت برای Code Node:

    `javascript
    // دریافت داده‌های ورودی
    const invoiceData = $json.body;

    // محاسبه مجموع کل
    const totalAmount = invoiceData.items.reduce((sum, item) => sum + (item.quantity * item.price), 0);

    // ساخت ردیف‌های جدول برای آیتم‌های فاکتور
    let itemsHtml = ”;
    for (const item of invoiceData.items) {
    itemsHtml += ` ${item.description} ${item.quantity} ${new Intl.NumberFormat(‘fa-IR’).format(item.price)} ${new Intl.NumberFormat(‘fa-IR’).format(item.quantity * item.price)}

    `;
    }

    // قالب کامل HTML فاکتور
    const htmlContent = `



    فاکتور فروش

    شماره فاکتور: ${invoiceData.invoiceId}
    تاریخ صدور: ${invoiceData.issueDate}
    سررسید: ${invoiceData.dueDate}

    برای:
    ${invoiceData.customerName}

    ${itemsHtml}
    شرح خدمات/کالا تعداد قیمت واحد (تومان) مبلغ کل (تومان)
    مبلغ کل قابل پرداخت: ${new Intl.NumberFormat(‘fa-IR’).format(totalAmount)} تومان



    `;

    // برگرداندن HTML به عنوان خروجی نود
    return {
    json: {
    …invoiceData, // تمام داده‌های اصلی را هم منتقل می‌کنیم
    htmlForPdf: htmlContent,
    fileName: Invoice-${invoiceData.invoiceId}.pdf
    }
    };
    `
    این کد، داده‌های JSON را به یک سند HTML کامل و استایل‌دهی شده تبدیل می‌کند.

    قدم سوم: جادوی تبدیل با نود Puppeteer

    این نود از کتابخانه Puppeteer استفاده می‌کند تا HTML شما را به یک PDF بی‌نقص تبدیل کند. از آنجا که این نود در هسته اصلی n8n نیست، باید آن را از طریق منوی Settings > Community Nodes با نام n8n-nodes-puppeteer نصب کنید.

    1. نود Puppeteer را اضافه کرده و به خروجی Code Node متصل کنید.
    2. تنظیمات زیر را در این نود اعمال کنید:

  • Operation: HTML to PDF
  • HTML: با استفاده از Expression، خروجی نود قبلی را بخوانید: {{ $json.htmlForPdf }}
  • Property Name: نام پیش‌فرض data مناسب است.
  • Options: تنظیمات PDF را شخصی‌سازی کنید:
  • Format: A4
  • Margin > Top/Right/Bottom/Left: 2cm
  • Print Background: On (برای چاپ شدن رنگ‌های پس‌زمینه)
  • پس از اجرای این نود، یک خروجی جدید از نوع Binary به جریان داده اضافه می‌شود که حاوی محتوای فایل PDF است.

    قدم چهارم (پیشرفته): ارسال خودکار فاکتور PDF

    مرحله نهایی، ارسال ایمیل حاوی فاکتور PDF با استفاده از نود Send Email است.

    1. یک نود Send Email به ورک‌فلو اضافه کرده و آن را به خروجی نود Puppeteer متصل کنید.
    2. اطلاعات اتصال به سرور ایمیل (Credential) خود را در n8n ثبت کنید.
    3. تنظیمات نود را تکمیل کنید:

  • To: {{ $('Webhook').item.json.body.customerEmail }}
  • Subject: فاکتور جدید از شرکت شما - شماره {{ $json.invoiceId }}
  • HTML: متن ایمیل خود را بنویسید.
  • 4. مهم‌ترین بخش (ضمیمه کردن فایل):

  • در بخش Attachments، در فیلد Property Name، نام خروجی باینری نود Puppeteer (که data است) را وارد کنید.
  • برای نام فایل ضمیمه از Expression استفاده کنید: {{ $json.fileName }}
  • ورک‌فلوی شما اکنون کامل است. آن را Active کنید و یک سیستم تمام خودکار برای تولید و ارسال فاکتورهای PDF در اختیار دارید.

    یک سیستم اتوماسیون اختصاصی برای کسب‌وکار شما؟

    این ورک‌فلو فقط یک نمونه کوچک از قدرت اتوماسیون است. اگر می‌خواهید فرآیندهای پیچیده‌تر کسب‌وکارتان را بهینه کنید اما نمی‌دانید از کجا شروع کنید، بیایید ۱۵ دقیقه رایگان صحبت کنیم. بدون تعهد، فقط مشاوره خالص.

    رزرو جلسه استراتژی رایگان →

    نوشته های مرتبط