cv-a4-generator:从 Markdown 生成 A4 打印简历
cv-a4-generator:从 Markdown 生成 A4 打印简历
2026-05-27·Cy257·约 2 分钟读完
背景
在做个人主页时,用 Hugo + Hextra 搭建在线简历页面,但是当需要打印或导出 PDF 时,流程繁琐:Hugo 构建 → 从生成的 HTML 中提取内容 → 清理框架注入的标签 → 嵌入照片 → 包装 A4 CSS → 输出,整个流程依赖 Hugo 和完整的站点目录。
因此将这个生成逻辑剥离成独立工具:cv-a4-generator,方便一键生成独立 HTML,可直接导出保存为 PDF 文件。
它能做什么
给定一个 Markdown 文件和一张个人照片,一行命令生成自包含的 A4 简历 HTML:
| |
输出效果:
- A4 双页排版:内容自动压缩至刚好 2 页
- 自包含:照片以 base64 内嵌,无外部依赖
- 打印即用:浏览器打开后
Ctrl+P直接打印 - 视觉风格:蓝色主题(
#2a7ae2),论文编号 CSS counter 自动连续编号
技术细节
只有一个外部依赖
| |
用 python-markdown 做 Markdown → HTML 渲染,其余全部标准库。
Markdown Frontmatter
在 Markdown 文件头部用 --- 包裹的 frontmatter 提供元信息:
| |
intro 字段用 |(空格竖线空格)分隔多段,支持 HTML 标签。
模板系统
使用 template.html 作为 HTML 模板,占位符用 {{ }} 标记:
| 占位符 | 替换内容 |
|---|---|
{{ photo_data_uri }} | base64 照片 |
{{ intro_html }} | 简介段落 |
{{ body_html }} | Markdown 渲染内容 |
{{ header_name }} | 头部姓名 |
用 Python 字符串替换即可。
论文连续编号
CSS counter:不管论文按多少个年份 <h3> 分组,<ol> 被 Hugo/Hextra 的 markdown 渲染器在每个 ### 后重置,但 CSS counter 在 .cv-page 层面 counter-reset,每个 <li> 自动递增,实现跨年份连续编号 1-9:
| |
A4 尺寸控制
通过 CSS @page 和 !important override 精确控制:
| |
照片从 130px 缩到 90px,所有间距压缩,确保内容刚好落在 2 页 A4。
项目结构
cv-a4-generator/
├── generate.py # 主脚本
├── template.html # A4 HTML 模板 (CSS 全内嵌)
├── requirements.txt # markdown>=3.5
├── README.md # 主文档说明
└── test/
└── test_cv.md # 测试用 Markdown仓库地址
https://github.com/Chengy257/cv-a4-generator
欢迎 star / fork / issue。
最后更新于