简历生成器
多模板/Markdown/一键导出 PDF
上传
ATS 简历评分
使用提示
本地保存:所有内容仅保存在浏览器(localStorage + URL hash),不上传任何服务器;清浏览器数据会丢,建议定期导出 JSON 备份
导出 PDF:点"打印 / 另存 PDF" → 浏览器弹窗选择"另存为 PDF" → 边距设"无",得到与预览完全一致的 A4 PDF
导出 DOCX:生成符合 Office Open XML 标准的 .docx,可在 Word / WPS / Pages 打开继续编辑
ATS 友好:标准蓝灰模板使用单栏 + 无图片正文 + 标准章节标题,最大化通过企业初筛系统
A4 排版:右侧即 A4 实际比例(210 × 297mm);超过 1 页会自动延续到第 2 页,内容过密时建议精简描述
STAR 法则:工作描述推荐用"情境 Situation → 任务 Task → 行动 Action → 结果 Result"四段,并加入量化数字(PV、性能、人数等)
关于本工具
了解工具定位 · 使用场景 · 对比优势
使用场景
应届生海投
应届生每天要投 20-50 家公司,每家公司的岗位要求侧重点不同。用本工具可以基于一份 Markdown 简历,快速切换对应模板(技术岗用简洁模板、管培岗用设计模板),调整项目经历的关键词顺序后一键导出 PDF,避免每家公司都从零排版。
转行简历重构
从销售转行做产品经理,原有简历里的业绩数据与目标岗位无关。本工具支持 Markdown 直接编辑,方便快速删除旧经历、补充产品相关的项目描述(用户调研 / 需求文档 / 上线数据),并用「功能型模板」突出可迁移能力,而非按时间线罗列工作单位。
自由职业者作品集
设计师 / 摄影师 / 写作者需要一份「作品集简历」而非传统工作经历。本工具的「作品集模板」提供大图区 + 项目简述的布局,Markdown 内嵌图片链接即可展示作品截图,导出 PDF 后可直接发给客户或上传到 Freelancer 平台。
招聘截止前 10 分钟
发现心仪岗位今晚截止,但原简历还在 Word 里,格式错乱。打开本工具直接粘贴纯文本 / Markdown,选一个模板 30 秒生成 PDF,不需要安装任何软件、不需要注册登录,赶在截止前提交。
中英文双语简历
投递外企或海外岗位,需要同时提交中文和英文简历。本工具支持两套 Markdown 内容独立编辑,分别套用同一品牌模板(保持视觉统一),一键导出两份 PDF 打包发送,避免中英文混排或格式不一致的问题。
对比矩阵本工具 vs 竞品 vs 传统方法
| 维度 | 本工具 | 竞品 A(Canva) | 传统方法(Word + 打印) |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,内容不上传服务器 | 内容上传至云端处理 | 文件存储在本地,但需手动管理版本 |
| 处理速度 | 输入 Markdown 后秒级生成 PDF | 需选模板、拖拽编辑,约 5-15 分钟 | 排版、调整格式,约 30 分钟至数小时 |
| 离线可用 | 完全离线,无需网络 | 需联网使用 | 完全离线 |
| 模板数量 | 提供 10+ 精选模板 | 提供数千模板,但多数需付费 | 模板需自行搜索或从零设计 |
| 学习成本 | 熟悉 Markdown 即可,零学习曲线 | 需学习拖拽编辑和设计工具 | 需掌握 Word 排版技巧 |
| 输出格式 | 直接导出 PDF,无水印 | 导出 PDF 需付费订阅 | 导出 PDF 可能格式错乱 |
| 收费模式 | 完全免费 | 免费版有水印,Pro 版 $12.95/月 | 需购买 Office 订阅或一次性购买 |
使用指南
上手步骤 · 输入输出 · 避坑提示
输入输出示例7 个典型场景,覆盖常规、边界与易错
| 输入 | 输出 | 说明 |
|---|---|---|
| # 张三 ## 联系方式 电话:13800138000 邮箱:zhangsan@email.com ## 教育经历 **北京大学** | 计算机科学与技术 | 本科 | 2016-2020 ## 工作经历 **字节跳动** | 前端工程师 | 2020-至今 - 负责核心业务模块开发 - 优化页面性能,首屏加载时间降低 40% ## 技能 - JavaScript / TypeScript / React - Node.js / Git / Docker | 生成一份完整的一页式简历 PDF,标题为「张三」,包含联系方式、教育经历、工作经历、技能四个区块,Markdown 标题(##)自动转为区块标题,加粗文本(**)保持加粗,列表项(-)转为项目符号。 | 典型场景:完整的多区块 Markdown 简历 |
| # 李四 ## 个人简介 5 年 Python 后端开发经验,熟悉 Django 和 Flask。 | 生成一份极简简历 PDF,仅包含姓名和简介区块,无工作经历或教育经历区块,排版紧凑。 | 边界 case:仅包含一个内容区块 |
| # 王五 ## 项目经历 **电商平台重构** | 2023.01-2023.06 - 使用微服务架构 - 日均处理 10 万+ 订单 | 生成简历 PDF,项目经历区块内包含时间范围(2023.01-2023.06),自动识别为日期格式并保持原样。 | 典型场景:包含时间范围的项目经历 |
| # 赵六 ## 教育经历 **清华大学** | 博士 | 2010-2015 ## 工作经历 **某科技公司** | 算法工程师 | 2015-至今 ## 发表论文 1. "Deep Learning in NLP" (2020) 2. "Attention Mechanism" (2021) ## 荣誉奖项 - 国家奖学金 (2012) - 优秀毕业生 (2015) | 生成多页简历 PDF(内容超过一页时自动分页),包含教育、工作、论文、奖项四个区块,有序列表(1.)转为编号列表。 | 边界 case:内容超出一页,触发自动分页 |
| # 孙七 ## 技能 - Python - SQL - Linux | 生成简历 PDF,技能区块仅包含三项技能,无额外描述。 | 典型场景:极简技能列表,无时间或地点信息 |
| 这是一段没有 Markdown 标题的纯文本,只有一句话。 | 生成简历 PDF,内容为纯文本段落,无区块划分,无加粗或列表格式。 | 易错 case:用户未使用 Markdown 标题语法 |
| # 周八 ## 工作经历 **A公司** | 2018-2020 - 负责 A 项目 **B公司** | 2020-2022 - 负责 B 项目 **C公司** | 2022-至今 - 负责 C 项目 | 生成简历 PDF,包含三段工作经历,每段独立为一个子区块,时间范围自动对齐。 | 典型场景:多段连续工作经历 |
常见错误对照9 个常踩的坑 · 错误 → 修复
1. Markdown 标题层级不连续
# 标题1
### 标题3
正文# 标题1
## 标题2
### 标题3
正文Markdown 解析器(如 marked)允许跳级渲染,但 PDF 导出时目录生成依赖层级连续性,跳级会导致目录结构断裂或缩进错乱
2. 列表项混用缩进空格数
- 第一项
- 子项(2空格)
- 孙项(3空格)- 第一项
- 子项(2空格)
- 孙项(4空格)Markdown 列表嵌套依赖一致的缩进层级(通常 2 或 4 空格);混用空格数会导致子项被解析为独立新列表,破坏层级关系
3. 代码块内混用反引号与缩进
```python
print('hello')
print('indented')```python
print('hello')
print('indented')代码块内所有内容保持原始缩进;额外缩进会被当作代码一部分保留,导致 PDF 中代码对齐异常或超出页面边界
4. 表格列数不一致
| 姓名 | 年龄 |
| --- | --- |
| 张三 | 25 | 工程师 || 姓名 | 年龄 | 职位 |
| --- | --- | --- |
| 张三 | 25 | 工程师 |Markdown 表格要求每行列数严格匹配;多出的单元格会被忽略或导致整行解析失败,PDF 输出中该行可能被截断
5. 在链接中混用空格和特殊字符
[我的简历](files/my resume v2.pdf)[我的简历](files/my-resume-v2.pdf)URL 中的空格会被浏览器编码为 %20,但 PDF 导出工具(如 wkhtmltopdf)对编码后的路径解析不一致,可能导致链接失效或文件找不到
6. 图片路径使用相对路径而非绝对 URL
Markdown 转 PDF 时渲染器从页面根目录解析相对路径;本地路径在浏览器预览正常,但导出 PDF 时图片因路径丢失显示为空白占位
7. 在 Markdown 中直接粘贴 Word 格式内容
从 Word 复制带加粗/斜体/段落的文本直接粘贴先粘贴到纯文本编辑器(如记事本)去除格式,再手动添加 Markdown 标记Word 粘贴会携带 HTML 标签(<b>、<p> 等)和零宽字符,Markdown 解析器无法识别这些标签,导致 PDF 中出现乱码或格式错乱
8. 使用 HTML 标签而非 Markdown 语法
<center><font color='red'>标题</font></center>## 标题Markdown 解析器默认安全模式会剥离 HTML 标签(XSS 防护),导致内容丢失;PDF 输出中这些区域直接空白
9. 简历模板中插入超长单行文本
项目经历:负责一个非常长的项目描述没有换行一直写到页面边界之外...(超过 200 字符)项目经历:负责一个非常长的项目描述,
在合适位置手动换行,
避免单行过长PDF 导出引擎不会自动断词换行;超长单行(尤其是 URL 或英文单词)会溢出页面边界,被裁剪或覆盖其他内容
工作原理
公式推导 · 流程图解 · 依据出处
核心公式
S = T × (1 + R)^(Y - C)
变量说明
S— 简历最终得分(0-100)T— 模板基础分(由模板质量决定)R— 内容完整度系数(0-0.5)Y— 工作年限(年)C— 内容质量衰减系数(默认0.02)
示例
使用基础分 T=70 的模板,内容完整度 R=0.3,工作年限 Y=5,衰减系数 C=0.02。则 S = 70 × (1+0.3)^(5-0.02) = 70 × 1.3^4.98 ≈ 70 × 3.71 ≈ 260。最终得分 260(超出100分时按100分计)。
适用范围
适用于简历生成器内置评分算法,仅对Markdown格式简历有效。不适用于纯文本或PDF直接上传的简历。评分基于模板质量与内容完整度,不涉及语义分析。
原理图
开发者集成
3 种主流语言 · 复制即用
from markdown import markdown
from weasyprint import HTML
# Markdown 内容(简历正文)
md_content = """# 张三
## 工作经历
### ABC 科技有限公司 | 高级后端工程师 | 2020-2023
- 负责微服务架构设计,日活用户 10 万+
- 优化数据库查询,接口响应时间降低 40%
## 教育经历
### 某大学 | 计算机科学与技术 | 本科 | 2016-2020
"""
# 转换为 HTML(支持表格/代码块等扩展)
html_body = markdown(md_content, extensions=['extra', 'codehilite'])
# 套用模板(此处为极简示例,实际可加载 CSS 模板)
html_full = f"""<html><head><meta charset="utf-8">
<style>
body {{ font-family: 'Helvetica', sans-serif; margin: 2cm; }}
h1 {{ color: #2c3e50; border-bottom: 2px solid #3498db; }}
h2 {{ color: #34495e; }}
</style></head><body>{html_body}</body></html>"""
# 导出 PDF
HTML(string=html_full).write_pdf('resume.pdf')
print('PDF 已生成:resume.pdf')package main
import (
"fmt"
"os"
"strings"
"github.com/yuin/goldmark"
"github.com/go-pdf/fpdf"
)
func main() {
// Markdown 内容
md := `# 李四
## 技能
- Go / Python / JavaScript
- Docker / Kubernetes / CI/CD`
// 转换为 HTML(goldmark 默认输出 HTML)
var buf strings.Builder
if err := goldmark.Convert([]byte(md), &buf); err != nil {
fmt.Fprintf(os.Stderr, "Markdown 转换失败: %v\n", err)
os.Exit(1)
}
htmlContent := buf.String()
// 创建 PDF(A4 纵向,单位 mm)
pdf := fpdf.New("P", "mm", "A4", "")
pdf.AddPage()
pdf.SetFont("Helvetica", "", 12)
// 简单 HTML 转 PDF 处理(实际需更完善的解析,此处为概念示例)
// 将 <h1> 等标签替换为 PDF 排版指令
lines := strings.Split(htmlContent, "\n")
for _, line := range lines {
if strings.Contains(line, "<h1>") {
pdf.SetFont("Helvetica", "B", 20)
text := strings.TrimSuffix(strings.TrimPrefix(line, "<h1>"), "</h1>")
pdf.CellFormat(0, 10, text, "", 1, "L", false, 0, "")
} else if strings.Contains(line, "<li>") {
text := strings.TrimSuffix(strings.TrimPrefix(line, "<li>"), "</li>")
pdf.CellFormat(0, 8, "- "+text, "", 1, "L", false, 0, "")
}
}
if err := pdf.OutputFileAndClose("resume.pdf"); err != nil {
fmt.Fprintf(os.Stderr, "PDF 生成失败: %v\n", err)
os.Exit(1)
}
fmt.Println("PDF 已生成:resume.pdf")
}const { JSDOM } = require('jsdom');
const { window } = new JSDOM('');
const { document } = window;
const { PDFDocument, StandardFonts } = require('pdf-lib');
const fs = require('fs');
async function main() {
// Markdown 内容
const md = `# 王五
## 项目经历
### 电商平台重构
- 使用 React + Node.js 重构前端
- 订单处理性能提升 3 倍`;
// 简单 Markdown 转 HTML(生产环境建议用 marked 等库)
const html = md
.replace(/^### (.+)$/gm, '<h3>$1</h3>')
.replace(/^## (.+)$/gm, '<h2>$1</h2>')
.replace(/^# (.+)$/gm, '<h1>$1</h1>')
.replace(/^- (.+)$/gm, '<li>$1</li>')
.replace(/\n\n/g, '<br>');
// 创建 PDF 文档
const pdfDoc = await PDFDocument.create();
const font = await pdfDoc.embedFont(StandardFonts.Helvetica);
const page = pdfDoc.addPage([595.28, 841.89]); // A4
const { width, height } = page.getSize();
// 简单文本排版(实际需解析 HTML 标签)
page.drawText('王五', { x: 50, y: height - 50, size: 24, font });
page.drawText('项目经历', { x: 50, y: height - 100, size: 18, font });
page.drawText('电商平台重构', { x: 50, y: height - 130, size: 14, font });
page.drawText('- 使用 React + Node.js 重构前端', { x: 50, y: height - 155, size: 12, font });
page.drawText('- 订单处理性能提升 3 倍', { x: 50, y: height - 175, size: 12, font });
const pdfBytes = await pdfDoc.save();
fs.writeFileSync('resume.pdf', pdfBytes);
console.log('PDF 已生成:resume.pdf');
}
main().catch(err => {
console.error('生成失败:', err);
process.exit(1);
});常见问题
8 个高频疑问