NotebookLM风格:Slide Deck 生成器(HTML)工程落地指导手册
AI 导读
NotebookLM风格:Slide Deck 生成器(HTML)工程落地指导手册 目标:复现“任意风格适配 + 排版稳定出色”的底层工程逻辑,产出可渲染为 HTML(并可导出 PDF / PPTX)。 核心策略:风格(Tokens) 与 排版(模板+约束引擎) 解耦,靠 确定性布局 + 验证与修复回路 保证稳定观感。 目录 1. 目标与边界 2. 总体架构与数据流 3. 仓库结构建议 4....
NotebookLM风格:Slide Deck 生成器(HTML)工程落地指导手册
目标:复现“任意风格适配 + 排版稳定出色”的底层工程逻辑,产出可渲染为 HTML(并可导出 PDF / PPTX)。
核心策略:风格(Tokens) 与 排版(模板+约束引擎) 解耦,靠 确定性布局 + 验证与修复回路 保证稳定观感。
1) 目标与边界
- 风格无穷:通过 Theme Tokens(颜色/字体/间距/形状/插画风格)快速换肤
- 排版稳定:文字不溢出、不重叠,对齐/留白一致
- 两种密度:Presenter(少字更演讲)/ Detailed(信息更完整)
- 可复用:同一套 IR 可以输出 HTML、PDF、PPTX
- 完全自由的“无模板”生成(极易溢出、不可控)
- 把关键文字画进图片(不可检索、不可编辑、跨语言更崩)
- 100% 复刻某个闭源产品内部实现(我们做的是工程等价方案)
成败关键
| 能力 | 决定因素 | 工程抓手 |
|---|---|---|
| “适应任何风格” | 风格注入是否可执行 | Tokens +(可选)brandbook/样例 deck 抽取 tokens |
| “排版非常出色” | 是否由确定性系统掌控像素级布局 | 模板库 + 文字测量 + 约束布局 + 回退策略 |
| “任何内容都能做” | 内容结构化程度 + 模板覆盖面 | Slide IR(意图/组件树)+ 30~80 模板覆盖常见意图 |
2) 总体架构与数据流
原则 2布局由确定性引擎完成(可测量、可验证、可修复)
原则 3风格由 tokens 注入(换肤不改变排版算法)
推荐流水线
Inputs (Sources + Prompt + Brandbook/Sample Deck)
|
v
[1] Content Planner ----> Slide Outline (IR v0)
|
v
[2] Style Builder ----> Theme Tokens
|
v
[3] Slide Composer ----> Component Tree per slide (IR v1)
|
v
[4] Layout Engine ----> BBoxes + font sizes + line breaks (Layout IR)
|
v
[5] Renderer ----> HTML / PDF / PPTX
|
v
[6] Validators ----> Issues
|
v
Repair Loop (rules + LLM rewrite + template swap + split slides)
关键中间产物
- Slide IR:每页意图、组件树、文本块、数据、媒体占位(不含像素)
- Theme Tokens:颜色/字体/间距等可执行风格参数
- Layout IR:bbox(x,y,w,h)、字号、行高、换行结果(最终可渲染)
3) 仓库结构建议
deckgen/
packages/
core-ir/ # IR types + schema + validators
planner/ # Content Planner (LLM prompts + postprocess)
style/ # tokens + brandbook/sample extractor
templates/ # template DSL + template library
layout/ # deterministic layout engine
renderer-html/ # HTML renderer (Layout IR -> DOM/CSS)
exporter-pdf/ # Playwright/Puppeteer export
exporter-pptx/ # PptxGenJS export
cli/ # deckgen build --input ... --out ...
apps/
studio-web/ # web UI: preview + edit + re-run repair
tools/
visual-regression/ # screenshot diff
perf/ # benchmarks
docs/
manual.html # 本手册
4) 核心数据模型(IR / Tokens / Templates)
4.1 Slide IR(推荐字段)
{
"deck": {
"meta": { "title": "string", "language": "zh-CN", "mode": "presenter|detailed" },
"themeRef": "theme.default",
"slides": [
{
"id": "s1",
"intent": "cover|section|concept|comparison|process|timeline|data|quote|summary",
"title": "string",
"subtitle": "string?",
"bullets": ["string", "..."],
"notes": "string?",
"assets": [
{ "type": "image|icon|chart", "ref": "assetId", "styleHint": "flat|handdrawn|..." }
],
"data": { "type":"table|series", "payload": {} },
"constraints": {
"maxBullets": 5,
"tone": "formal|playful|...",
"emphasis": ["key phrases..."]
}
}
]
}
}
4.2 Theme Tokens(风格可执行化)
{
"themeId": "theme.corpA",
"palette": {
"bg": "#0B1220",
"text": "#E6EDF3",
"primary": "#7AA2FF",
"secondary": "#34D399",
"accent": "#FBBF24",
"surface": "#101826",
"line": "#22324A"
},
"typography": {
"titleFont": "Inter",
"bodyFont": "Inter",
"monoFont": "JetBrains Mono",
"scale": { "h1": 44, "h2": 32, "h3": 24, "body": 18, "small": 14 },
"weight": { "title": 700, "body": 450 }
},
"spacing": { "grid": 8, "safeMargin": 48, "gap": 16, "lineHeight": 1.25 },
"shape": { "radius": 16, "stroke": 1, "shadow": "soft" },
"imagery": { "style": "flat", "grain": 0.1, "bgPattern": "none" },
"charts": { "axis": "minimal", "labels": "compact" }
}
4.3 Template DSL(结构+约束,不写死风格)
{
"templateId": "concept.2col.imageRight",
"intent": "concept",
"grid": { "cols": 12, "rows": 12, "safe": 48 },
"slots": [
{ "name": "title", "type": "text", "area": [1,1,7,2], "styleRole": "h2" },
{ "name": "bullets", "type": "list", "area": [1,3,7,8], "styleRole": "body", "maxLines": 10 },
{ "name": "visual", "type": "media", "area": [8,2,11,10], "fit": "cover", "minVisible": 0.6 }
],
"constraints": {
"align": "baselineGrid",
"minGap": 16,
"noOverlap": true
}
}
5) 模块落地指南
5.1 Content Planner(内容规划)
- 输入:Sources(片段/引用/表格)+ 用户 prompt(受众/语气/长度/风格)
- 输出:Slide IR v0(按 intent 分页,严格控制每页信息量)
- 强制规则:每页 bullet 句长上限、数量上限;必要时拆页
// 典型 Planner 输出约束(伪码)
if mode == "presenter":
maxBullets = 4; maxWordsPerBullet = 12
else:
maxBullets = 6; maxWordsPerBullet = 18
5.2 Style Builder(风格构建)
- 最小可行:prompt → tokens 映射(比如 “极简/科技/复古/手绘” 到预置 token 集)
- 进阶:brandbook(文本)解析出色值/字体/间距;sample deck 统计常用版式密度
5.3 Slide Composer(组件树组装)
- 根据 intent 从模板池选 3~5 个候选模板(score:内容类型匹配、媒体可用、密度合适)
- 把 IR 内容填充到 slots:title/bullets/visual/chart/quote...
- 输出 IR v1:明确每个 slot 内容来源与优先级(后续可裁剪)
5.4 Layout Engine(确定性排版)
- 输入:Template + Theme Tokens + IR 内容
- 输出:Layout IR(每个元素 bbox、字号、换行、裁剪)
- 必要能力:文字测量、换行、溢出回退(缩字/删点/换模板/拆页)
5.5 Renderer(HTML 渲染)
- Layout IR → DOM:每个元素绝对定位或 CSS grid 定位
- tokens → CSS variables:统一主题与组件样式
- 确保可截图(导出 PDF)与可编辑(后续支持拖拽微调)
6) 确定性排版引擎细节(最关键)
6.1 网格与安全边距
- 画布:16:9(例如 1920x1080)或 4:3,统一抽象为“单位坐标系”
- safe margin:默认 48px(或 tokens.safeMargin)
- baseline grid:8px(或 tokens.spacing.grid)吸附,增强“整洁感”
6.2 文字测量(必须做)
用 CanvasRenderingContext2D.measureText + 二分法找最大字号,结合实际 DOM 测高修正。
// measureText(简单版) + 二分字号
function fitFontSize(text, fontFamily, maxW, maxH, min, max){
let lo=min, hi=max;
while(lo<=hi){
const mid=(lo+hi)>>1;
const {w,h}=measureBlock(text,fontFamily,mid,maxW);
if(w<=maxW && h<=maxH) lo=mid+1; else hi=mid-1;
}
return hi;
}
可用 node-canvas + opentype.js 获取 font metrics;或直接用 headless Chromium 渲染后读取 bbox。
- 稳定性优先:Headless 渲染测量最准
- 性能优先:缓存测量结果(key=font+size+width+text hash)
6.3 换行策略
- MVP:贪心换行(按词/按字),配合 CJK 断行规则
- 进阶:Knuth-Plass(类似 TeX)可减少参差不齐的行尾,但成本更高
6.4 溢出回退(按优先级执行)
// 建议的回退策略(从“最不伤观感”到“结构性改变”)
1) Rewrite: 让 LLM 缩短(减少形容词/去重复/合并要点)
2) Downscale: 降字号(到下限,比如 body >= 14)
3) Trim: 减 bullet 数(保留 top-k,剩余移到下一页)
4) Swap template: 选更“文字友好”的模板(纯文/两栏)
5) Split slide: 拆成 2 页(Detailed 更适用)
6) Fallback: 强制 summary 模板(兜底结论页)
7) Validators + Repair Loop(专业感分水岭)
7.1 必做校验项(可自动化)
| 规则 | 判定 | 修复动作 |
|---|---|---|
| No Overflow | 任何元素 bbox 不得超出 safe area | 降字号 → 改文案 → 换模板 → 拆页 |
| No Overlap | 关键元素 bbox 不相交(允许装饰层覆盖) | 挪位/改布局 → 换模板 |
| Contrast | 文字与背景对比度 ≥ 阈值 | 换文字色/加底板/调背景亮度 |
| Alignment | 关键边对齐网格(误差 <= 1~2px) | 吸附到 grid,统一 gap |
| Density | 文字面积占比/行数上限(Presenter 更严格) | 删点/拆页/换模板 |
| Consistency | 同层级字号/字重一致,tokens 白名单 | 统一 styleRole,重算样式 |
7.2 Repair Loop 设计
- 输入:issues(结构化) + 原 IR + tokens + 模板候选
- 规则修复优先(快且确定),LLM 只做“改文案/拆页建议/重组要点”
- 每轮修复后必须重新 Layout + Validate,设定最大迭代次数(如 3~5)
{
"issues":[
{"type":"overflow","nodeId":"bullets","excessPx":84,"suggest":"rewrite_or_split"},
{"type":"contrast","nodeId":"title","ratio":2.1,"suggest":"add_backplate"}
],
"actions":[
{"type":"llm_rewrite","nodeId":"bullets","target":"shorter"},
{"type":"add_backplate","nodeId":"title","opacity":0.28}
]
}
8) HTML 渲染与导出(PDF/PPTX)
8.1 HTML 渲染策略
- 每页一个
<section class="slide">,固定宽高(如 1280x720 / 1920x1080) - tokens →
:rootCSS variables;styleRole → class(h1/body/caption) - 布局:建议绝对定位(bbox 渲染最直接),也可用 CSS Grid 但最终仍需 bbox 对齐
<section class="slide" style="--w:1920px;--h:1080px">
<div class="node title" style="left:96px;top:96px;width:1200px;height:120px;font-size:44px">...</div>
<ul class="node bullets" style="left:96px;top:240px;width:920px;height:720px">...</ul>
<img class="node visual" style="left:1100px;top:180px;width:720px;height:780px;object-fit:cover" />
</section>
8.2 导出 PDF(推荐)
- 用 Playwright / Puppeteer 打开渲染后的 HTML,逐页截图或直接打印为 PDF
- 要保证字体加载完成:
document.fonts.ready后再截图
// 伪码:导出 PDF
await page.goto("file:///deck.html");
await page.evaluate(() => document.fonts.ready);
await page.pdf({ format:"A4", printBackground:true });
8.3 导出 PPTX(可选)
- 用 PptxGenJS:把 Layout IR 的 bbox 转成 pptx 坐标(注意单位换算)
- 文字用 pptx text box(可编辑),背景/插画作为图片
9) 测试、质量与性能
9.1 视觉回归测试(强烈建议)
- 固定 seeds / 固定 tokens / 固定 templates:渲染截图 → 像素 diff(阈值)
- 每次改布局引擎都跑 golden cases(覆盖 CJK/长标题/多 bullet/无图)
9.2 属性测试(Property-based)
- 随机生成文本长度、bullet 数、图占比,断言:不溢出、不重叠
- 对修复回路:最多 N 次迭代必须收敛或优雅兜底(拆页/summary)
9.3 性能优化
- 文字测量缓存:key = font + size + width + textHash
- 模板选择先粗筛(intent 匹配/媒体可用)再精排
- 导出使用队列 + 复用浏览器实例(避免冷启动)
10) 多语言 / CJK / RTL(常见坑)
- CJK:按字断行优先,标点挤压规则(避免行首标点)
- 英文:按词断行,支持连字符(hyphenation)可选
- RTL:布局镜像(slots area 镜像),文本方向
dir="rtl" - 字体:为每种语言配置 fallback 字体栈,避免字形缺失导致测量偏差
11) 安全与合规
- Sources 引用:保留来源片段 id,支持回溯(生成内容可解释)
- 内容注入:渲染 HTML 时对文本做转义,避免 XSS
- 外部图片:下载与缓存,避免导出时网络抖动;并做内容类型校验
- 隐私:对用户上传文档做最小化持久化与访问控制
12) MVP 里程碑与清单(按最短路径)
- 定义 IR + tokens + 20 个模板
- Layout 引擎:文字测量 + 回退策略
- HTML renderer:可预览、可导出 PDF
- Validators:overflow/overlap/alignment
- Planner:按 intent 分页 + 密度控制
- Repair loop:溢出时 rewrite/split
- 预置风格:prompt → tokens 映射
- brandbook → tokens 抽取
- 插画/背景生成接口(不画主文字)
- 图表:SVG 渲染(可编辑)
- bbox → pptx 坐标映射
- 文本保持为 text box
- 模板与主题映射(shape/颜色/字体)
附录:示例 Schema / 模板 DSL / 校验规则
A) 简化 JSON Schema(片段示意)
{
"$id":"deck.schema.json",
"type":"object",
"properties":{
"deck":{
"type":"object",
"properties":{
"meta":{"type":"object"},
"themeRef":{"type":"string"},
"slides":{
"type":"array",
"items":{
"type":"object",
"required":["id","intent","title"],
"properties":{
"id":{"type":"string"},
"intent":{"enum":["cover","section","concept","comparison","process","timeline","data","quote","summary"]},
"title":{"type":"string"},
"bullets":{"type":"array","items":{"type":"string"}}
}
}
}
},
"required":["meta","themeRef","slides"]
}
},
"required":["deck"]
}
B) 校验规则(可配置化)
{
"rules":{
"overflow":{"enabled":true,"safeMargin":48},
"overlap":{"enabled":true,"allowDecorativeOverlap":true},
"contrast":{"enabled":true,"minRatio":4.0},
"density":{"enabled":true,"presenterMaxTextArea":0.28,"detailedMaxTextArea":0.42},
"alignment":{"enabled":true,"grid":8,"tolerance":2}
}
}
C) Template 覆盖清单(建议从这些开始)
- cover: 3
- section: 3
- concept: 6
- comparison: 4
- process: 4
- timeline: 3
- data: 4
- quote: 2
- summary: 3
深度加工(NotebookLM 生成)
基于本文内容生成的 PPT 大纲、博客摘要、短视频脚本与 Deep Dive 播客,用于多场景复用
PPT 大纲(5-8 张幻灯片) 点击展开
NotebookLM风格:Slide Deck 生成器(HTML)工程落地指导手册 — ppt
这是一份基于您提供的工程落地指导手册提取的 7 张 PPT 大纲。已按照要求使用 Markdown 格式生成,每页包含标题及 3-5 个核心要点:
Slide 1: 项目概述与核心目标
- 核心目标:复现“任意风格适配 + 排版稳定出色”的底层工程逻辑,产出可渲染为 HTML 并支持导出 PDF/PPTX 的幻灯片 [1]。
- 架构策略:将风格(Tokens)与排版(模板+约束引擎)进行解耦,依靠“确定性布局+验证修复回路”来保证稳定的观感 [1]。
- 必须实现:通过 Theme Tokens 实现无穷换肤,保证文字不溢出/不重叠的稳定排版,并支持不同的信息密度输出 [1]。
- 不追求的目标:暂不追求极易溢出的完全自由“无模板”生成,也不建议把关键文字画进不可编辑的图片中 [1]。
Slide 2: 总体架构与流水线数据流
- 架构原则:大语言模型(LLM)不直接画像素级布局,仅负责产出结构化计划,而布局由确定性引擎接管完成 [2]。
- 内容与风格处理:Content Planner 负责接收内容源输出大纲,Style Builder 负责将风格转化为可执行的 Tokens [2]。
- 页面生成机制:Slide Composer 组装组件树后,交由 Layout Engine 计算元素的边界框(BBoxes)、字号和换行结果 [2]。
- 渲染与闭环:渲染器输出页面后,通过 Validators(验证器)检查问题,并触发修复回路进行内容或模板的迭代调整 [2]。
Slide 3: 核心数据模型三要素
- Slide IR(中间表示):记录每一页的意图(Intent)、组件树和文本块,意图是决定模板选择与排版稳定的关键入口 [2]。
- Theme Tokens(主题参数):将风格要求全部转化为可执行的参数,涵盖颜色、字体、各级字号、间距网格及图表样式等 [2]。
- Template DSL(模板语言):负责定义版式的网格布局、插槽区域(Slots)与对齐约束,其自身不写死任何具体风格 [2]。
- Layout IR(布局表示):排版引擎最终输出的具体结果,包含每个元素的精确边界坐标(x,y,w,h)以供渲染使用 [2]。
Slide 4: 确定性排版引擎解析
- 规范网格设计:画布统一抽象为单位坐标系,默认使用 48px 的安全边距,并采用 8px 吸附网格以增强视觉整洁感 [3]。
- 文字尺寸测量:必须进行文字测量(如通过前端 Canvas 或后端 Headless 渲染结合二分法),并缓存结果以平衡性能与准确性 [3]。
- 阶梯式溢出回退策略:面对内容溢出,应按“最不伤观感”到“结构性改变”的优先级依次处理,切忌无下限地缩小字号 [3]。
- 回退优先级设定:首选让 LLM 缩减字数,其次降字号至下限、删减非核心要点、更换纯文本模板,最后考虑将内容拆分为两页 [3]。
Slide 5: 验证与修复回路(Repair Loop)
- 自动化校验项:系统自动检测文本是否超出安全区、关键元素是否重叠、对比度是否达标、是否对齐以及密度是否合规 [3, 4]。
- 规则优先机制:优先使用确定性强且快速的规则动作进行修复(如降字号、增加底板),LLM 仅负责改文案或拆页重组要点 [4]。
- 迭代与重绘:每进行一轮修复,系统都必须重新经过 Layout 引擎排版并再次验证,同时设定最大迭代次数(如 3-5 次)以防死循环 [4]。
- 提升专业感:这一验证与修复机制是决定最终幻灯片生成“专业感”的分水岭,能有效应对由于动态内容带来的排版不确定性 [3, 4]。
Slide 6: HTML 渲染与多格式导出方案
- HTML 渲染机制:每页作为一个独立的 section,利用 CSS variables 注入 Tokens,根据 Layout IR 的边界框进行绝对定位布局 [4]。
- PDF 导出推荐:建议使用 Playwright 或 Puppeteer 打开渲染后的网页,确保字体完全加载(fonts.ready)后再逐页截图或打印 PDF [5]。
- PPTX 导出策略:通过坐标映射将布局数据转换为 PPTX 文件,重点是正文必须用原生文本框(Text Box)渲染,确保导出后依然可编辑 [5]。
- 质量测试保障:强烈建议加入视觉回归测试机制(像素级 Diff 比对)以及随机属性测试,确保不同配置下布局引擎不跑偏 [5]。
Slide 7: MVP 工程落地路线图
- 第一阶段(稳定排版):暂不接 LLM,跑通数据模型、20个模板、文字测量引擎与 HTML 预览,打好自动化防溢出校验的基础 [6]。
- 第二阶段(接入 LLM 生成):引入内容规划模块,实现按意图分页和密度控制,并通过 LLM 完成溢出时的内容重写与拆页修复 [6]。
- 第三阶段(品牌化提升):开发从品牌手册提取风格 Tokens 的能力,并接入插画与图表生成接口以丰富页面视觉元素 [6]。
- 第四阶段(文件导出):完成核心坐标映射功能,实现保持元素可编辑状态的 PPTX 导出能力 [6]。
博客摘要 + 核心看点 点击展开
NotebookLM风格:Slide Deck 生成器(HTML)工程落地指导手册 — summary
SEO 友好博客摘要
本文为您深度解析《NotebookLM风格:Slide Deck 生成器工程落地指南》,揭秘如何打造“任意风格适配+排版稳定出色”的 AI 幻灯片生成系统 [1]。指南采用风格与排版解耦的核心策略,通过确定性布局引擎、精确文字测量及强大的验证与修复回路,彻底解决 AI 生成演示文稿易溢出、不可控的痛点 [1-3]。文章全面涵盖了从 LLM 内容规划、核心数据模型(IR/Tokens/Templates)设计,到 HTML 渲染与 PDF/PPTX 导出的完整技术架构和 MVP 开发里程碑 [4-6]。无论您是开发者还是产品架构师,本指南都是您复现高质量自动排版系统的必备参考。
核心看点
- 风格与排版彻底解耦:依靠确定性布局引擎和模板约束,确保版面稳定、文字不溢出 [1, 2]。
- 独创验证与修复回路:结合自动化规则校验与大模型重写,智能修正重叠与对比度问题 [3]。
- 一套数据流多端导出:标准化的核心数据模型(IR)支持无缝渲染为 HTML、PDF 和 PPTX [1, 4, 5]。
60 秒短视频脚本 点击展开
NotebookLM风格:Slide Deck 生成器(HTML)工程落地指导手册 — video
这是一段为您定制的 60 秒短视频脚本,严格按照字数要求和文章核心提取:
AI做PPT总是排版崩塌?[1]
核心是风格与排版解耦。大模型仅做内容规划,绝不直接碰像素。[1, 2]
布局交给确定性引擎。靠精准文字测量,确保画面不溢出不重叠。[1, 3]
独创验证修复回路。排版溢出自动降字号、换模板或让模型重写。[3, 4]
掌握这套工程逻辑,你也能打造出高品质的幻灯片生成器![1]
课后巩固
与本文内容匹配的闪卡与测验,帮助巩固所学知识
延伸阅读
根据本文主题,为你推荐相关的学习资料