Não consegue criar Modelo de PDF para enviar ao workflow

Nos últimos dias tenho trabalhado nessa automação para escrever e enviar orçamentos completos. Funciona bem quando uso um nó “HTML para PDF”, e consigo enviar um PDF com os dados brutos sem formatação. Mas quando tento formatar os dados em um template, o PDF fica em branco. Tem algo que estou perdendo?

{
  "name": "Quotebot Test",
  "nodes": [
    {
      "parameters": {
        "formTitle": "Solicitar um Orçamento para um Evento",
        "formDescription": "Oi!

Meu nome é Quotebot, seu assistente amigável de orçamentos para todos os eventos que você precisa.

Apenas responda as perguntas abaixo e entraremos em contato em breve",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Qual tipo de evento você está organizando?"
            },
            {
              "fieldLabel": "Quantas pessoas devem comparecer?",
              "fieldType": "number"
            },
            {
              "fieldLabel": "Alguém tem restrições alimentares?"
            },
            {
              "fieldLabel": "Quando seu evento será realizado?",
              "fieldType": "date"
            },
            {
              "fieldLabel": "Qual é seu nome?"
            },
            {
              "fieldLabel": "Qual é seu endereço de email?",
              "fieldType": "email"
            },
            {
              "fieldLabel": "Qual é o nome do evento?"
            },
            {
              "fieldLabel": "Qual é o endereço do local?"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2.5,
      "position": [
        0,
        0
      ],
      "id": "3952eda3-7161-4e51-8a7b-4d6b8de4f5fe",
      "name": "Ao enviar o formulário",
      "webhookId": "b1d72ee1-c693-4b12-90ef-c7329ba90676"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Oi,

Poderia escrever um orçamento completo para {{ $(\"Editar Campos\").item.json[\"Qual é seu nome?\"] }} e enviar para {{ $(\"Editar Campos\").item.json[\"Qual é seu endereço de email?\"] }}?

Detalhes do Cliente:
- Tipo de Evento: {{ $(\"Editar Campos\").item.json[\"Qual tipo de evento você está organizando?\"] }}
- Convidados Esperados: {{ $(\"Editar Campos\").item.json[\"Quantas pessoas devem comparecer?\"] }}
- Restrições Alimentares: {{ $(\"Editar Campos\").item.json[\"Alguém tem restrições alimentares?\"] }}
- Data do Evento: {{ $(\"Editar Campos\").item.json[\"Quando seu evento será realizado?\"] }}
- Nome do Evento: {{ $json['Qual é o nome do evento?'] }}
- Endereço do Local {{ $json['Qual é o endereço do local?'] }}
",
        "options": {
          "systemMessage": "=Você é um Especialista em Orçamentos de Negócios de Catering.

Você tem acesso a um Servidor de Cliente MCP

Preciso que você o use para criar um Orçamento para um cliente e enviar por email

{{ $today }}"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1,
      "position": [
        448,
        0
      ],
      "id": "c1cfee0f-7beb-4fa8-8cf5-703179d8f18e",
      "name": "Agente IA",
      "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": "Modelo de Chat Google Gemini",
      "credentials": {
        "googlePalmApi": {
          "id": "r5K1AFY1c2dmiqsE",
          "name": "Conta da API Google Gemini(PaLM)"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "1fb0c0f2-eff7-4900-9ca9-15950c133260",
              "name": "Qual tipo de evento você está organizando?",
              "value": "={{ $json[\"Qual tipo de evento você está organizando?\"] }}",
              "type": "string"
            },
            {
              "id": "c4171ed1-c773-4dec-9126-57d400eb9bbd",
              "name": "Quantas pessoas devem comparecer?",
              "value": "={{ $json[\"Quantas pessoas devem comparecer?\"] }}",
              "type": "number"
            },
            {
              "id": "feeaa131-f6c7-47d0-b16a-a107e56c5d8d",
              "name": "Alguém tem restrições alimentares?",
              "value": "={{ $json[\"Alguém tem restrições alimentares?\"] }}",
              "type": "string"
            },
            {
              "id": "c5318dd3-dbcc-4a18-ab72-90c2eda07fb2",
              "name": "Quando seu evento será realizado?",
              "value": "={{ $json[\"Quando seu evento será realizado?\"] }}",
              "type": "string"
            },
            {
              "id": "754d4f71-338b-4b3e-ba87-c66852b76799",
              "name": "Qual é seu nome?",
              "value": "={{ $json[\"Qual é seu nome?\"] }}",
              "type": "string"
            },
            {
              "id": "5432c27a-958f-4f76-9fa0-3663ab7b8f19",
              "name": "Qual é seu endereço de email?",
              "value": "={{ $json[\"Qual é seu endereço de email?\"] }}",
              "type": "string"
            },
            {
              "id": "3644948e-b74b-42fe-8456-0261a87e81a2",
              "name": "Qual é o nome do evento?",
              "value": "={{ $json['Qual é o nome do evento?'] }}",
              "type": "string"
            },
            {
              "id": "19d462d9-c51e-421e-8e7e-f900742ffd99",
              "name": "Qual é o endereço do local?",
              "value": "={{ $json['Qual é o endereço do local?'] }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        224,
        0
      ],
      "id": "280e82bc-5e96-462f-a6e6-1b098c4abb13",
      "name": "Editar Campos"
    },
    {
      "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": "Ferramenta Cliente 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": "Editar Campos1"
    },
    {
      "parameters": {
        "sendTo": "barrtimm@gmail.com",
        "subject": "Orçamento do casamento do Job",
        "emailType": "text",
        "message": "=Oi! Aqui está seu orçamento",
        "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": "Enviar uma mensagem",
      "webhookId": "528a735e-f777-4a86-9115-82bab5906ab7",
      "credentials": {
        "gmailOAuth2": {
          "id": "49vocCpyDoaHrQbO",
          "name": "Gmail OAuth2 API"
        }
      }
    },
    {
      "parameters": {
        "templateId": {
          "__rl": true,
          "value": "1649628",
          "mode": "list",
          "cachedResultName": "Orçamento para Job Blob (ID: 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": "Gerar um documento PDF",
      "credentials": {
        "pdfGeneratorApi": {
          "id": "XUfVEGWx0Q45fr5L",
          "name": "Conta do PDF Generator"
        }
      }
    },
    {
      "parameters": {
        "operation": "html",
        "options": {}
      },
      "type": "n8n-nodes-base.convertToFile",
      "typeVersion": 1.1,
      "position": [
        1008,
        0
      ],
      "id": "08cc2559-e2aa-48d0-b6b0-91926cceb952",
      "name": "Converter para Arquivo"
    }
  ],
  "pinData": {
    "Ao enviar o formulário": [
      {
        "json": {
          "Qual tipo de evento você está organizando?": "Casamento",
          "Quantas pessoas devem comparecer?": 69,
          "Alguém tem restrições alimentares?": "Sim, Sue - Alergia a frutos do mar",
          "Quando seu evento será realizado?": "2026-07-10",
          "Qual é seu nome?": "Job Blob",
          "Qual é seu endereço de email?": "barrtimm@gmail.com",
          "Qual é o nome do evento?": "O Magnífico Casamento de Job e Skibidi",
          "Qual é o endereço do local?": "45 Bigham Road BF Idaho 90210",
          "submittedAt": "2026-06-13T15:42:21.955+10:00",
          "formMode": "test"
        },
        "pairedItem": {
          "item": 0
        }
      }
    ]
  },
  "connections": {
    "Ao enviar o formulário": {
      "main": [
        [
          {
            "node": "Editar Campos",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Modelo de Chat Google Gemini": {
      "ai_languageModel": [
        [
          {
            "node": "Agente IA",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Editar Campos": {
      "main": [
        [
          {
            "node": "Agente IA",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Agente IA": {
      "main": [
        [
          {
            "node": "Editar Campos1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Ferramenta Cliente MCP": {
      "ai_tool": [
        [
          {
            "node": "Agente IA",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Editar Campos1": {
      "main": [
        [
          {
            "node": "Converter para Arquivo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gerar um documento PDF": {
      "main": [
        [
          {
            "node": "Enviar uma mensagem",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Converter para Arquivo": {
      "main": [
        [
          {
            "node": "Gerar um documento 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": []
}

Oi @Tim_Barrett

O motivo pelo qual seu PDF está aparecendo em branco é que você está misturando dois métodos diferentes de geração de PDF no seu fluxo de trabalho. Você está tentando usar uma abordagem baseada em template (via a API do PDF Generator), mas está alimentando-a com um Arquivo Binário (via o nó Convert to File) e fornecendo dados JSON inválidos.

Aqui estão os três problemas específicos e como corrigi-los:

  1. O nó Convert to File pega seu texto e o transforma em um arquivo HTML binário. No entanto, o nó PDF Generator API não “converte” um arquivo existente em um template; ele cria um novo arquivo mesclando dados JSON em um template pré-definido.

Ao colocar Convert to File antes do gerador de PDF, você está mudando a entrada de um objeto JSON (que a API precisa) para um objeto binário, o que faz com que a API falhe ao encontrar os dados que precisa para preencher o template.

Solução: Delete o nó Convert to File e conecte Edit Fields1 diretamente a Generate a PDF document.

  1. No seu nó Generate a PDF document, você tem os dados definidos como: ={} {{ $json.output }}

Isso não é um JSON válido. A API do PDF Generator requer um objeto JSON onde as chaves correspondam aos placeholders que você criou no seu dashboard de template do PDF Generator API.

Solução: Altere o campo data para um objeto JSON apropriado. Por exemplo, se seu template tem um placeholder chamado {{quote_content}}, seu campo de dados deve ficar assim:

{
  "quote_content": "{{ $json.output }}"
}
  1. Para que os dados realmente apareçam no PDF, a chave que você usa no n8n deve corresponder exatamente ao nome da variável no seu template (ID: 1649628).
  • Se seu template está em branco: Significa que a API recebeu a requisição, mas não conseguiu encontrar nenhuma chave no seu JSON que correspondesse aos tags {{variable}} no seu design.
  • Recomendação: Verifique seu template no dashboard da PDF Generator API. Se você tem tags como {{client_name}} ou {{total_price}}, você deve fornecê-las especificamente no JSON:
{
  "client_name": "{{ $("Edit Fields").item.json["What's your name?"] }}",
  "quote_content": "{{ $json.output }}"
}
1 curtida

Para este fluxo de cotação, isole se o PDF em branco é um dado de template ou renderização. Antes do nó PDF, adicione um nó Set/Edit Fields que produza apenas um objeto minúsculo cujas chaves correspondam a um espaço reservado de template, por exemplo eventName e guestCount, e execute o nó PDF com isso.

Se o PDF de um campo renderizar, o template está ok e o problema é o formato da saída da IA; analise a saída do agente em campos JSON nomeados antes do nó PDF. Se o teste de um campo ainda estiver em branco, o próximo limite será a id do template ou os nomes dos espaços reservados em vez do fluxo n8n.

Oi Kjooleng

Obrigado pela resposta.

Já tentei seus passos várias vezes, mas continuo recebendo um template em branco. Atualizei as variáveis presentes no meu template para corresponder às minhas planilhas e atualizei os dados para que fossem JSON válido

Saí do template Quote do PDF Generator API para um template em branco que criei na esperança de conseguir organizar os dados. Sei que estou perto, mas só preciso de um passo que está faltando para fazer funcionar.

Tem alguma ideia

1 curtida

@Tim_Barrett

Eu não tenho problema nenhum. Você precisa seguir as instruções com cuidado. Não copie cegamente

Isso deve ajudar

Muito provavelmente a palavra-chave é esta

No meu caso, minha variável de modelo é output. Certifique-se de ajustar a sua adequadamente

1 curtida

@Tim_Barrett , você pode tentar usar o node do PDF API Hub que permite gerar PDF usando um modelo.

Aqui está o link do node verificado: