ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用 Codex 把纯文本简历直接生成 PDF:一个轻量开源工作流

用 Codex 把纯文本简历直接生成 PDF:一个轻量开源工作流 1. 纯文本简历到 PDF卡住的从来不是内容写简历最耗时的环节往往不是回忆项目经历而是把内容塞进某个模板、调字号、对齐、导出再发现分页把一段经历劈成两半。你手里明明有一份 Markdown 或纯文本信息齐全但一到「变成能投递的 PDF」这一步就开始在 Word、在线编辑器、截图工具之间来回折腾。我这次要拆的是一个很克制的开源思路让 Codex 读取仓库里的约束文档和 HTML 模板把纯文本简历生成 HTML再用 Chromium headless 打印成 PDF。它适合两类人习惯用 Markdown 管理内容的开发者以及想把简历纳入本地 Git 工作流的求职者。核心检索词就三个——Codex、PDF、HTML外加 Chromium 和开源工作流。它不是什么在线简历平台也没有账户体系。整个链路是内容层用纯文本维护模板层用 HTML 约束版式导出层统一交给 Chromium。这样做的好处是内容和样式解耦改一段经历不会牵动整页排版导出结果也落在本地目录方便反复修改。下面我按「可复制配置 → 验证 → 排错」的顺序走一遍你可以直接跟着操作。2. 前置准备TaoToken 与 Codex 的接入位置Codex 这类编码代理要稳定跑起来关键是给它一个可用的模型接入点。我这边用的是 TaoToken 的 API 通道官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 这个地址不加 UTM。你需要先拿到一个 API Key。进入控制台的 API Keys 页面创建https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。创建后复制那串 key后面配置环境变量要用。如果你只是想先验证模型能不能正常对话可以打开模型对话页试一句https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。确认返回正常再往下做本地工作流。长期跑编码和 Agent 任务的话Coding Plan 会更省心入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 配置细节以文档为准。注意API Key 只放在本地环境变量里不要写进仓库、不要提交到 Git。简历仓库虽然是个人项目但 key 泄露的风险一样存在。3. 可复制配置仓库骨架与 Codex 约束先建目录。这个工作流的核心不是脚本多而是约束文件写得清楚。结构如下resume-workspace/ ├── AGENTS.md ├── resume_design_summary.md ├── examples/ │ ├── profile.md │ └── resume.html └── output/ └── profile.mdAGENTS.md是给 Codex 的任务约束规定它生成前必须读哪些文件、产物放哪里。内容可以这样写# 简历生成约束 ## 生成前必须阅读 1. resume_design_summary.md设计说明 2. examples/profile.md输入内容组织方式 3. examples/resume.htmlHTML 模板参考 ## 输出规则 - 所有产物统一写入 output/ 目录 - 先生成 output/profile.md再生成 output/resume.html - 不得修改 examples/ 下的任何文件 ## 结构约束 - 必须保留 avatar-container 与 avatar-placeholder 结构 - 基本信息区保持左右布局左侧个人资料右侧证件照占位 - 模块标题使用渐变梯形视觉resume_design_summary.md负责视觉和结构要求把「顶部标题区怎么组织、模块标题什么风格、证件照区必须保留」这些写死。这一步很关键Codex 不是从零设计简历而是在已有样例附近生成约束越具体结果越稳。examples/profile.md放一份示例内容定义输入的大致组织方式# 张默 ## 基本信息 - 电话138XXXX8899 - 邮箱zhangmoexample.com - 求职方向Agent 开发工程师 ## 技能 - 语言Python / TypeScript / Go - 框架LangChain / FastAPI ## 项目经历 ### 智能问答助手 - 负责检索链路与提示词编排 - 将首响延迟从 2.1s 降到 0.8sexamples/resume.html放一份打印友好的模板页面尺寸和边距按 A4 设置模块标题用渐变梯形四角加几何装饰。模板里保留证件照占位div classavatar-container div classavatar-placeholder照片/div /div环境变量这样配把 key 注入当前 shellexport TAOTOKEN_API_KEY你的_API_Key export OPENAI_BASE_URLhttps://taotoken.net/api export OPENAI_API_KEY$TAOTOKEN_API_KEY然后在项目根目录启动 Codexcd resume-workspace codex --yolo--yolo表示让它自动执行文件读写适合这种本地小仓库。启动后直接粘贴你的纯文本简历并补一句「按 AGENTS.md 的约束生成到 output/」。Codex 会先读设计说明再参考 examples产出output/profile.md和output/resume.html。4. 验证请求Chromium 打印与结果检查HTML 出来后用 Chromium headless 打印成 PDF。命令如下chromium --headless --disable-gpu \ --no-pdf-header-footer \ --print-to-pdfoutput/resume.pdf \ file:///absolute/path/to/output/resume.html几个参数值得说明--headless走无界面渲染--disable-gpu避免部分环境下的渲染异常--no-pdf-header-footer去掉默认页眉页脚--print-to-pdf指定输出路径。注意file://后面必须是绝对路径相对路径在 headless 模式下经常找不到文件。打印完成后检查三件事PDF 是否生成、页数是否合理、证件照占位区是否还在。可以用命令行快速确认ls -lh output/resume.pdf pdfinfo output/resume.pdf | grep Pages如果pdfinfo没装直接打开 PDF 目测也行。重点看分页有没有把一段项目经历劈开以及基本信息区是不是保持了左右布局。实测下来只要模板的打印边距设对A4 下一般不会出现内容溢出。想验证模型通道是否正常可以在生成前先用模型对话页发一句测试https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。如果那边返回正常本地 Codex 报连接错误问题多半出在环境变量或 base URL 上。5. 本篇常见错排查报错一chromium: command not found。不同系统下可执行文件名不一样macOS 上可能是chromium或/Applications/Chromium.app/Contents/MacOS/ChromiumLinux 上常见chromium-browser。先用which chromium chromium-browser确认再替换命令里的名字。报错二PDF 生成了但内容空白。多半是file://路径写错或者 HTML 里引用了外部 CSS 却没打包进去。把模板样式内联到style标签里避免依赖外部文件。报错三Codex 没读约束直接自由发挥。检查AGENTS.md是否在项目根目录以及启动 Codex 时的工作目录是不是仓库根。约束文件不在根目录代理可能扫不到。报错四证件照区被删掉基本信息变成纯文字流。这是模板稳定性问题。在resume_design_summary.md里把「必须保留 avatar-container 和 avatar-placeholder」写成硬约束并在生成后目测检查。报错五API 返回 401 或连接超时。先确认OPENAI_BASE_URL是https://taotoken.net/api没有多余斜杠再确认 key 没有过期。接入细节对照文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。报错六分页把经历劈开。在 CSS 里给经历模块加break-inside: avoid;让 Chromium 尽量不拆分该块。这个属性在打印场景下比page-break-inside更现代。6. 把简历纳入本地工作流之后这套流程跑顺之后改简历就变成了改output/profile.md然后重新让 Codex 生成 HTML、重新打印。内容归内容样式归样式Git 里只跟踪文本和模板PDF 作为产物随时可重建。如果你后面要长期跑这类编码和 Agent 任务Coding Plan 的额度模型会更适合持续使用https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入和排障遇到问题优先翻文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。需要新建或轮换 key去控制台https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。最后留一个我踩过的坑--print-to-pdf的输出路径如果目录不存在Chromium 不会自动创建直接报错退出。先mkdir -p output再打印能省掉一次莫名其妙的失败。
返回列表