JSON Stringify ne peut pas envoyer de données à PDF

Je construis un flux de travail qui envoie des données d’agent IA à générer sous forme de fichier PDF en utilisant le nœud « PDF Generator API ».

J’ai utilisé cette commande dans le champ « data » du nœud sur deux flux de travail précédents avec exactement la même fonction, et cela fonctionnait parfaitement :

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

Mais ici, elle génère un PDF vierge. J’ai déjà inclus la variable dans le modèle PDF Generator comme je l’ai fait pour les flux de travail précédents, donc je n’ai aucune idée de pourquoi elle génère soudainement un PDF vierge.

Vous avez une idée ?

{
“nodes”: [
{
“parameters”: {},
“type”: “n8n-nodes-base.manualTrigger”,
“typeVersion”: 1,
“position”: [
0,
0
],
“id”: “27e200f4-843d-4d50-b42c-0b8a26f7291b”,
“name”: “When clicking ‘Execute workflow’”
},
{
“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”: “Get row(s) in sheet”,
“credentials”: {
“googleSheetsOAuth2Api”: {
“id”: “wV1Zw6McyxYXrk8t”,
“name”: “Google Sheets account”
}
}
},
{
“parameters”: {
“promptType”: “define”,
“text”: “= Get {{ $json.Feedback }} for {{ $json[“Event Name”] }} {{ $json.Date }} {{ $json.Location }} {{ $json[‘No. of Guests’] }}”,
“options”: {
“systemMessage”: "=You are a Post Event Reporting specialist working with a Small Catering Business with over 30 years of experience in the industry. Your role is to analyze the spreadsheet and generate areas of improvement based on the {{ $json.Feedback }} given. Compile all of the data into a comprehensive post-event report "
}
},
“type”: “@n8n/n8n-nodes-langchain.agent”,
“typeVersion”: 3.1,
“position”: [
448,
0
],
“id”: “1cebd084-c6fa-4477-b507-96bffc2a3733”,
“name”: “AI Agent”
},
{
“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”: “=Post event report for {{ $(‘Get row(s) in sheet’).item.json[“Event Name”] }} on {{ $(‘Get row(s) in sheet’).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”: “Generate a PDF document”,
“alwaysOutputData”: true,
“credentials”: {
“pdfGeneratorApi”: {
“id”: “XUfVEGWx0Q45fr5L”,
“name”: “PDF Generator account”
}
}
},
{
“parameters”: {
“options”: {}
},
“type”: “@n8n/n8n-nodes-langchain.lmChatGoogleGemini”,
“typeVersion”: 1.1,
“position”: [
320,
208
],
“id”: “630d55ef-1a19-4f5a-bad5-a14c85c8fb4d”,
“name”: “Google Gemini Chat Model”,
“credentials”: {
“googlePalmApi”: {
“id”: “r5K1AFY1c2dmiqsE”,
“name”: “Google Gemini(PaLM) Api account”
}
}
}
],
“connections”: {
“When clicking ‘Execute workflow’”: {
“main”: [
[
{
“node”: “Get row(s) in sheet”,
“type”: “main”,
“index”: 0
}
]
]
},
“Get row(s) in sheet”: {
“main”: [
[
{
“node”: “AI Agent”,
“type”: “main”,
“index”: 0
}
]
]
},
“AI Agent”: {
“main”: [
[
{
“node”: “Generate a PDF document”,
“type”: “main”,
“index”: 0
}
]
]
},
“Google Gemini Chat Model”: {
“ai_languageModel”: [
[
{
“node”: “AI Agent”,
“type”: “ai_languageModel”,
“index”: 0
}
]
]
}
},
“pinData”: {},
“meta”: {
“templateCredsSetupCompleted”: true,
“instanceId”: “845031bfdb8f607d8c7ae907fb5de28c6fb4d0a8d0cd06c1a605d7c42f4018a9”
}
}

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

En ceci : = { "post_event_report": $json.output }

Voici le workflow

1 « J'aime »

Puisque ce motif exact a fonctionné sur deux autres workflows, le bug se trouve presque certainement dans ce que $json.output contient réellement ici, et non dans l’approche JSON.stringify elle-même. Deux éléments ressortent de votre JSON :

  1. alwaysOutputData: true sur le nœud PDF signifie qu’il retournera volontiers un résultat même si son entrée est vide/malformée — c’est exactement pourquoi vous obtenez un PDF vierge au lieu d’une erreur. Supprimez temporairement ce paramètre pour qu’une mauvaise entrée se manifeste réellement comme une défaillance que vous pouvez inspecter.
  2. Insérez un nœud Set (ou cliquez simplement sur la broche d’entrée du nœud PDF) juste avant « Generate a PDF document » et vérifiez ce que $json.output est réellement à ce point. Avec un nœud LangChain Agent alimenté par Gemini spécifiquement, j’ai observé des cas où la réponse revient imbriquée différemment que prévu (par exemple sous une clé différente, ou sous forme de tableau) selon le modèle/la version — donc « la même expression qui a fonctionné avant » peut silencieusement se résoudre à undefined cette fois, et JSON.stringify({ post_event_report: undefined }) produit essentiellement {}, d’où un PDF vierge/templé mais vide.
  3. Vaut aussi la peine de vérifier indépendamment des données : le modèle PDF Generator (ID 1655316) a-t-il réellement une variable de fusion nommée exactement post_event_report ? Un renommage ou un nouvel ID de modèle avec un champ nommé différemment produirait le même symptôme « PDF vierge, pas d’erreur » même avec des données parfaitement bonnes qui arrivent.

Isoler si c’est (2) ou (3) est un test : codez en dur le champ de données en {{ JSON.stringify({ post_event_report: “test content” }) }} et exécutez-le. Si cela s’affiche dans le PDF, le problème est en amont (forme de sortie de l’Agent). Si c’est toujours vierge, le problème est le modèle/la correspondance des champs.

Salut @Tim_Barrett ,

Un PDF vierge provenant de PDF Generator API se produit généralement pour deux raisons spécifiques : Double sérialisation ou une sortie IA indéfinie.

Voici comment corriger cela :

1. Supprimer JSON.stringify() (Éviter l’échappement double)

En mode expression n8n (={{ … }}), l’utilisation de JSON.stringify() peut causer une double sérialisation car le nœud communautaire sérialise déjà les objets avant de les envoyer à l’API. Lorsqu’il est double-échappé, PDF Generator API reçoit une chaîne invalide au lieu d’un objet de données valide, ce qui provoque le rendu vierge de tous les champs du modèle.

Essayez de modifier le champ data dans votre nœud PDF Generator :

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

Pour un objet JavaScript direct :

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

2. Vérifier si $json.output est indéfini

Si la propriété de sortie de l’agent IA est manquante ou nommée différemment, JSON.stringify({ post_event_report: undefined }) s’évalue à {} (un objet JSON vide). Lorsque PDF Generator API reçoit {} sans clés correspondantes, il rend un PDF vierge.

  • Cliquez sur la sortie d’exécution de votre nœud AI Agent et assurez-vous que la clé est strictement nommée output.
  • Si Gemini génère du texte markdown multiligne avec des sauts de ligne (\n), vous pouvez le nettoyer/réduire en toute sécurité en utilisant :
={{ { post_event_report: ($json.output || "").trim() } }}

Test rapide

Essayez d’abord de modifier le paramètre data en un objet chaîne codé en dur pour voir si votre modèle PDF s’affiche :

={{ { post_event_report: "Test report content here..." } }}

Si le texte de test apparaît sur le PDF, passer à ={{ { post_event_report: $json.output } }} résoudra votre problème !

Fais-moi savoir si cela résout le PDF vierge !

Merci !

Un PDF vierge sans erreur signifie généralement que le modèle s’est rendu correctement, mais qu’aucune de ses variables ne correspondait aux données que vous avez envoyées.

Avec un Agent IA en amont, la cause habituelle est que l’agent retourne son JSON sous forme d’une seule chaîne dans output, souvent enveloppée dans des balises de code. L’exécution de JSON.stringify sur cela remet au nœud PDF une chaîne à l’intérieur d’une chaîne, de sorte que le modèle ne voit jamais vos clés.

Voici ce que je vérifierais :

  1. Ouvrez la sortie du nœud Agent en vue tableau. Si vos champs ne sont pas dans des colonnes séparées, c’est toujours une chaîne.
  2. Ajoutez un nœud Code avant le nœud PDF, défini pour « Run Once for Each Item », afin de l’analyser :
    const s = $json.output; return { json: JSON.parse(s.slice(s.indexOf('{'), s.lastIndexOf('}') + 1)) };
  3. Dans le champ de données du nœud PDF, utilisez {{ JSON.stringify($json) }}, et assurez-vous que les noms de clés correspondent exactement aux variables du modèle, en tenant compte de la casse et de l’imbrication.
  4. Épinglez un petit élément de test et exécutez le nœud PDF seul, afin de savoir si le problème vient des données ou du modèle.

Mon hypothèse est que vos workflows précédents lui ont fourni un véritable objet provenant d’un nœud Set ou HTTP, ce qui explique pourquoi la même expression fonctionnait là-bas.