ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

cwc-workshops render.ts源码走读:Docker中LibreOffice渲染PPTX为JPG全流程

cwc-workshops render.ts源码走读:Docker中LibreOffice渲染PPTX为JPG全流程 cwc-workshops render.ts源码走读Docker中LibreOffice渲染PPTX为JPG全流程【免费下载链接】cwc-workshops项目地址: https://gitcode.com/GitHub_Trending/cw/cwc-workshopscwc-workshops 是一个开源的 Agent 工作坊项目合集其中 eval-driven-agent-development 工作坊会用 Claude 托管 Agent 生成 PPTX 幻灯片再用 Docker 容器内的 LibreOffice 把 PPTX 逐页渲染成 JPG 图片供视觉评分器看图打分。本文带你完整走读 src/render.ts 这个不到 80 行的小文件弄明白一个 pptx 文件如何变成一组 JPG的全过程。为什么要把 PPTX 渲染成 JPG生成的幻灯片是一个 .pptx 压缩包直接看它需要办公软件。而工作坊里的评分流程eval希望像人一样逐页检查布局是否拥挤、字号是否过小、有没有配图……解决办法先把幻灯片变成图片。整体链路是output.pptx ──Docker容器── PDF ── slide-1.jpg / slide-2.jpg / ... (soffice) (pdftoppm)输入runs/ 目录下每个任务的output.pptx输出runs/task/render/目录下一组slide-N.jpg消费者src/eval-runner.ts 中的评分上下文构建函数以及 src/graders.ts 里的 LLM 视觉评委把渲染放进 Docker 还有个隐藏好处跨机器结果一致——字体、LibreOffice 版本都被锁死在镜像里。第一步构建渲染镜像 cwc-pptx-render在跑代码之前需要先用一条命令构建镜像见 README.md 的 Setup 章节docker build -t cwc-pptx-render .这个镜像由工作坊根目录的 Dockerfile 定义它基于debian:bookworm-slim安装了三样东西组件作用libreoffice无头模式把 pptx 转成 PDFpoppler-utils提供 pdftoppm把 PDF 逐页栅格化为 JPG一套字体Carlito / Liberation / Noto / Symbola兼容 Calibri、Arial 等常用字体的度量避免文字换行错位Dockerfile 最后还写了一段 fontconfig 配置把 Symbola 和 Noto Color Emoji 追加到所有字体族的回退链让特殊符号尽量不显示为方块。注意源码注释里提到的一个已知限制LibreOffice 的 VCL 层对彩色 emoji 渲染不稳定所以 emoji 密集的幻灯片建议在本地直接打开 pptx 查看。第二步走读 renderPptx 核心函数核心逻辑就在 renderPptx 函数签名很简单传入 pptx 路径和输出目录返回按页码排好序的 JPG 路径列表。1️⃣ 路径解析为挂载做准备函数先做四件小事L24-L28path.resolve把输入和输出都变成绝对路径Docker 挂载必须是绝对路径拆出目录名inputDir、文件名basename、去掉扩展名的主干stem为什么拆stem因为 LibreOffice 转换出的 PDF 文件名 输入文件名去掉扩展名。比如output.pptx会变成/tmp/output.pdf后一步的 pdftoppm 需要知道这个精确名字。2️⃣ 组装 docker run 命令这是整个文件的精华L38-L53逐参数解读参数含义run --rm跑完即删容器不留垃圾--pullnever不联网拉镜像——镜像缺失就快速报错而不是偷偷去 Docker Hub 拉一个可能不对的版本-v inputDir:/in:ro幻灯片所在目录只读挂载到/in-v absOut:/out输出目录挂载到/out容器写、宿主机收sh -c ...容器内执行两步转换sh basename stem文件名作为位置参数$1、$2传入两个值得学习的小设计只读挂载容器只能读输入、只能写/out权限边界清晰文件名走位置参数而不拼进脚本字符串即使文件名里带空格或特殊 shell 字符也不会破坏脚本执行——这是一个防注入的惯用手法容器内执行的实际命令只有两步L49soffice --headless --convert-to pdf --outdir /tmp /in/$1 \ pdftoppm -jpeg -r 120 /tmp/$2.pdf /out/slide第一步soffice --headless是无界面模式不需要显示器把 pptx 转成 PDF第二步pdftoppm -jpeg -r 120把 PDF 按 120 DPI 逐页输出为slide-1.jpg、slide-2.jpg……120 DPI 对 A4 幅面的幻灯片大约是 1000 像素宽足够评委模型看清布局细节又不至于文件太大。3️⃣ 收集结果并数字排序最后从输出目录读出所有 jpg 文件L57-L61用正则\.jpe?g$过滤出图片文件排序时用了localeCompare(b, undefined, { numeric: true })—— 数字排序模式保证slide-10.jpg排在slide-9.jpg之后而不是按字典序排在slide-1.jpg后面这个细节很关键评委看到的页序错了第 3 页标题与正文不匹配之类的评分就会错位。第三步一条命令体验完整流程不需要等 Agent 生成直接对已有的产物渲染也行。package.json 里定义了render脚本npm run render -- technology它对应 render.ts 底部的独立 CLI 入口校验任务 id 是否存在 → 渲染runs/technology/output.pptx→ 打印rendered N slides。渲染出的 JPG 可以直接丢进任何看图软件翻页检查。在评分流程中的位置渲染不是孤立的它是评分流水线的一环见 eval-runner.ts 的 buildContextparsePptx解包 pptx本质是 XML 压缩包提取每页的形状数、文字长度、字号等结构指标renderPptx产出 JPG供视觉类评委使用各评委code 型 LLM 评委型基于这份上下文打分结果写入score.json注意一个防御性细节eval-runner 在渲染前会先删掉旧的 render 目录L57-L67——因为如果留着上次output.pptx的渲染结果评委就会给旧幻灯片打分。小结这段源码教会我们的 4 个技巧 把重的、环境敏感的依赖锁进容器LibreOffice 字体版本完全可复现--pullnever快速失败缺镜像立刻报错好过静默拉错版本参数传递代替字符串拼接$1/$2位置参数规避 shell 注入数字排序保页序numeric: true是处理file-10类命名的必备项整套渲染逻辑不到 80 行却把pptx 到 JPG这条链路做得既安全又可复现——这也是 cwc-workshops 这个工作坊想要传达的eval 系统的每个环节都可以这样小而清楚地实现。【免费下载链接】cwc-workshops项目地址: https://gitcode.com/GitHub_Trending/cw/cwc-workshops创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表