AutomationFlowsEmail & Gmail › AI Email PDF Analysis with Poppler

AI Email PDF Analysis with Poppler

Original n8n title: Email PDF Analysis with Poppler

Email pdf analysis with Poppler. Uses gmailTrigger, readWriteFile, executeCommand, extractFromFile. Event-driven trigger; 8 nodes.

Event trigger★★★☆☆ complexityAI-powered8 nodesGmail TriggerRead Write FileExecute CommandChain LlmLm Chat Deep SeekOutput Parser StructuredStop And Error
Email & Gmail Trigger: Event Nodes: 8 Complexity: ★★★☆☆ AI nodes: yes Added:

This workflow follows the Chainllm → Gmail Trigger recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "Email pdf analysis with Poppler",
  "nodes": [
    {
      "parameters": {
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "simple": false,
        "filters": {
          "q": "from: andrei@smartclover.ro"
        },
        "options": {
          "downloadAttachments": true
        }
      },
      "type": "n8n-nodes-base.gmailTrigger",
      "typeVersion": 1.3,
      "position": [
        -2320,
        -832
      ],
      "id": "c76e0339-6cc4-4325-9684-864caa130009",
      "name": "Gmail Trigger",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "write",
        "fileName": "=/home/node/user_data/{{ $('Gmail Trigger').item.binary.attachment_0.fileName }}",
        "dataPropertyName": "attachment_0",
        "options": {}
      },
      "type": "n8n-nodes-base.readWriteFile",
      "typeVersion": 1,
      "position": [
        -2064,
        -832
      ],
      "id": "bda77fb9-8178-430b-b5c4-4db21dbc75a9",
      "name": "Read/Write Files from Disk",
      "retryOnFail": false,
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "command": "=pdftotext {{ $json.fileName }} -"
      },
      "type": "n8n-nodes-base.executeCommand",
      "typeVersion": 1,
      "position": [
        -1520,
        -880
      ],
      "id": "7fcc7b6e-a327-47aa-8b15-4b3fce364668",
      "name": "Execute Command"
    },
    {
      "parameters": {
        "operation": "pdf",
        "binaryPropertyName": "attachment_0",
        "options": {}
      },
      "type": "n8n-nodes-base.extractFromFile",
      "typeVersion": 1,
      "position": [
        -1696,
        -496
      ],
      "id": "52340875-fcaf-446e-8c97-ad8c22219d49",
      "name": "Extract from File"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Identify and extract the fields in the provided text in JSON format:\n- Cont\n- Denumirea contului\n- Solduri initiale an - debitoare\n- Solduri initiale an - creditoare\n- Sume precendente - debitoare\n- Sume precendente - creditoare\n- Rulaje perioada - debitoare\n- Rulaje perioada - creditoare\n- Sume totale - debitoare\n- Sume totale - creditoare\n- Solduri finale - debitoare\n- Solduri finale - creditoare\n\nOutput in JSON format. Output only the resulting JSON\nUse the following data as input:\n---\n{{ $json.stdout }}\n---",
        "hasOutputParser": true,
        "batching": {}
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.7,
      "position": [
        -1152,
        -864
      ],
      "id": "ed2c1547-6a5e-4a35-9f03-9ef9c17e60aa",
      "name": "Basic LLM Chain"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatDeepSeek",
      "typeVersion": 1,
      "position": [
        -1280,
        -672
      ],
      "id": "815ce9ca-fae8-49a0-9b48-d9ed9ea18d82",
      "name": "DeepSeek Chat Model",
      "credentials": {
        "deepSeekApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://example.com/accounting-balance-schema.json\",\n  \"title\": \"Accounting Balance Report\",\n  \"description\": \"Schema for Romanian accounting balance report with account details and financial amounts\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"accounts\": {\n      \"type\": \"array\",\n      \"description\": \"Array of accounting records\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"Cont\": {\n            \"type\": \"string\",\n            \"description\": \"Account code\",\n            \"pattern\": \"^[0-9]+$\"\n          },\n          \"Denumirea contului\": {\n            \"type\": \"string\",\n            \"description\": \"Account name/description\"\n          },\n          \"Solduri initiale an - debitoare\": {\n            \"type\": \"string\",\n            \"description\": \"Initial year balance - debit\",\n            \"pattern\": \"^[0-9]+\\\\.[0-9]{2}$\"\n          },\n          \"Solduri initiale an - creditoare\": {\n            \"type\": \"string\",\n            \"description\": \"Initial year balance - credit\",\n            \"pattern\": \"^[0-9]+\\\\.[0-9]{2}$\"\n          },\n          \"Sume precendente - debitoare\": {\n            \"type\": \"string\",\n            \"description\": \"Previous amounts - debit\",\n            \"pattern\": \"^[0-9]+\\\\.[0-9]{2}$\"\n          },\n          \"Sume precendente - creditoare\": {\n            \"type\": \"string\",\n            \"description\": \"Previous amounts - credit\",\n            \"pattern\": \"^[0-9]+\\\\.[0-9]{2}$\"\n          },\n          \"Rulaje perioada - debitoare\": {\n            \"type\": \"string\",\n            \"description\": \"Period turnover - debit\",\n            \"pattern\": \"^[0-9]+\\\\.[0-9]{2}$\"\n          },\n          \"Rulaje perioada - creditoare\": {\n            \"type\": \"string\",\n            \"description\": \"Period turnover - credit\",\n            \"pattern\": \"^[0-9]+\\\\.[0-9]{2}$\"\n          },\n          \"Sume totale - debitoare\": {\n            \"type\": \"string\",\n            \"description\": \"Total amounts - debit\",\n            \"pattern\": \"^[0-9]+\\\\.[0-9]{2}$\"\n          },\n          \"Sume totale - creditoare\": {\n            \"type\": \"string\",\n            \"description\": \"Total amounts - credit\",\n            \"pattern\": \"^[0-9]+\\\\.[0-9]{2}$\"\n          },\n          \"Solduri finale - debitoare\": {\n            \"type\": \"string\",\n            \"description\": \"Final balance - debit\",\n            \"pattern\": \"^[0-9]+\\\\.[0-9]{2}$\"\n          },\n          \"Solduri finale - creditoare\": {\n            \"type\": \"string\",\n            \"description\": \"Final balance - credit\",\n            \"pattern\": \"^[0-9]+\\\\.[0-9]{2}$\"\n          }\n        },\n        \"required\": [\n          \"Cont\",\n          \"Denumirea contului\",\n          \"Solduri initiale an - debitoare\",\n          \"Solduri initiale an - creditoare\",\n          \"Sume precendente - debitoare\",\n          \"Sume precendente - creditoare\",\n          \"Rulaje perioada - debitoare\",\n          \"Rulaje perioada - creditoare\",\n          \"Sume totale - debitoare\",\n          \"Sume totale - creditoare\",\n          \"Solduri finale - debitoare\",\n          \"Solduri finale - creditoare\"\n        ],\n        \"additionalProperties\": false\n      }\n    }\n  },\n  \"required\": [\"accounts\"],\n  \"additionalProperties\": false\n}"
      },
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "typeVersion": 1.3,
      "position": [
        -896,
        -656
      ],
      "id": "f8c47b7e-0246-4275-a4d6-5a20c04f1f04",
      "name": "Structured Output Parser"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.stopAndError",
      "typeVersion": 1,
      "position": [
        -1760,
        -304
      ],
      "id": "c71acd9e-480c-4d7c-a89c-377b3c015650",
      "name": "Stop and Error"
    }
  ],
  "connections": {
    "Gmail Trigger": {
      "main": [
        [
          {
            "node": "Read/Write Files from Disk",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read/Write Files from Disk": {
      "main": [
        [
          {
            "node": "Execute Command",
            "type": "main",
            "index": 0
          },
          {
            "node": "Extract from File",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Stop and Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract from File": {
      "main": [
        []
      ]
    },
    "Execute Command": {
      "main": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "DeepSeek Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Basic LLM Chain": {
      "main": [
        []
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "6a1e15e9-ac3c-4452-bcca-bfde011d9f40",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "XJrKZo4QSrffQzfT",
  "tags": []
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Email pdf analysis with Poppler. Uses gmailTrigger, readWriteFile, executeCommand, extractFromFile. Event-driven trigger; 8 nodes.

Source: https://github.com/aidamian/n8n-workshop/blob/main/examples/pdf-extraction.json — original creator credit. Request a take-down →

More Email & Gmail workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Email & Gmail

Wait Splitout. Uses lmOpenAi, outputParserStructured, httpRequest, stickyNote. Event-driven trigger; 26 nodes.

Lm Open Ai, Output Parser Structured, HTTP Request +4
Email & Gmail

Wait Splitout. Uses lmOpenAi, outputParserStructured, httpRequest, stickyNote. Event-driven trigger; 26 nodes.

Lm Open Ai, Output Parser Structured, HTTP Request +4
Email & Gmail

Extract spend details (template). Uses gmailTrigger, extractFromFile, html, splitOut. Event-driven trigger; 24 nodes.

Gmail Trigger, Output Parser Structured, Google Gemini Chat +3
Email & Gmail

Telegram Gmail. Uses outputParserStructured, lmChatOpenAi, telegram, openAi. Event-driven trigger; 24 nodes.

Output Parser Structured, OpenAI Chat, Telegram +5
Email & Gmail

Extract spend details (template). Uses gmailTrigger, extractFromFile, html, splitOut. Event-driven trigger; 24 nodes.

Gmail Trigger, Output Parser Structured, Google Gemini Chat +3