通用 JD 定向一页简历生成器
把「候选人的真实经历 + 目标 JD 要求」转化为一页 A4 定制简历。核心是:诚实不编造 + 贴合 JD + 严格一页。本技能不含任何特定人物写死数据,靠 resume_data.json 驱动渲染。
0. 运行环境
- Python 解释器(二选一):
- 本机自带 Python 3.10+,且已
pip install playwright并playwright install chromium→ 直接用python运行。 - 或用 WorkBuddy 内置 Python(路径随用户名变化):
C:/Users/<你的用户名>/.workbuddy/binaries/python/envs/default/Scripts/python.exe。 - 技能脚本:位于本技能目录下的
scripts/(make_resume.py、build_resume.py)。运行前请用绝对路径指向它,例如: - Windows:
$PY "C:/Users/<你的用户名>/.workbuddy/skills/resume-tailor-pdf/scripts/make_resume.py" - 或在技能目录内直接用相对路径
scripts/make_resume.py。 - 在 Windows 上运行 Python 时,所有路径必须带盘符(如
C:/...),勿写/c/Users/...(否则报文件不存在)。 make_resume.py读resume_data.json→ 输出./简历.html(含./assets/);build_resume.py导出 PDF 并做一页检测。
1. 输入要求(向用户收集,缺什么问什么)
- 候选人简历材料:贴文本 / 上传 docx·pdf·markdown,或口述经历。至少要有:姓名、联系方式、教育(学校/专业/学位/时间)、每段经历(公司/角色/时间/做了什么)。
- 目标 JD:贴岗位描述,或给链接/文件。用于提取关键词与职责。
- 偏好(能问就问,不能问给默认值):
- 照片:国内岗默认放证件照;外企/部分岗可不放 →photo留空。
- 城市/到岗:meta里写「随时到岗 · 城市」。
- 语言:中文简历默认中文;若 JD 要求英文简历,整体改英文(仍一页、无照片按需)。
- 想强调的方向:若有多个经历,问用户最想突出哪段。
2. 硬约束(违反即返工)
- 严格一页 A4:不得跨页断条。靠
build_resume.py的coreClipped=false与overflowPx(负=未满页、正=溢出)判定;底部留白 ≤15%。 - 绝不虚构:数字、证书、课程、项目、技能等级,凡候选人未提供的一律不写;事实不足就弱化处理或省略,绝不为凑满编数据。
- JD 关键词自然嵌入:把 JD 要求的能力/工具/动作词织进 bullet,但不照抄 JD 原句,不堆砌关键词。
- 量化用真实数据:候选人给了数字就保留并前置;没给就不编造百分比/金额。
- 密度自适应(来自通用简历规范):
- 内容少 → 放大字号(+0.5–1pt)、行高(+0.05–0.1)、段距,让页面看起来从容不空。
- 内容多 → 先删段落/条目间空白,再压缩重复措辞(不掉事实),正文最多缩 0.5pt,正文不低于 9pt。
- 底部空白 >15% 是硬失败:调大排版,不靠注水填充。 - 层级配色克制:深蓝
#1e3a5f只用于姓名、栏目标题及下划线、公司名、条目符■;次级小标题用深灰#40454d加粗;句内关键词不滥用同色加粗。 - 两端对齐:正文
text-align: justify撑满每行。 - 板块固定顺序:教育 → 实习经历 → 校园/项目经历 → 技能清单(必含,打
data-resume-section="skills")→ 荣誉奖项(有则加)。 - 照片:彩色证件照约 25×31mm 右上角圆角;无则不放、不引用空图。
3. resume_data.json 数据格式
{
"name": "姓名",
"scale": 1.0, /* 可选:内容偏少时调大到 1.15~1.4 放大排版填满一页;内容多则保持 1.0 或 <1 */
"meta": "学校 · 届别 · 随时到岗 · 城市|电话|邮箱|微信",
"photo": "C:/路径/avatar.png 或 null",
"education": [
{"school":"xx大学","major":"专业","degree":"硕士","date":"2024.09 – 2027.06",
"detail":"主修:课程1、课程2;或一句话亮点(不写排名/虚构)"}
],
"experiences": [
{"company":"公司","role":"角色","date":"2025.06 – 2025.09",
"bullets":[["小标题","动作 + 工具/方法 + 量化结果 + 业务价值"],["", "纯字符串 bullet 也可"]]}
],
"campus": [ /* 同 experiences 结构,校园/项目经历,可省略 */
{"company":"研究生会","role":"主席","date":"2024.07 – 至今",
"bullets":[["团队管理","带 12 人统筹 5 场活动覆盖 5000+ 人次"]]}
],
"skills": [["数据分析","Python、SQL、Excel"],["语言","CET-6 600+"]]
/* 或写字符串 HTML:"<span class=\"pt\">▸ </span><b>数据分析</b>:Python、SQL" */,
"honors": [["奖学金","xx奖学金"],["荣誉","xx称号"]] /* 或字符串;无则省略 */
}
bullets每项:["小标题","描述"]或纯字符串。skills/honors:列表(按 bullet 渲染)或 HTML 字符串(自由控制样式)。- 缺板块(如无 campus/honors)直接不写该键,渲染器自动跳过。
4. JD 定向改写方法(核心能力)
- 拆 JD:列出 JD 的硬要求(技能/工具/证书)、职责动词(搭建/分析/对接/推进)、业务领域(金融/数据/增长…)。
- 映射经历:对每段经历,挑出与 JD 最相关的动作与成果,删除不相关项;强相关经历可展开、弱相关可压缩或后置。
- 重写 bullet:用「动作 + 工具/方法 + 真实量化结果 + 业务价值」结构,把 JD 关键词自然写入(如 JD 要「数据建模」→ 在相关经历写「用 Python 搭建 XX 模型,使 …」)。
- 技能清单对齐 JD:把 JD 要求的工具/语言前置;候选人没有的技能不写。
- 教育选课贴合:从真实课程中挑与 JD 相关的列出,用「等」留弹性,不编造未修课程。
5. 工作流
cd <工作目录>
# PY 指向你的 Python(见 §0);以下用 $PY 代指
# 1) 按 §3 写 resume_data.json(来自用户材料 + JD 改写)
# 2) 渲染 HTML(脚本路径换成你本机实际位置)
$PY "<技能目录>/scripts/make_resume.py" resume_data.json .
# 3) 导出 PDF + 一页检测
$PY "<技能目录>/scripts/build_resume.py" "简历.html"
coreClipped=false且overflowPx接近 0 → 通过。- 溢出:
overflowPx为正 → 删最弱 bullet / 收紧表述,重渲染再测。 - 留白过大:
overflowPx负很多 → 不注水,放大字号/行高/段距到视觉均衡;内容真少则补 1 条真实经历。 - 肉眼看版:
build_resume.py "简历.html" --png生成preview.png。
多版简历(不同 JD):复制 resume_data.json 为多份(如 jd_a.json),分别渲染到不同输出目录,各自 QA。
6. 常见坑
- 虚构数据:模型易给「提升 30%」「服务 100+ 客户」等编造数字,凡用户未给的量化一律不写。
- 照抄 JD:把 JD 原句当 bullet 是作弊感,要转化为「我做过什么」。
- 预览缓存:改完以
build_resume.py文字结论和 PDF 文本提取为准,别被旧预览图误导。 - 跨页断条:任何条目被分页截断即失败,重排或删 bullet。
- 路径错误:脚本用 Windows Python,必须带盘符路径(
C:/...),否则报文件不存在。 - 头像缺失:
photo给路径但文件不存在时不会报错也不会显示,需确认文件存在;不要放空<img>。 - 底部留白 >15%:一页但大片空白=失败,调排版而非注水。