跳到正文
cccskills
免费在 GitHub 公开中文介绍

pptx-html-fidelity-audit

将HTML生成的PPTX与源文件对照,检查文字裁切、页脚重叠及斜体丢失等问题。整理原因,调整布局规则,再次导出并验证是否越界。

原文查看原文说明

Audit a python-pptx export against its source HTML deck, identify layout/content drift (footer overflow, cropped content, missing italic/em, lost styling, off-rhythm spacing), and re-export with strict footer-rail + cursor-flow layout discipline. Use this skill whenever the user has a .pptx that was generated from an HTML slide deck and asks to compare/audit/verify/fix the export — including phrases like "compare ppt with html", "fidelity audit", "fix the pptx", "ppt is cut off", "footer overlap", "italic missing in pptx", "re-export the deck", "pptx-html-fidelity-audit", or any case where a python-pptx → HTML round-trip needs verification or repair. Also trigger when the user shows you a deck.html and a deck.pptx side by side and is debugging visual differences.

集成工具PowerPoint
AI 评分80分/ 100查看安装方法

适用场景

  • 对比HTML与已导出的PPTX
  • 修复文字裁切和页脚重叠
  • 调查斜体丢失和字体变化
  • 验证重新导出后的越界问题

中文介绍

功能

pptx-html-fidelity-audit将HTML幻灯片与其生成的PPTX对照,检查内容和布局偏差。它会提取每个形状的位置、尺寸和文字格式,将文字裁切、页脚重叠、斜体或颜色丢失等问题按严重程度整理成表格。随后找出共同原因,设置正文区域的下边界,并按从上到下的顺序排列内容块,再次导出文件。

适用场景

适用于HTML中排版正常,转换成PowerPoint文件后却出现错位的情况。除了修正单张幻灯片,也可以检查导出流程中的共性问题,例如居中方式和间距的确定规则。

使用示例

  • “请比较deck.html和deck.pptx,修复文字裁切及页脚重叠。”
  • “请检查HTML中的斜体是否保留在PPTX中,并重新导出修正版。”

注意事项

需要同时提供源HTML和已生成的PPTX。提取与布局验证使用python-pptx。数值验证检查的是形状是否越界;字体渲染和字间距问题可能需要通过截图进行目视检查。

本介绍由 AI(OpenAI Codex)根据公开的 SKILL.md 撰写。准确的规格请查看下方原文。

客观评估

AI 仅根据 SKILL.md 的内容,从 4 个方面进行了评估。星标数和热度不计入评估。

指令清晰度能否看出何时使用、做什么
A良好资料明确列出了对比修复HTML生成的PPTX的适用条件和检查问题。
步骤具体性步骤、输入输出和示例是否具体
A良好资料提供了提取命令、严重程度表、布局常量和内容块排列代码。
安全性发送数据、删除文件、执行命令等是否有说明
B部分不足流程会执行提取脚本并重新导出文件,但未说明覆盖现有文件前的确认步骤。
安装难易度所需工具和 API 密钥是否少且有说明
B部分不足需要HTML、PPTX和python-pptx,但未提供依赖项安装步骤。

总分按每项 A=25 分、B=15 分、C=5 分相加。 由 AI(OpenAI Codex)于 2026年10月20日 评估。仅供参考,安装前请同时查看原文。

如果您认为评估有误,请申请复核

请写明哪一项有误以及原因。无需登录。我们会对照 SKILL.md 重新评估,并在此处更新结果。

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

包含的文件(7)

  • SKILL.md13.8 KB
  • references/audit-table-template.md2.9 KB
  • references/font-discipline.md15.9 KB
  • references/layout-discipline.md14.5 KB
  • scripts/.gitignore19 B
  • scripts/extract_pptx.py4.3 KB
  • scripts/verify_layout.py5.5 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

PPTX ↔ HTML Fidelity Audit

A repeatable workflow for catching the ways a python-pptx export silently drifts from its HTML source — and fixing them with a layout discipline that prevents the same regressions on the next pass.

When this skill applies

The user has:

  • A source HTML slide deck (typically a single-file deck with <section class="slide"> blocks):

    <section class="slide light">
      <div class="chrome">2026 · Q2 review</div>
      <span class="kicker">Pillar 03</span>
      <h2 class="h-xl">Shipping <em>velocity</em> doubled</h2>
      <p class="lead">…</p>
      <div class="foot">page 5 / 14</div>
    </section>
    
  • A PPTX file generated from that deck via python-pptx (or similar).

  • A suspicion (or visible evidence) that the PPTX doesn't match the HTML — text bleeding into the footer, italic words gone flat, hero slides not centered, sections cropped, tag styling lost.

