لا يمكن إنشاء نموذج PDF لإرساله إلى سير العمل

لقد كنت أعمل على هذا الأتمتة لكتابة وإرسال عروض الأسعار الكاملة خلال الأيام القليلة الماضية. يعمل بشكل جيد عند استخدام عقدة “HTML to PDF”، وأتمكن من إرسال ملف PDF يحتوي على البيانات الخام غير المنسقة. لكن عندما أحاول تنسيق البيانات في قالب، يظهر ملف PDF فارغًا. هل هناك شيء ما أنني أفتقده؟

{
  "name": "Quotebot Test",
  "nodes": [
    {
      "parameters": {
        "formTitle": "احصل على عرض سعر لدالة",
        "formDescription": "مرحبا!\n\nاسمي كويتبوت، مساعدك الودود لتقديم عروس الأسعار لكل دالة تحتاجها.\n\nما عليك سوى الإجابة على الأسئلة أدناه، وسنعود إليك في أسرع وقت ممكن",
        "formFields": {
          "values": [
            {
              "fieldLabel": "ما نوع الحدث الذي تستضيفه؟"
            },
            {
              "fieldLabel": "كم عدد الأشخاص المتوقع حضورهم؟",
              "fieldType": "number"
            },
            {
              "fieldLabel": "هل لأي من الضيوف متطلبات غذائية خاصة؟"
            },
            {
              "fieldLabel": "متى سيُقام حدثك؟",
              "fieldType": "date"
            },
            {
              "fieldLabel": "ما اسمك؟"
            },
            {
              "fieldLabel": "ما عنوان بريدك الإلكتروني؟",
              "fieldType": "email"
            },
            {
              "fieldLabel": "ما اسم الحدث؟"
            },
            {
              "fieldLabel": "ما عنوان المكان؟"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2.5,
      "position": [
        0,
        0
      ],
      "id": "3952eda3-7161-4e51-8a7b-4d6b8de4f5fe",
      "name": "عند تقديم النموذج",
      "webhookId": "b1d72ee1-c693-4b12-90ef-c7329ba90676"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=مرحبا\n\nهل يمكنك من فضلك كتابة عرض سعر كامل لـ {{ $(\'تحرير الحقول\').item.json[\"ما اسمك؟\"] }} وإرساله إلى {{ $(\'تحرير الحقول\').item.json[\"ما عنوان بريدك الإلكتروني؟\"] }}؟\n\nتفاصيل العميل:\n- نوع الحدث: {{ $(\'تحرير الحقول\').item.json[\"ما نوع الحدث الذي تستضيفه؟\"] }}\n- عدد الضيوف المتوقع: {{ $(\'تحرير الحقول\').item.json[\"كم عدد الأشخاص المتوقع حضورهم؟\"] }}\n- المتطلبات الغذائية: {{ $(\'تحرير الحقول\').item.json[\"هل لأي من الضيوف متطلبات غذائية خاصة؟\"] }}\n- تاريخ الحدث: {{ $(\'تحرير الحقول\').item.json[\"متى سيُقام حدثك؟\"] }}\n- اسم الحدث: {{ $json[\'ما اسم الحدث؟\'] }}\n- عنوان المكان {{ $json[\'ما عنوان المكان؟\'] }}\n\n",
        "options": {
          "systemMessage": "=أنت خبير في تقديم عروس الأسعار لأعمال الخدمات الغذائية.\n\nلديك حق الوصول إلى خادم MCP\n\nأحتاج منك استخدامه لإنشاء عرض سعر للعميل وإرساله كبريد إلكتروني\n\n{{ $today }}"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1,
      "position": [
        448,
        0
      ],
      "id": "c1cfee0f-7beb-4fa8-8cf5-703179d8f18e",
      "name": "وكيل ذكي",
      "alwaysOutputData": true,
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "modelName": "models/gemini-2.5-flash-lite",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "typeVersion": 1.1,
      "position": [
        464,
        224
      ],
      "id": "ec607c7c-91eb-4efc-b662-ddb1cb712638",
      "name": "نموذج محادثة Google Gemini",
      "credentials": {
        "googlePalmApi": {
          "id": "r5K1AFY1c2dmiqsE",
          "name": "حساب واجهة برمجية Google Gemini(PaLM)"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "1fb0c0f2-eff7-4900-9ca9-15950c133260",
              "name": "ما نوع الحدث الذي تستضيفه؟",
              "value": "={{ $json[\"ما نوع الحدث الذي تستضيفه؟\"] }}",
              "type": "string"
            },
            {
              "id": "c4171ed1-c773-4dec-9126-57d400eb9bbd",
              "name": "كم عدد الأشخاص المتوقع حضورهم؟",
              "value": "={{ $json[\"كم عدد الأشخاص المتوقع حضورهم؟\"] }}",
              "type": "number"
            },
            {
              "id": "feeaa131-f6c7-47d0-b16a-a107e56c5d8d",
              "name": "هل لأي من الضيوف متطلبات غذائية خاصة؟",
              "value": "={{ $json[\"هل لأي من الضيوف متطلبات غذائية خاصة؟\"] }}",
              "type": "string"
            },
            {
              "id": "c5318dd3-dbcc-4a18-ab72-90c2eda07fb2",
              "name": "متى سيُقام حدثك؟",
              "value": "={{ $json[\"متى سيُقام حدثك؟\"] }}",
              "type": "string"
            },
            {
              "id": "754d4f71-338b-4b3e-ba87-c66852b76799",
              "name": "ما اسمك؟",
              "value": "={{ $json[\"ما اسمك؟\"] }}",
              "type": "string"
            },
            {
              "id": "5432c27a-958f-4f76-9fa0-3663ab7b8f19",
              "name": "ما عنوان بريدك الإلكتروني؟",
              "value": "={{ $json[\"ما عنوان بريدك الإلكتروني؟\"] }}",
              "type": "string"
            },
            {
              "id": "3644948e-b74b-42fe-8456-0261a87e81a2",
              "name": "ما اسم الحدث؟",
              "value": "={{ $json[\'ما اسم الحدث؟\'] }}",
              "type": "string"
            },
            {
              "id": "19d462d9-c51e-421e-8e7e-f900742ffd99",
              "name": "ما عنوان المكان؟",
              "value": "={{ $json[\'ما عنوان المكان؟\'] }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        224,
        0
      ],
      "id": "280e82bc-5e96-462f-a6e6-1b098c4abb13",
      "name": "تحرير الحقول"
    },
    {
      "parameters": {
        "endpointUrl": "https://timb.app.n8n.cloud/mcp/8d44ab8f-e11c-492a-9b68-b3fbafec81f5",
        "include": "selected",
        "includeTools": [
          "furniture_Rentals",
          "Payment",
          "Additional_Service",
          "Pricing",
          "Menu_Drinks",
          "Staffing",
          "Venue_Logistics",
          "Ingredients"
        ],
        "options": {}
      },
      "id": "a3b8b192-853d-41cd-9b2b-25042b97fcd1",
      "name": "أداة عميل MCP",
      "type": "@n8n/n8n-nodes-langchain.mcpClientTool",
      "typeVersion": 1.3,
      "position": [
        592,
        224
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "acf6fc3f-89fd-4c14-865f-c9bb597e4b62",
              "name": "output",
              "value": "={{ $json.output }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        800,
        0
      ],
      "id": "2986a9df-0a76-4555-9a3a-d17e31016a1f",
      "name": "تحرير الحقول1"
    },
    {
      "parameters": {
        "sendTo": "barrtimm@gmail.com",
        "subject": "عرض سعر زفاف جوب",
        "emailType": "text",
        "message": "=مرحبا، إليك عرض السعر الخاص بك",
        "options": {
          "appendAttribution": false,
          "attachmentsUi": {
            "attachmentsBinary": [
              {
                "property": "={{ $json.filename }}"
              }
            ]
          }
        }
      },
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.2,
      "position": [
        1472,
        0
      ],
      "id": "a1706ee8-ab20-49cd-a0f2-9e321f17de49",
      "name": "إرسال رسالة",
      "webhookId": "528a735e-f777-4a86-9115-82bab5906ab7",
      "credentials": {
        "gmailOAuth2": {
          "id": "49vocCpyDoaHrQbO",
          "name": "واجهة برمجية Gmail OAuth2"
        }
      }
    },
    {
      "parameters": {
        "templateId": {
          "__rl": true,
          "value": "1649628",
          "mode": "list",
          "cachedResultName": "عرض سعر لجوب (المعرف: 1649628)"
        },
        "data": "={} {{ $json.output }}",
        "documentOutput": "file",
        "additionalFields": {}
      },
      "type": "@pdfgeneratorapi/n8n-nodes-pdf-generator-api.pdfGeneratorApi",
      "typeVersion": 1,
      "position": [
        1216,
        0
      ],
      "id": "13fc3d18-3cad-4d2a-8c0d-e864700bde13",
      "name": "إنشاء مستند PDF",
      "credentials": {
        "pdfGeneratorApi": {
          "id": "XUfVEGWx0Q45fr5L",
          "name": "حساب مولد PDF"
        }
      }
    },
    {
      "parameters": {
        "operation": "html",
        "options": {}
      },
      "type": "n8n-nodes-base.convertToFile",
      "typeVersion": 1.1,
      "position": [
        1008,
        0
      ],
      "id": "08cc2559-e2aa-48d0-b6b0-91926cceb952",
      "name": "تحويل إلى ملف"
    }
  ],
  "pinData": {
    "عند تقديم النموذج": [
      {
        "json": {
          "ما نوع الحدث الذي تستضيفه؟": "زفاف",
          "كم عدد الأشخاص المتوقع حضورهم؟": 69,
          "هل لأي من الضيوف متطلبات غذائية خاصة؟": "نعم سو - حساسية من المحار",
          "متى سيُقام حدثك؟": "2026-07-10",
          "ما اسمك؟": "جوب بلوب",
          "ما عنوان بريدك الإلكتروني؟": "barrtimm@gmail.com",
          "ما اسم الحدث؟": "زفاف جوب وسكيبيدي الرائع",
          "ما عنوان المكان؟": "45 شارع بيغهام، آيداهو، 90210",
          "submittedAt": "2026-06-13T15:42:21.955+10:00",
          "formMode": "test"
        },
        "pairedItem": {
          "item": 0
        }
      }
    ]
  },
  "connections": {
    "عند تقديم النموذج": {
      "main": [
        [
          {
            "node": "تحرير الحقول",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "نموذج محادثة Google Gemini": {
      "ai_languageModel": [
        [
          {
            "node": "وكيل ذكي",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "تحرير الحقول": {
      "main": [
        [
          {
            "node": "وكيل ذكي",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "وكيل ذكي": {
      "main": [
        [
          {
            "node": "تحرير الحقول1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "أداة عميل MCP": {
      "ai_tool": [
        [
          {
            "node": "وكيل ذكي",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "تحرير الحقول1": {
      "main": [
        [
          {
            "node": "تحويل إلى ملف",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "إنشاء مستند PDF": {
      "main": [
        [
          {
            "node": "إرسال رسالة",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "تحويل إلى ملف": {
      "main": [
        [
          {
            "node": "إنشاء مستند PDF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate",
    "availableInMCP": true
  },
  "versionId": "97d94403-187f-4bb8-8379-7a4ea228a92d",
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "845031bfdb8f607d8c7ae907fb5de28c6fb4d0a8d0cd06c1a605d7c42f4018a9"
  },
  "nodeGroups": [],
  "id": "X1Nh0TGGqYWSVImo",
  "tags": []
}

مرحباً @Tim_Barrett

السبب في ظهور ملف PDF الخاص بك فارغاً هو أنك تمزج بين طريقتين مختلفتين لإنشاء ملفات PDF في سير العمل الخاص بك. أنت تحاول استخدام نهج قائم على القالب (عبر واجهة برمجة تطبيقات مولد PDF)، لكنك تزوده بـ ملف ثنائي (عبر عقدة تحويل إلى ملف) وتقدم بيانات JSON غير صحيحة.

فيما يلي المسائل الثلاث المحددة وكيفية إصلاحها:

  1. عقدة Convert to File تأخذ النص الخاص بك وتحوله إلى ملف HTML ثنائي. ومع ذلك، عقدة واجهة برمجة تطبيقات مولد PDF لا تقوم بـ “تحويل” ملف موجود إلى قالب؛ بل تقوم بـ إنشاء ملف جديد بدمج بيانات JSON في قالب محدد مسبقاً.

بوضع Convert to File قبل مولد PDF، أنت تغير المدخلات من كائن JSON (وهو ما تحتاجه الواجهة البرمجية) إلى كائن ثنائي، مما يتسبب في فشل الواجهة البرمجية في العثور على البيانات التي تحتاجها لملء القالب.

الحل: احذف عقدة Convert to File وربط Edit Fields1 مباشرة بـ Generate a PDF document.

  1. في عقدة Generate a PDF document الخاصة بك، لديك البيانات مضبوطة كـ: ={} {{ $json.output }}

هذا ليس JSON صحيحاً. تتطلب واجهة برمجة تطبيقات مولد PDF كائن JSON حيث تطابق المفاتيح العناصر النائبة التي أنشأتها في لوحة تحكم قالب واجهة برمجة تطبيقات مولد PDF.

الحل: غيّر حقل data إلى كائن JSON صحيح. على سبيل المثال، إذا كان قالبك يحتوي على عنصر نائب يسمى {{quote_content}}، يجب أن يبدو حقل البيانات الخاص بك كما يلي:

{
  "quote_content": "{{ $json.output }}"
}
  1. لكي تظهر البيانات فعلياً على ملف PDF، يجب أن يطابق المفتاح الذي تستخدمه في n8n اسم المتغير في قالبك بالضبط (ID: 1649628).
  • إذا كان قالبك فارغاً: هذا يعني أن الواجهة البرمجية استقبلت الطلب، لكن لم تتمكن من العثور على أي مفاتيح في JSON الخاص بك تطابق علامات {{variable}} في التصميم الخاص بك.
  • التوصية: تحقق من قالبك في لوحة تحكم واجهة برمجة تطبيقات مولد PDF. إذا كان لديك علامات مثل {{client_name}} أو {{total_price}}، يجب عليك توفيرها بشكل محدد في JSON:
{
  "client_name": "{{ $("Edit Fields").item.json["ما اسمك؟"] }}",
  "quote_content": "{{ $json.output }}"
}
إعجاب واحد (1)

بخصوص هذا تدفق عرض الأسعار، حدد ما إذا كان ملف PDF الفارغ بيانات قالب أم عملية عرض. قبل عقدة PDF، أضف عقدة Set/Edit Fields واحدة تُخرج كائن صغير جداً مفاتيحه تطابق عنصر نائب واحد في القالب، على سبيل المثال eventName و guestCount، ثم شغّل عقدة PDF بذلك.

إذا عرض ملف PDF ذو الحقل الواحد بشكل صحيح، فالقالب صحيح والمشكلة تكون في شكل مخرجات الذكاء الاصطناعي؛ حلّل مخرجات الوكيل إلى حقول JSON مسماة قبل عقدة PDF. إذا كان الاختبار أحادي الحقل لا يزال فارغاً، فإن الحد التالي هو معرّف القالب أو أسماء العناصر النائبة وليس تدفق n8n.

مرحبًا Kjooleng

شكرًا على الرد.

لقد حاولت خطواتك عدة مرات، لكنني لا أزال أحصل على قالب فارغ. لقد حدثت المتغيرات الموجودة في قالبي لتتطابق مع جداول البيانات الخاصة بي، وحدثت البيانات لتكون JSON صحيحة.

انتقلت من استخدام قالب الاقتباس من PDF Generator API إلى قالب فارغ أنشأته على أمل تنظيم البيانات. أعلم أنني قريب جدًا، لكنني أحتاج إلى خطوة واحدة مفقودة فقط لجعلها تعمل.

هل لديك أي أفكار

إعجاب واحد (1)

@Tim_Barrett

ليس لدي أي مشكلة. عليك اتباع التعليمات بعناية. لا تنسخ بشكل أعمى

هذا يجب أن يساعدك

على الأرجح الكلمة الرئيسية هي هذه

في حالتي، متغير القالب الخاص بي هو output. تأكد من تعديل متغيرك وفقاً لذلك

إعجاب واحد (1)

@Tim_Barrett ، يمكنك محاولة استخدام عقدة من PDF API Hub التي تسمح بإنشاء ملف PDF باستخدام قالب.

إليك رابط العقدة المُتحقق منه: