根据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)可能需要您自行付费。
相关工作流推荐
AI最新24小时更新
使用Perplexity AI和Gmail自动化的每日AI新闻摘要
Html
Gmail
Perplexity
+2
8 节点Yashraj singh sisodiya
杂项
基于AI的WhatsApp支持机器人(Google Sheets工单创建)
基于AI的WhatsApp支持机器人(Google Sheets工单创建)
Set
Xml
Code
+20
35 节点Zain Khan
客服机器人
我的工作流3
使用AI、Gmail、GoogleDrive和Airtable的自动简历筛选与评分
Set
Code
Merge
+10
23 节点usamaahmed
人力资源
播客笔记记录器
使用GPT和Gemini结合性能数据创建高转化率Meta广告脚本
If
S3
Code
+9
24 节点Daniel Rosehill
发票处理
开发完成 - FAX 内容提取
传真和 PDF 数据提取工作流:使用 Google Gemini 和 Google Sheets
Set
Code
Form Trigger
+8
18 节点Intuz
内容创作
电子书转有声书
使用MiniMax和FFmpeg将电子书转换为有声书
Code
Wait
Form Trigger
+7
19 节点Jay Emp0
内容创作