If the user only has one of those two artifacts, this skill doesn't apply yet — first generate the missing one, or ask the user to provide it.

Why this is hard (and why a skill helps)

PPTX is a fixed-canvas, absolute-positioned medium. HTML is a fluid, flow-based medium. A naive python-pptx export pins each block at hand-picked (top, left) coordinates, which works for the first slide it was tested on and silently fails for every other slide whose content has different intrinsic height. The result is the most common drift modes:

  1. Footer overflow — content's top + height crosses into the footer row.
  2. Off-canvas content — bottom of last block exceeds 7.5" (16:9 canvas).
  3. Italic loss — <em> in HTML never gets run.font.italic = True.
  4. Hero slides not centered — vertical-stack slides use MARGIN_TOP instead of computing center.
  5. Box bounds intruding — the text fits, but the shape's bounding box is oversized and visually crosses the rail.
  6. Tag/styling loss — colored chrome rows, kicker uppercase tracking, mono-vs-serif assignments quietly fall back to defaults.

Every one of these is a layout discipline problem, not a content problem. Once you adopt the discipline, they stop happening.


Workflow

The audit is five steps. Don't skip any of them — the discipline only works if the audit produces a real list of issues to drive the re-export. A fix-without-audit pass tends to leave half the issues alive.

Step 1 — Extract ground truth from the PPTX

Run scripts/extract_pptx.py <path-to.pptx> > pptx_dump.json. The script walks every shape on every slide and dumps text, position (top / left), size (width / height), and per-run typography (font name, size pt, bold, italic, color). This is the actual state of the export — don't trust the export script's intent, trust the dump.

For 14-slide decks, the dump is ~30–60 KB and human-readable.

Step 2 — Walk the HTML structure

Read the source HTML and enumerate <section class="slide"> blocks. For each, note:

  • The slide's theme (light / dark / hero light / hero dark).
  • The chrome row text (top metadata).
  • The kicker (small uppercase eyebrow above the headline).
  • The headline (h-hero / h-xl / etc.) and any sub-head.
  • The body copy and any structured blocks (pipeline steps, cards, pillars, observation cards).
  • The foot row (bottom metadata).
  • Any <em> or italic-styled spans — italic is the silent regression.

Map each HTML slide to a PPTX slide index. For decks following the convention "slide 1 = cover, slide N = closing", the mapping is positional.

Step 3 — Build the audit table

For each slide, walk shapes from the dump and check against expected layout rules. Use this exact table format — the severity column is what drives the fix priority:

| Slide | Issue | Severity |
|---|---|---|
| 1 cover | meta-row 底端 6.95" 蓋過 footer (6.7") | 🔴 |
| 5 checklist | row B 步驟描述底端 7.2" 切到 footer | 🔴 |
| 8 3E | 收束段落直接坐在 footer 起點 | 🔴 |
| 9 on-day | step 描述底端剛好碰 footer,無安全距 | 🟠 |
| 多處 | em (Playfair italic) 未保留 | 🟡 |

Severity rubric:

  • 🔴 critical — content cropped, text invisible, footer overlap, off-canvas. Must fix.
  • 🟠 high — content visible but visual hierarchy broken, no breathing room, hero not centered. Should fix.
  • 🟡 medium — italic/em missing, font fallback wrong, color drift. Fix in this pass.
  • 🟢 low — minor spacing/alignment, sub-pixel offsets. Note but don't block.

After the table, write a short root-cause section: 90 % of the issues usually come from 2–3 systemic causes (e.g. "no footer rail enforced", "hero stacks pinned to MARGIN_TOP instead of centered", "italic never propagated"). Naming the systemic causes makes the re-export script much smaller and more correct.

Step 4 — Re-export with footer-rail + cursor-flow layout discipline

This is the load-bearing technique. See references/layout-discipline.md for the full rules; the summary:

Define the rails up front, once, for the whole deck:

from pptx.util import Inches

CANVAS_W       = Inches(13.333)   # 16:9
CANVAS_H       = Inches(7.5)
MARGIN_X       = Inches(0.6)
MARGIN_TOP     = Inches(0.5)
CONTENT_MAX_Y  = Inches(6.70)     # NOTHING in content area may cross this
FOOTER_TOP     = Inches(6.85)     # footer row pinned here, edge-to-edge

Customizing the rails. The defaults above suit a 16:9 canvas with a slim footer. If your design system uses a wider footer or a 4:3 canvas, override these constants in your export script and pass the same values to verify_layout.py via --content-max-y / --canvas-h / --canvas-w. See references/layout-discipline.md §1 for the full constant table.

