JSON Stringify no puede enviar datos a PDF

Estoy creando un flujo de trabajo que envía datos de un agente de IA para generar un archivo PDF usando el nodo ‘PDF Generator API’.

He usado este comando en el campo ‘data’ del nodo en dos flujos de trabajo anteriores con la misma función exacta, y funcionó perfectamente:

{{ JSON.stringify({ post_event_report: $json.output }) }}

Pero aquí, está generando un PDF en blanco. Ya he incluido la variable en la plantilla del Generador de PDF como lo hice para los flujos de trabajo anteriores, así que no tengo idea de por qué de repente está generando un PDF en blanco.

¿Alguna idea?

{
“nodes”: [
{
“parameters”: {},
“type”: “n8n-nodes-base.manualTrigger”,
“typeVersion”: 1,
“position”: [
0,
0
],
“id”: “27e200f4-843d-4d50-b42c-0b8a26f7291b”,
“name”: “Al hacer clic en ‘Ejecutar flujo de trabajo’”
},
{
“parameters”: {
“documentId”: {
“__rl”: true,
“value”: “1DSaJKyI1eCp6WZJ8X1aAa6jg7fvOOS5vJFKUmar7quA”,
“mode”: “list”,
“cachedResultName”: “Post Event Reporting”,
“cachedResultUrl”: “https://docs.google.com/spreadsheets/d/1DSaJKyI1eCp6WZJ8X1aAa6jg7fvOOS5vJFKUmar7quA/edit?usp=drivesdk”
},
“sheetName”: {
“__rl”: true,
“value”: “gid=0”,
“mode”: “list”,
“cachedResultName”: “Sheet1”,
“cachedResultUrl”: “https://docs.google.com/spreadsheets/d/1DSaJKyI1eCp6WZJ8X1aAa6jg7fvOOS5vJFKUmar7quA/edit#gid=0”
},
“options”: {}
},
“type”: “n8n-nodes-base.googleSheets”,
“typeVersion”: 4.7,
“position”: [
224,
0
],
“id”: “3b86eb78-0869-40c3-9bcf-1ad77f80cf74”,
“name”: “Obtener fila(s) en la hoja”,
“credentials”: {
“googleSheetsOAuth2Api”: {
“id”: “wV1Zw6McyxYXrk8t”,
“name”: “Cuenta de Google Sheets”
}
}
},
{
“parameters”: {
“promptType”: “define”,
“text”: “= Obtener {{ $json.Feedback }} para {{ $json["Event Name"] }} {{ $json.Date }} {{ $json.Location }} {{ $json[‘No. of Guests’] }}”,
“options”: {
“systemMessage”: “=Eres un especialista en Informes Posteriores a Eventos trabajando con una Pequeña Empresa de Catering con más de 30 años de experiencia en la industria. Tu rol es analizar la hoja de cálculo y generar áreas de mejora basadas en el {{ $json.Feedback }} proporcionado. Compila todos los datos en un informe posterior al evento completo”
}
},
“type”: “@n8n/n8n-nodes-langchain.agent”,
“typeVersion”: 3.1,
“position”: [
448,
0
],
“id”: “1cebd084-c6fa-4477-b507-96bffc2a3733”,
“name”: “Agente de IA”
},
{
“parameters”: {
“templateId”: {
“__rl”: true,
“value”: “1655316”,
“mode”: “list”,
“cachedResultName”: “Post-Event Report (ID: 1655316)”
},
“data”: “={{ JSON.stringify({ post_event_report: $json.output }) }}”,
“documentOutput”: “viewer”,
“additionalFields”: {
“outputName”: “=Informe posterior al evento para {{ $(‘Obtener fila(s) en la hoja’).item.json["Event Name"] }} el {{ $(‘Obtener fila(s) en la hoja’).item.json.Date }}”,
“testing”: false
}
},
“type”: “@pdfgeneratorapi/n8n-nodes-pdf-generator-api.pdfGeneratorApi”,
“typeVersion”: 1,
“position”: [
800,
0
],
“id”: “4304c3b8-5210-4b2d-8d6d-49eac03b03a6”,
“name”: “Generar un documento PDF”,
“alwaysOutputData”: true,
“credentials”: {
“pdfGeneratorApi”: {
“id”: “XUfVEGWx0Q45fr5L”,
“name”: “Cuenta de PDF Generator”
}
}
},
{
“parameters”: {
“options”: {}
},
“type”: “@n8n/n8n-nodes-langchain.lmChatGoogleGemini”,
“typeVersion”: 1.1,
“position”: [
320,
208
],
“id”: “630d55ef-1a19-4f5a-bad5-a14c85c8fb4d”,
“name”: “Modelo de Chat Google Gemini”,
“credentials”: {
“googlePalmApi”: {
“id”: “r5K1AFY1c2dmiqsE”,
“name”: “Cuenta de API Google Gemini(PaLM)”
}
}
}
],
“connections”: {
“Al hacer clic en ‘Ejecutar flujo de trabajo’”: {
“main”: [
[
{
“node”: “Obtener fila(s) en la hoja”,
“type”: “main”,
“index”: 0
}
]
]
},
“Obtener fila(s) en la hoja”: {
“main”: [
[
{
“node”: “Agente de IA”,
“type”: “main”,
“index”: 0
}
]
]
},
“Agente de IA”: {
“main”: [
[
{
“node”: “Generar un documento PDF”,
“type”: “main”,
“index”: 0
}
]
]
},
“Modelo de Chat Google Gemini”: {
“ai_languageModel”: [
[
{
“node”: “Agente de IA”,
“type”: “ai_languageModel”,
“index”: 0
}
]
]
}
},
“pinData”: {},
“meta”: {
“templateCredsSetupCompleted”: true,
“instanceId”: “845031bfdb8f607d8c7ae907fb5de28c6fb4d0a8d0cd06c1a605d7c42f4018a9”
}
}

