8
n8n 中文网amn8n.com

根据JD制作ATS简历

高级

这是一个Multimodal AI领域的自动化工作流,包含 19 个节点。主要使用 Code, Html, Perplexity, FormTrigger, GoogleDrive 等节点。 使用Perplexity AI和PDF导出生成职位特定的ATS简历

前置要求
  • Google Drive API 凭证
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "id": "JgekNtar5mXcPtGd",
  "meta": {
    "instanceId": "fca4fa0e5ae247e39cd954acbd193c81c66eeb044912b56566983f18237c0bf6",
    "templateCredsSetupCompleted": true
  },
  "name": "根据JD制作ATS简历",
  "tags": [],
  "nodes": [
    {
      "id": "7f200ac3-741e-4c81-af61-b798c317801e",
      "name": "HTML转PDF",
      "type": "@custom-js/n8n-nodes-pdf-toolkit.html2Pdf",
      "position": [
        1664,
        112
      ],
      "parameters": {
        "htmlInput": "={{ $json.cleanedResponse }}"
      },
      "credentials": {
        "customJsApi": {
          "id": "4QZZxZEUk18tr3si",
          "name": "CustomJS account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d6b2bfdf-b0e3-4477-a340-d97235f0ed92",
      "name": "上传文件",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        2160,
        112
      ],
      "parameters": {
        "name": "NEW_RESUNME",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "1vzNpRjBe1ylcLmJ2TKl4TN40BAeri-HD",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1vzNpRjBe1ylcLmJ2TKl4TN40BAeri-HD",
          "cachedResultName": "Resume"
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "rEUMr90NJv8PD8bc",
          "name": "Google Drive account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "c78b7099-9c77-4ade-92b3-0677c5675dd1",
      "name": "表单触发器",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -1344,
        112
      ],
      "webhookId": "285117be-9acd-496f-8320-866d6124a9fe",
      "parameters": {
        "path": "resume-builder",
        "options": {},
        "formTitle": "resume builder",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Paste Resume text",
              "placeholder": "Resume plain text"
            },
            {
              "fieldType": "file",
              "fieldLabel": "Upload Resume PDF",
              "multipleFiles": false,
              "requiredField": true,
              "acceptFileTypes": ".pdf"
            },
            {
              "fieldType": "file",
              "fieldLabel": "Upload JD PDF",
              "multipleFiles": false,
              "requiredField": true,
              "acceptFileTypes": ".pdf"
            }
          ]
        },
        "responseMode": "lastNode"
      },
      "typeVersion": 1
    },
    {
      "id": "45e99a17-500f-4d4d-9c95-42a28c586427",
      "name": "提取简历1",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        -400,
        112
      ],
      "parameters": {
        "options": {},
        "operation": "pdf",
        "binaryPropertyName": "={{ Object.keys($binary)[0] }}"
      },
      "typeVersion": 1,
      "alwaysOutputData": false
    },
    {
      "id": "825fd050-286c-4d9b-982a-b2028709e11b",
      "name": "处理一个二进制文件1",
      "type": "n8n-nodes-base.code",
      "position": [
        -848,
        112
      ],
      "parameters": {
        "jsCode": "let results = [];\n\nfor (let item of items) {\n    if (item.binary) {\n        // If there's binary data in the item, process each binary file\n        for (let key in item.binary) {\n            // Use the key as the file name\n            let binaryKey = key.replace(/\\s/g, 'Upload_Resume_PDF'); // Replace spaces with underscores for the key\n            results.push({\n                json: {\n                    fileName: binaryKey\n                },\n                binary: {\n                    [binaryKey]: item.binary[key] // Use the modified key for the binary data\n                }\n            });\n        }\n    }\n}\n\nreturn results;"
      },
      "typeVersion": 2
    },
    {
      "id": "86c96480-6969-4ea3-a839-8f235eb5c10c",
      "name": "合并简历 + JD1",
      "type": "n8n-nodes-base.code",
      "position": [
        48,
        112
      ],
      "parameters": {
        "jsCode": "return [\n  {\n    json: {\n      merged: $json.text + \" \" + $item(1).$json[\"text\"]\n    }\n  }\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "84779a64-ecb1-4bf9-b9c3-bd968b3b47cf",
      "name": "自定义简历1",
      "type": "n8n-nodes-base.perplexity",
      "position": [
        528,
        112
      ],
      "parameters": {
        "model": "sonar-reasoning",
        "options": {},
        "messages": {
          "message": [
            {
              "role": "system",
              "content": "=System (paste exactly as-is):\n\nYou are a professional resume writer. Build a single, ATS-friendly resume by combining and aligning the candidate’s resume with the job description contained in:\n{{ $json.merged }}\n\nRules for content:\n\nTailor the resume to the JD while staying truthful to the candidate’s information. Prioritize skills/keywords the JD demands. Rephrase; do not invent facts.\n\nOmit sections that have no data instead of adding placeholders.\n\nPrefer the candidate’s details when resume and JD conflict; only adjust wording to match JD terminology.\n\nRules for layout & style:\n\nOutput one valid HTML document only (no Markdown, no code fences, no JSON, no citations, no comments, no <think> or similar tags, no text before or after).\n\nUse inline CSS inside <style> in the <head>; no external assets (fonts, scripts, images, icons, tables).\n\nPlain white background, black text, font: Arial, sans-serif.\n\nPage-friendly margins (32–40px), single-column layout, consistent spacing.\n\nName at top center, bold, ~26–30px. Contact line centered beneath, smaller.\n\nSection titles (Summary, Skills, Experience, Projects, Education, Certifications, Links) left-aligned, bold, ~18–20px, with clear top margin.\n\nUse <ul><li> bullet points for skills and achievements. In Experience/Projects, show role/company/location/dates, then concise accomplishment bullets (use metrics where present).\n\nKeep it clean and ATS-safe: no colors, graphics, or fancy layouts.\n\nOutput requirement (critical):\nReturn only:\n\n<!DOCTYPE html>\n<html>…full document with inline <style>…</html>"
            },
            {
              "content": "=Final User Prompt (Strict Version):\n\nYou are a professional resume writer.\nYour task is to generate a single ATS-friendly resume in plain HTML and CSS only.\n\nInput data (resume + job description) is provided here:\n{{ $json.merged }}\n\nMandatory Guidelines (must follow exactly):\n\nOutput only valid HTML and CSS wrapped inside <html>...</html>. No explanations, comments, or extra text outside the HTML.\n\nThe resume must be clean, minimal, and professional:\n\nWhite background, black text, single font (Arial, sans-serif).\n\nCandidate’s full name: top center, bold, font size 26–30px.\n\nContact information: below name, centered, smaller font.\n\nSection titles (Skills, Certifications, Projects, Experience, Education, etc.): bold, left-aligned, font size 18–20px.\n\nUse bullet points for lists (skills, certifications, responsibilities, achievements).\n\nMaintain consistent spacing (margin-top for sections, padding inside lists).\n\nNo colors, tables, or unnecessary design elements.\n\nResume must combine the resume and job description into a single tailored version that best fits the target role.\n\nThe output must be ATS-optimized (clean structure, clear hierarchy, no hidden elements).\n\nDo not include placeholders like <think>, comments, or explanations. Only deliver the final HTML + CSS resume."
            }
          ]
        },
        "simplify": true,
        "requestOptions": {}
      },
      "credentials": {
        "perplexityApi": {
          "id": "jfeGy5zFESdZPlAv",
          "name": "Perplexity account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "bda8efee-e4a6-4c00-86e9-dd9c8fd0ac07",
      "name": "HTML格式1",
      "type": "n8n-nodes-base.code",
      "position": [
        1184,
        112
      ],
      "parameters": {
        "jsCode": "// Get the response from Perplexity\nconst response = $json.message || $json.content || $json.text;\n\n// Extract content between <html> and </html> tags\nconst htmlMatch = response.match(/<html[\\s\\S]*?<\\/html>/i);\n\nif (htmlMatch) {\n  // Found HTML content - now remove all \\n characters\n  const cleanHtml = htmlMatch[0].replace(/\\n/g, '');\n  \n  return [{\n    json: {\n      cleanedResponse: cleanHtml,\n      originalResponse: response\n    }\n  }];\n} else {\n  // No HTML found, return original\n  return [{\n    json: {\n      cleanedResponse: response,\n      originalResponse: response,\n      error: \"No HTML tags found in response\"\n    }\n  }];\n}"
      },
      "typeVersion": 2
    },
    {
      "id": "d9a5f53e-6683-4311-9d3b-790097efbb88",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1536,
        -480
      ],
      "parameters": {
        "color": 3,
        "width": 480,
        "height": 784,
        "content": "## 表单触发器节点摘要"
      },
      "typeVersion": 1
    },
    {
      "id": "c4c9e712-f353-460c-91d2-848ab373309f",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -880,
        880
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "5de48c59-3453-4083-a31e-676294205864",
      "name": "便签2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -544,
        -480
      ],
      "parameters": {
        "color": 4,
        "width": 400,
        "height": 784,
        "content": "## 提取简历1节点摘要"
      },
      "typeVersion": 1
    },
    {
      "id": "46541729-54be-45f5-ba91-a1b294e854f3",
      "name": "便签3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1040,
        -480
      ],
      "parameters": {
        "color": 2,
        "width": 480,
        "height": 784,
        "content": "## 处理一个二进制文件1节点摘要"
      },
      "typeVersion": 1
    },
    {
      "id": "00a054b3-a973-418c-840d-0796cc288b98",
      "name": "便签4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -128,
        -480
      ],
      "parameters": {
        "color": 6,
        "width": 400,
        "height": 784,
        "content": "## 合并简历 + JD1节点摘要"
      },
      "typeVersion": 1
    },
    {
      "id": "cc1cd2d7-3315-4897-bc56-8d0d2c6606b4",
      "name": "便签5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        288,
        -480
      ],
      "parameters": {
        "color": 7,
        "width": 592,
        "height": 784,
        "content": "## AI Perplexity节点摘要"
      },
      "typeVersion": 1
    },
    {
      "id": "e5c8c302-9207-46bb-9151-8dd1edfa445a",
      "name": "便签 6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        896,
        -480
      ],
      "parameters": {
        "width": 592,
        "height": 784,
        "content": "## HTML格式1节点摘要"
      },
      "typeVersion": 1
    },
    {
      "id": "b8d0caab-6392-4123-a180-d33665cd4c54",
      "name": "便签7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1184,
        640
      ],
      "parameters": {
        "color": 3,
        "width": 448,
        "height": 480,
        "content": "## 生成HTML预览节点摘要"
      },
      "typeVersion": 1
    },
    {
      "id": "dbe2e4c3-cb5d-4f04-84ed-8071cee8904b",
      "name": "HTML预览",
      "type": "n8n-nodes-base.html",
      "position": [
        1344,
        480
      ],
      "parameters": {
        "html": "{{ $json.cleanedResponse }}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "438498a1-ea92-4b2e-833d-76b05cc25139",
      "name": "便签8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1504,
        -480
      ],
      "parameters": {
        "color": 3,
        "width": 416,
        "height": 784,
        "content": "## HTML转PDF节点摘要"
      },
      "typeVersion": 1
    },
    {
      "id": "28c9b45a-9508-459a-94a1-a183c8a14280",
      "name": "便签 9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1936,
        -480
      ],
      "parameters": {
        "color": 5,
        "width": 480,
        "height": 784,
        "content": "## 上传文件节点摘要"
      },
      "typeVersion": 1
    }
  ],
  "active": true,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "51d3f7e1-1c0e-41d2-9a2e-de31374df1e9",
  "connections": {
    "HTML to PDF": {
      "main": [
        [
          {
            "node": "Upload file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Form Trigger": {
      "main": [
        [
          {
            "node": "Process one binary file1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTML format1": {
      "main": [
        [
          {
            "node": "HTML Preview",
            "type": "main",
            "index": 0
          },
          {
            "node": "HTML to PDF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Customize resume1": {
      "main": [
        [
          {
            "node": "HTML format1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extracting resume1": {
      "main": [
        [
          {
            "node": "Merge Resume + JD1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Resume + JD1": {
      "main": [
        [
          {
            "node": "Customize resume1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process one binary file1": {
      "main": [
        [
          {
            "node": "Extracting resume1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

高级 - 多模态 AI

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
高级
节点数量19
分类1
节点类型8
难度说明

适合高级用户,包含 16+ 个节点的复杂工作流

外部链接
在 n8n.io 查看

分享此工作流