Use a cursor for content blocks instead of pinning each block at an absolute y:

class Cursor:
    """Advances down the slide; refuses to cross the footer rail."""
    def __init__(self, y_start, cap=CONTENT_MAX_Y):
        self.y = y_start
        self.cap = cap
    def take(self, h, gap=Inches(0.12)):  # ~1 line of whitespace at 14pt; tighten/loosen per design system
        top = self.y
        self.y = top + h + gap
        if self.y > self.cap:
            raise OverflowError(
                f"cursor at {self.y} exceeds footer rail {self.cap}; "
                f"reduce block height or split slide"
            )
        return top

For each slide, instantiate Cursor(MARGIN_TOP) and take(height) each block in reading order. The slide refuses to render if any block would cross the rail, so overflows become loud build errors instead of silent visual bugs.

Hero (vertically-centered) slides use a budget instead of a cursor:

def hero_layout(blocks):
    """blocks = list of (height, gap_after) tuples in reading order."""
    total = sum(h + g for h, g in blocks)
    y_start = (CANVAS_H - total) / 2
    return Cursor(y_start)

That single change kills "hero slide content sticks to top" — the most common hero defect.

Tighten box height to fit text + minimal padding. PowerPoint reveals shape bounds when they overlap (selection halos, Z-order conflicts), and an oversized box can visually cross the footer rail even when the text inside doesn't. Compute box height from text metrics + ~0.05" pad, not from generous wrappers.

Preserve italic / em explicitly:

def add_run(p, text, font, size_pt, italic=False, bold=False, color=None):
    r = p.add_run()
    r.text = text
    r.font.name = font
    r.font.size = Pt(size_pt)
    r.font.italic = italic
    r.font.bold = bold
    if color:
        r.font.color.rgb = color
    return r

When walking HTML, detect <em> / <i> / inline style font-style: italic and pass italic=True. Use the EN serif face (Playfair Display, Source Serif, or fallback Georgia) for italic display copy — the CJK serif typically has no italic and looks broken if you try to italicize it.

For deeper font issues that the layout rails can't catch — variable-font traps where PowerPoint silently swaps to Calibri / Microsoft JhengHei, missing <a:ea> slot causing CJK runs to fall back, fake-italic on Han characters — read references/font-discipline.md. The five layers there cover everything verify_layout.py can't see.

Step 5 — Verify post-export

After writing the new .pptx, run scripts/verify_layout.py <path-to.pptx>. The script:

  • Walks every shape on every slide.
  • Asserts top + height ≤ CONTENT_MAX_Y for content shapes (footer/page-number shapes are allowed below the rail).
  • Asserts top + height ≤ CANVAS_H for all shapes (no off-canvas).
  • Asserts left + width ≤ CANVAS_W and left ≥ 0.
  • Reports violations as a single block: slide index, shape name, observed bottom, rail.

Zero violations is the gate for "this re-export is shippable". Don't claim the audit is fixed without running the verifier — the human eye misses 1–2 mm overflow at zoom-out, the script doesn't.


Output to the user

After Step 5 passes, report:

  1. Audit table — the table from Step 3.
  2. Root causes — 1-paragraph systemic explanation.
  3. Fix list — terse list of what was changed and why (e.g. "hero slides switched to budget centering", "all content blocks routed through Cursor", "em runs explicitly italic").
  4. Verification — "0 rail violations across N slides, file size X KB".
  5. Path — absolute path to the re-exported .pptx.

The user is reading for two reasons: confirming the visible bugs are fixed, and trusting the systemic fix is right. Cover both.


Bundled resources

  • scripts/extract_pptx.py — dump every shape on every slide as JSON. Run before the audit. Important: also run on the original export to compare, and on the re-exported one to confirm.
  • scripts/verify_layout.py — post-export rail checker. Returns nonzero exit code on violations so it slots into a CI pipeline if needed.
  • references/layout-discipline.md — the full footer-rail + cursor-flow rule set with code snippets for each common slide type (hero, content, pipeline, two-column, observation grid).
  • references/font-discipline.md — five-layer font audit: mapping, presence, variable-vs-static traps, the three XML language slots (latin / ea / cs), CJK + Latin italic interaction.
  • references/audit-table-template.md — copy-pasteable table template with severity legend.

Read the references when:

  • The deck has slide types beyond what the SKILL.md covers (multi-column dashboards, embedded images, charts) → layout-discipline.md.
  • The audit shows 🟡 typography issues — italic missing, CJK falling back, unexpected Calibri / Microsoft JhengHei in the XML → font-discipline.md.
  • You want to drop the audit table directly into a report or markdown deliverable → audit-table-template.md.

