将使用 `<section class="slide">` 约定的 HTML 幻灯片转换为高保真、矢量文本 PDF(使用 Playwright + Chromium 原生 PDF 功能)。
html-ppt-to-pdf是一项面向实际任务的技能,主要用于把 HTML 格式幻灯片转成矢量 PDF;文字是可选中可搜索的 live text(不是栅格化图片),字体以 subset 形式嵌入 PDF,页面尺寸和角标与原 HTML 一致;
它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
把 HTML 格式幻灯片转成矢量 PDF。文字是可选中可搜索的 live text(不是栅格化图片),字体以 subset 形式嵌入 PDF,页面尺寸和角标与原 HTML 一致。
用户手上有一份 HTML 幻灯片要导出成 PDF,典型来源:
html-ppt skill 产物(固定 1920×1080,有 runtime.js 注入 .slide-number)frontend-slides / frontend-design skill 产物(100vh 自适应,用 IntersectionObserver 触发 .visible class 做 reveal 动画)<section class="slide"> 约定过去踩过这些坑本 skill 都处理了:字体和原 HTML 不一致、页码 "101/22" 错乱、截图丢页/重页、frontend-slides 里非首屏 slide 内容全部隐形(.reveal 元素 opacity:0)。
不要用于:普通网页存 PDF(让用户用浏览器打印即可);Markdown 转 PDF(用 pandoc/typst);.pptx 转 PDF(用 pptx skill 或 LibreOffice)。
<section class="slide">;如果源 HTML 用别的 class(.deck-slide、.page 等),传 --slide-selector100vh 自适应,脚本会用 viewport 强制 1920×1080 排版(保证 16:9)# 第一次用先装依赖(只需一次)
cd ~/.myagents/skills/html-ppt-to-pdf/scripts
npm install
npx playwright install chromium # 仅作最后兜底
# 执行转换
node ~/.myagents/skills/html-ppt-to-pdf/scripts/html-to-pdf.mjs <input.html> <output.pdf>
# 自定义尺寸
node ~/.myagents/skills/html-ppt-to-pdf/scripts/html-to-pdf.mjs input.html out.pdf --width 1280 --height 720
强烈推荐系统装 Chrome 或 Edge。脚本默认自动用系统 Chrome/Edge 出 PDF——Playwright 自带的 Chromium(build 1208 实测)有 page.pdf() 绘制 bug:遇到 display:flex; flex-direction:column + 内联 opacity:0; transform:translateY() 的 reveal-card 结构时会静默丢内容(屏幕/截图正常,唯独 PDF 丢)。系统 Chrome 无此问题。若系统未装 Chrome/Edge,脚本会 fallback 到 bundled Chromium 并打警告。
不要走"截图合成 PDF"。那条路线(html-ppt/scripts/render.sh + ImageMagick 拼 PDF)有三个硬伤:
runtime.js 动态注入的页码与截图时序冲突本 skill 用 Playwright 的 page.pdf(),由 Chromium 排版引擎一次性吐出多页矢量 PDF:
document.fonts.ready 再排版 → Chromium 把用到的字形 subset 嵌入 /FontFile2@page + page-break-after CSS → Chromium 原生分页,不存在循环.slide-number 的 data-current / data-total 修成正确值,解决 "101/22" 那种 DOM 硬写文本和 CSS ::before/::after 叠加的 bugposition: absolute; top: 0)→ 强制 position: static 把 slides 摊开height: 100vh)→ 用固定 px 尺寸覆盖 vh 单位.reveal + IntersectionObserver 加 .visible)→ 强制给每张 slide 加 .visible class,并把 .reveal 的 opacity/transform 设为终态,避免非首屏内容隐形.progress-bar、.nav-dots、.edit-toggle、.edit-hotzone 等不进 PDF跑完后必须验证(阿成踩过这些坑):
<section class="slide"> 的数量,不多不少见 ~/.myagents/skills/html-ppt-to-pdf/README.md。