
这次的目标是根据一张参考图生成一页可编辑的 PPTX文字可改、图形可替换版式尽量贴近原图。我的思路不直接让 GPT “画一张图”而是让它走一条更可控的链路参考图 → 版式识别 → 字体/图片环境检查 → python-pptx 生成 → 校验 → 输出可编辑 .pptx这样生成的不是截图而是真正的 PPTX 文件打开后可以继续改文字、换配色、调整图形。关键步骤1. 先看工作区里有什么文件pwdrg--files-g*.png-g*.jpg-g*.pptx-gAGENTS.md.这一步主要是确认参考图、已有 PPTX、配置文件是否都在工作区里。2. 查 PPT 生成 API 文档cat$CODEX_PRIMARY_RUNTIME_NODE_MODULES/oai/artifact-tool/docs/presentations/api/API_DOCS.mdcat$CODEX_PRIMARY_RUNTIME_NODE_MODULES/oai/artifact-tool/docs/presentations/api/references/rich-text.spec.md这里会看生成 PPT 时支持哪些元素比如标题、正文、形状、图片、备注等。3. 检查中文字体fc-list :langzh family|sort-u中文 PPT 很容易踩字体坑所以要先确认环境里有没有可用的中文字体。4. 查找 CJK / 黑体类字体rg--files$CODEX_PRIMARY_RUNTIME_ROOT-g*.ttf-g*.otf-g*.ttc\|rgCJK|[Ss]ans[Ss][Cc]|[Ss]ans[Hh]ans|[Aa]rial|[Mm]icrosoft|[Ww]qy如果要用中文排版优先找 Noto Sans SC、思源黑体、微软雅黑、WenQuanYi 这类字体。5. 查看运行时字体加载逻辑ls$CODEX_PRIMARY_RUNTIME_ROOT/dependenciesrg--files$CODEX_PRIMARY_RUNTIME_ROOT|rg-ifont|cjk|tail-35sed-n1,160p/root/.codex/skills/builtins/presentations/container_tools/runtime_helpers.mjs这一步是为了确认 PPT 生成流程里字体是怎么注册、怎么加载的。6. 检查字体相关代码rg-nfont|Font/root/.codex/skills/builtins/presentations/container_tools/artifact_tool_utils.mjs|head-45ls/usr/share/fonts rg--files/usr/share/fonts|head-15rg--files$CODEX_PRIMARY_RUNTIME_NODE_MODULES|rg-iCJK|NotoSansSC|\.ttc|head-15如果环境里没有合适的中文字体生成的中文可能会显示异常所以这里要重点确认。7. 查看构建校验结果catbuild/validation.json用来确认之前的生成或校验有没有报错。8. 分析 artifact 工具内部逻辑frompathlibimportPathimportos,re pPath(os.environ[CODEX_PRIMARY_RUNTIME_NODE_MODULES])/oai/artifact-tool/dist/artifact_tool.mjssp.read_text()fortermin[FONT,fontPaths,loadFonts,registerFont,fontDirectory,FONTCONFIG,GlobalFonts]:matcheslist(re.finditer(term,s))print(term,len(matches))forminmatches[:3]:print(s[max(0,m.start()-130):m.end()220])这段脚本用来快速定位 PPT 生成工具里和字体相关的函数。9. 查看核心生成函数frompathlibimportPathimportos s(Path(os.environ[CODEX_PRIMARY_RUNTIME_NODE_MODULES])/oai/artifact-tool/dist/artifact_tool.mjs).read_text()is.find(function hqt())print(s[i-1400:i6500])找到核心函数后可以判断它是否支持文本框、形状、图片、备注等元素。10. 执行生成$CODEX_PRIMARY_RUNTIME_NODEbuild/create.mjsbuild/run.log21tail-c1300build/run.log这里真正触发 PPTX 生成并把日志输出到build/run.log。11. 校验字体文件fromfontTools.ttLibimportTTFont fTTFont(fonts/DroidSansFallback.ttf)print(f[OS/2].__dict__)print(f[hhea].__dict__)如果生成结果里中文显示异常可以用fontTools检查字体是否完整、是否包含中文字形。12. 查看最终日志tail-n3build/run.log|cut-c1-200确认最后几步有没有报错。13. 应用补丁并输出文件{path:/connector_openai_library/implicit_link::connector_openai_library/create_library_file,args:{file:/workspace/scratch/0b5208d9034e/output/入职感悟与成长体会_可编辑.pptx,library_artifact_type:slides}}这一步把生成的 PPTX 注册为可下载或可引用的产物。14. 写入扩展属性python3 /workspace/scratch/0b5208d9034e/build/library_file_transfer.py apply-xattrs\/workspace/scratch/0b5208d9034e/output/入职感悟与成长体会_可编辑.pptx\libfile_9d7bf7ba58e48191907930c0f4174794JSON [{name:user.library-file-version,value:0}] JSON给输出文件加上版本标记方便后续追踪。最终输出生成后的文件路径是/workspace/scratch/0b5208d9034e/output/入职感悟与成长体会_可编辑.pptx它是一个真正的 PPTX不是图片。打开后可以继续编辑文字、调整图形、替换配色。踩坑提醒中文优先确认字体没有中文字体时中文可能变成方框或默认字体。不要只靠截图还原截图只能参考版式真正可编辑要靠 PPTX 元素生成。生成后要校验至少打开确认文字、图片、版式是否正常。复杂版式建议分步先做标题区再做内容区最后加图形和图片。命令和脚本都按语言加了语法高亮。1. 查看工作区文件pwdrg--files-g*.png-g*.jpg-g*.pptx-gAGENTS.md.2. 查看 PPT 生成 API 文档cat$CODEX_PRIMARY_RUNTIME_NODE_MODULES/oai/artifact-tool/docs/presentations/api/API_DOCS.mdcat$CODEX_PRIMARY_RUNTIME_NODE_MODULES/oai/artifact-tool/docs/presentations/api/references/rich-text.spec.md3. 检查中文字体fc-list :langzh family|sort-u4. 查找 CJK / 黑体类字体rg--files$CODEX_PRIMARY_RUNTIME_ROOT-g*.ttf-g*.otf-g*.ttc\|rgCJK|[Ss]ans[Ss][Cc]|[Ss]ans[Hh]ans|[Aa]rial|[Mm]icrosoft|[Ww]qy5. 查看运行时字体加载逻辑ls$CODEX_PRIMARY_RUNTIME_ROOT/dependenciesrg--files$CODEX_PRIMARY_RUNTIME_ROOT|rg-ifont|cjk|tail-35sed-n1,160p/root/.codex/skills/builtins/presentations/container_tools/runtime_helpers.mjs6. 检查字体相关代码rg-nfont|Font/root/.codex/skills/builtins/presentations/container_tools/artifact_tool_utils.mjs|head-45ls/usr/share/fonts rg--files/usr/share/fonts|head-15rg--files$CODEX_PRIMARY_RUNTIME_NODE_MODULES|rg-iCJK|NotoSansSC|\.ttc|head-157. 查看构建校验结果catbuild/validation.json8. 分析 artifact 工具内部逻辑frompathlibimportPathimportos,re pPath(os.environ[CODEX_PRIMARY_RUNTIME_NODE_MODULES])/oai/artifact-tool/dist/artifact_tool.mjssp.read_text()fortermin[FONT,fontPaths,loadFonts,registerFont,fontDirectory,FONTCONFIG,GlobalFonts]:matcheslist(re.finditer(term,s))print(term,len(matches))forminmatches[:3]:print(s[max(0,m.start()-130):m.end()220])9. 查看核心生成函数frompathlibimportPathimportos s(Path(os.environ[CODEX_PRIMARY_RUNTIME_NODE_MODULES])/oai/artifact-tool/dist/artifact_tool.mjs).read_text()is.find(function hqt())print(s[i-1400:i6500])10. 执行生成$CODEX_PRIMARY_RUNTIME_NODEbuild/create.mjsbuild/run.log21tail-c1300build/run.log11. 校验字体文件fromfontTools.ttLibimportTTFont fTTFont(fonts/DroidSansFallback.ttf)print(f[OS/2].__dict__)print(f[hhea].__dict__)12. 查看最终日志tail-n3build/run.log|cut-c1-20013. 应用补丁并输出文件{path:/connector_openai_library/implicit_link::connector_openai_library/create_library_file,args:{file:/workspace/scratch/0b5208d9034e/output/入职感悟与成长体会_可编辑.pptx,library_artifact_type:slides}}14. 写入扩展属性python3 /workspace/scratch/0b5208d9034e/build/library_file_transfer.py apply-xattrs\/workspace/scratch/0b5208d9034e/output/入职感悟与成长体会_可编辑.pptx\libfile_9d7bf7ba58e48191907930c0f4174794JSON [{name:user.library-file-version,value:0}] JSON