Cambia esto: ={{ JSON.stringify({ post_event_report: $json.output }) }}

Por esto: = { "post_event_report": $json.output }

Aquí está el flujo de trabajo

1 me gusta

Dado que este patrón exacto funcionó en otros dos flujos de trabajo, el error casi con certeza está en lo que $json.output realmente contiene aquí, no en el enfoque JSON.stringify en sí. Dos cosas destacan de tu JSON:

  1. alwaysOutputData: true en el nodo PDF significa que devolverá felizmente un resultado incluso cuando su entrada esté vacía/malformada — que es exactamente por qué estás obteniendo un PDF en blanco en lugar de un error. Elimina temporalmente esa configuración para que una entrada incorrecta se muestre como un fallo que puedas inspeccionar.
  2. Coloca un nodo Set (o simplemente haz clic en el pin de entrada del nodo PDF) justo antes de “Generate a PDF document” y verifica qué es realmente $json.output en ese punto. Con un nodo LangChain Agent respaldado específicamente por Gemini, he visto casos donde la respuesta regresa anidada de manera diferente a la esperada (por ejemplo, bajo una clave diferente, o como un arreglo) dependiendo del modelo/versión — así que “la misma expresión que funcionó antes” puede silenciosamente resolverse a undefined esta vez, y JSON.stringify({ post_event_report: undefined }) produce esencialmente {}, de ahí un PDF en blanco/basado en plantilla pero vacío.
  3. También vale la pena verificar independientemente de los datos: ¿la Plantilla del Generador de PDF (ID 1655316) realmente tiene una variable de combinación nombrada exactamente post_event_report? Un cambio de nombre o un nuevo ID de plantilla con un campo diferentemente nombrado produciría el mismo síntoma “PDF en blanco, sin error” incluso con datos perfectamente buenos fluyendo.

Aislar si es (2) o (3) es una prueba: codifica el campo de datos como {{ JSON.stringify({ post_event_report: "test content" }) }} y ejecútalo. Si eso se renderiza en el PDF, el problema está arriba (forma de salida del Agent). Si sigue en blanco, el problema es la plantilla/asignación de campos.

Hola @Tim_Barrett ,

Un PDF en blanco del PDF Generator API generalmente ocurre por dos razones específicas: Serialización Doble o un resultado de IA indefinido.

Aquí te mostramos cómo solucionarlo:

1. Elimina JSON.stringify() (Evita el Escape Doble)

En el modo de expresión n8n (={{ … }}), usar JSON.stringify() puede causar serialización doble porque el nodo de la comunidad ya serializa los objetos antes de enviarlos a la API. Cuando se escapan dobles, el PDF Generator API recibe una cadena inválida en lugar de un objeto de datos válido, lo que causa que todos los campos de la plantilla se representen en blanco.

Intenta cambiar el campo data en tu nodo PDF Generator de:

={{ JSON.stringify({ post_event_report: $json.output }) }}

A un objeto JavaScript directo:

={{ { post_event_report: $json.output } }}

2. Verifica si $json.output es indefinido

Si la propiedad de salida del Agente de IA falta o tiene un nombre diferente, JSON.stringify({ post_event_report: undefined }) se evalúa como {} (un objeto JSON vacío). Cuando el PDF Generator API recibe {} sin claves coincidentes, representa un PDF en blanco.

  • Haz clic en la salida de ejecución de tu nodo AI Agent y asegúrate de que la clave se nombre estrictamente como output.
  • Si Gemini genera texto markdown multilínea con saltos de línea (\n), puedes sanitizarlo/recortarlo de forma segura usando:
={{ { post_event_report: ($json.output || "").trim() } }}

Prueba Rápida

Intenta cambiar el parámetro data a un objeto de cadena codificado primero para ver si tu plantilla de PDF se representa:

={{ { post_event_report: "Contenido del informe de prueba aquí..." } }}

¡Si el texto de prueba aparece en el PDF, entonces cambiar a ={{ { post_event_report: $json.output } }} resolverá tu problema!

¡Avísame si esto resuelve el PDF en blanco!

¡Gracias!

Un PDF en blanco sin errores generalmente significa que la plantilla se renderizó correctamente, pero ninguna de sus variables coincidió con los datos que enviaste.

Con un Agente de IA antes, la causa habitual es que el agente devuelve su JSON como una cadena en output, a menudo envuelta en vallas de código. Ejecutar JSON.stringify en eso le entrega al nodo PDF una cadena dentro de una cadena, por lo que la plantilla nunca ve tus claves.

Lo que verificaría:

  1. Abre la salida del nodo del Agente en vista de tabla. Si tus campos no están en columnas separadas, sigue siendo una cadena.
  2. Añade un nodo Code antes del nodo PDF, configurado para “Run Once for Each Item”, para analizarlo:
    const s = $json.output; return { json: JSON.parse(s.slice(s.indexOf('{'), s.lastIndexOf('}') + 1)) };
  3. En el campo de datos del nodo PDF usa {{ JSON.stringify($json) }}, y asegúrate de que los nombres de las claves coincidan exactamente con las variables de la plantilla, incluyendo mayúsculas/minúsculas y anidamiento.
  4. Fija un pequeño elemento de prueba y ejecuta el nodo PDF por sí solo, para que sepas si el problema está en los datos o en la plantilla.

Mi intuición es que tus flujos de trabajo anteriores le entregaron un objeto real de un nodo Set o HTTP, por lo que la misma expresión funcionó allí.