Anti-patterns to avoid

  • Patching individual slides without naming the systemic cause. If you fix slide 5 by lowering its block by 0.2", you'll be back fixing slide 9, 11, and 14 next. Find the rule that produced all four problems.
  • Trusting the original export script's intent. Always run the extractor against the actual file. Drift between intent and reality is the bug.
  • Skipping verification because "it looked fine in PowerPoint preview". Preview anti-aliasing hides 1–2 mm overflows. The script doesn't.
  • Italicizing scripts that have no italic tradition. CJK, Arabic, Hebrew, Devanagari, Thai, and Khmer all produce a synthesized slant when forced into italic=True, and the result looks mechanically deformed. Italicize only runs whose primary script supports italic — Latin, Cyrillic, Greek. See references/font-discipline.md Layer 5 for the implementation pattern.
  • Using MARGIN_TOP for hero slides. Hero slides need budget centering, not top-anchored. This is the most common hero defect and the cheapest to fix.

Why geometry-based verification, not visual diff

An earlier iteration of this skill leaned on visual diffing — render the .pptx through Keynote → PDF → PNG, screenshot the HTML through Chrome headless, stitch them side-by-side with magick. It worked, but with three sharp drawbacks:

  • Platform lock-in. Keynote AppleScript is macOS-only; magick and font-discovery commands vary across OSes; CI pipelines on Linux can't reproduce the chain.
  • Imprecision. A 1-2 mm overflow gets anti-aliased away in a PNG preview. The human eye misses it; the script catches it as a hard numeric violation.
  • Setup cost. Every contributor needs the full graphics toolchain installed before they can audit. Geometry checks need only python-pptx.

Geometry-based verification gives up one thing the visual diff is good at: catching cases where shape positions are correct but the rendered glyph looks wrong (font fallback, kerning bugs, missing weight). When that case appears, fall back to a manual screenshot review — the five-layer audit in references/font-discipline.md covers most of the underlying causes.

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

8-bit-orbit-video-template

免费有简介AI 评分 90分

使用Hyperframes的HTML模板制作复古像素风格的三场景视频,替换标题、标签和配色,同时保留场景转换节奏及可重复的动画时序。

  • 制作像素风格的介绍视频
  • 替换三场景视频中的内容
  • 通过HTML预览场景转换
nexu-io/open-design10.3万2026年10月22日 更新

ad-creative

免费有简介AI 评分 80分

为社交媒体广告和搜索广告撰写标题、说明及正文,并反复调整措辞。可用于准备广告文案备选版本,以及检查现有文案并考虑修改方案。

  • 撰写社交媒体广告标题
  • 准备搜索广告说明
  • 修改广告正文措辞
nexu-io/open-design10.3万2026年10月22日 更新

after-hours-editorial-template

免费有简介AI 评分 80分

以深色背景和衬线字体制作时尚杂志风格的三页动态展示,结合文字逐步显现与章节转场,最终生成内嵌CSS和JavaScript的单个HTML文件。

  • 制作时尚杂志风格的动态介绍
  • 用三页展示简短故事
  • 将现有品牌风格融入深色版面
nexu-io/open-design10.3万2026年10月22日 更新

agent-browser

免费有简介AI 评分 100分

通过浏览器查看页面,执行点击、输入、截图和信息提取。主要用于检查OpenDesign的本地预览,以及核查网页应用的运行情况与质量。

  • 检查OpenDesign本地预览
  • 测试网页应用的点击和输入
  • 截取页面或元素图像
nexu-io/open-design10.3万2026年10月22日 更新

ai-music-album

免费有简介AI 评分 80分

用于AI音乐专辑制作,涵盖概念构思、歌词初稿、曲目排序和导出,适合独立专辑实验或品牌音乐企划;完整制作流程需另行安装上游资源包。

  • 策划独立制作的专辑
  • 围绕专辑主题起草歌词
  • 安排专辑曲目顺序
nexu-io/open-design10.3万2026年10月22日 更新

algorithmic-art

免费有简介AI 评分 80分

使用p5.js,根据计算规则与随机数创作生成艺术。固定随机种子即可重现相同画面,适合制作海报、表现动感的静态图像和艺术构图草案。

  • 根据规则制作海报
  • 创作具有动感的静态图像
  • 试验艺术作品的构图
nexu-io/open-design10.3万2026年10月22日 更新

查看 nexu-io 的全部技能

报告此技能的问题