Files
TrueGrowth/docs/PPT_CAPABILITY_PLAN.md

2290 lines
102 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Opentu (开图) PPT 能力规划与实现方案
> 基于 AiPPT (docmee.cn) + [ai-to-pptx](https://github.com/SmartSchoolAI/ai-to-pptx) + [banana-slides](https://github.com/snakeying/banana-slides)(蕉幻)+ [LandPPT](https://github.com/sligter/LandPPT) + [NanoBanana-PPT-Skills](https://github.com/op7418/NanoBanana-PPT-Skills) 项目 Review 结合 aitu 现有架构梳理
## 现有基础
aitu 已具备以下 PPT 相关基础设施:
| 能力 | 现状 | 说明 |
|------|------|------|
| Frame 容器 | ✅ 已实现 | 预设 PPT 16:9 (1920×1080) / 4:3 (1024×768) |
| 幻灯片播放 | ✅ 已实现 | `FrameSlideshow` 全屏播放,键盘导航,画笔/激光笔/橡皮擦 |
| Frame 管理面板 | ✅ 已实现 | `FramePanel` 列表、搜索、拖拽排序、重命名、删除 |
| 基础元素 | ✅ 已实现 | 文本/图形/图片/连线/思维导图/流程图 |
| 填充系统 | ✅ 已实现 | 纯色/渐变(线性+径向)/图片填充 |
| 文本特效 | ✅ 已实现 | 字体/阴影/发光/渐变文字 |
| AI 内容生成 | ✅ 已实现 | Gemini 图片、Mermaid 图表、思维导图、SVG 生成 |
| MCP 工具体系 | ✅ 已实现 | 可扩展的 AI 工具接口 |
---
## 能力规划(按优先级排序)
### P0 — AI 一键生成 PPT
**价值**最高是产品差异化核心能力AiPPT 的核心卖点
**复杂度**:中高
**AiPPT 参考**`index.html` 三步流程 (主题 → 大纲 → PPT)
#### 实现方案
**流程**:用户输入主题 → AI 生成 Markdown 大纲 → 用户编辑大纲 → AI 按大纲逐页生成 Frame 内容
**具体步骤**
1. **新增 MCP 工具 `generate_ppt`**
- 输入:主题 / 大纲 Markdown
- AI 返回结构化 JSON每页的标题、正文、布局类型、图片提示词
- 参考 AiPPT 的大纲格式Markdown 层级标题)
2. **PPT 布局引擎** (`services/ppt-layout-engine.ts`)
- 预定义 5-8 种版式:封面页、目录页、标题+正文、图文左右、图文上下、纯图、对比页、结尾页
- 每种版式对应一组元素的坐标/尺寸/样式规则
- 自动创建 Frame (1920×1080) 并在其中放置元素
3. **大纲编辑器 UI**
- 复用 Chat Drawer 侧边栏,展示 Markdown 大纲
- 支持增删改拖拽章节
- 确认后触发逐页生成
4. **流式生成体验**
- 借鉴 AiPPT 的 SSE 流式传输,逐页生成、逐页渲染
- 利用现有 WorkZone 展示生成进度
**数据结构参考**
```typescript
interface PPTOutline {
title: string;
pages: PPTPageSpec[];
}
interface PPTPageSpec {
layout: 'cover' | 'toc' | 'title-body' | 'image-text' | 'comparison' | 'ending';
title: string;
subtitle?: string;
bullets?: string[];
imagePrompt?: string; // AI 图片生成提示词
notes?: string; // 演讲者备注
}
```
#### ai-to-pptx 借鉴补充
> 以下内容借鉴自 [ai-to-pptx](https://github.com/SmartSchoolAI/ai-to-pptx) 项目分析
**1. 多种输入源支持**
ai-to-pptx 的 `StepOneInputData.tsx` 支持 5 种输入模式aitu 可借鉴:
| 输入模式 | 说明 | aitu 实现建议 |
|---------|------|--------------|
| 文本主题 | 直接输入主题关键词 | 已在规划中 |
| 多行文本导入 | 粘贴长文本AI 提炼大纲 | 新增Chat Drawer 支持文本粘贴输入 |
| 文件上传 | 上传 Word/PDF/TXT提取内容 | 新增:复用现有文件上传能力 |
| 网页 URL 抓取 | 输入网页地址AI 爬取内容 | 新增:后端增加 URL 内容抓取接口 |
| 导入大纲 | 直接导入 Markdown 大纲 | 新增:跳过 AI 生成大纲步骤 |
**2. 生成选项控制**
ai-to-pptx 提供高级生成选项,可提升用户体验:
- **篇幅控制**:较短 (10-15 页) / 常规 (20-30 页) / 更长 (25-35 页)
- **语言选择**:中文 / 英文 / 法语 / 阿拉伯语
- **额外要求**:自由文本输入,用于补充 AI 生成约束(如"偏商务风格"、"多用数据图表"
建议在 `generate_ppt` MCP 工具中增加 `options` 参数:
```typescript
interface PPTGenerateOptions {
pageCount?: 'short' | 'normal' | 'long'; // 篇幅控制
language?: string; // 生成语言
extraRequirements?: string; // 额外要求
}
```
**3. 异步生成 + 进度追踪**
ai-to-pptx 的 `StepFiveGeneratePpt.tsx` 采用异步生成模式:
- 后端异步生成 PPTX前端轮询 `asyncPptInfo` 接口获取增量数据
- 返回 `{ current, total, pages[] }` 实时显示生成进度
- 适合大量页面20-35 页)场景,避免请求超时
aitu 建议:
- 利用现有 Service Worker 后台任务机制,实现 PPT 逐页生成
- 每生成一页即渲染到画布,用户可实时看到进度
- 参考 `task-queue-service.ts` 的任务队列模式
**4. gzip 压缩传输**
ai-to-pptx 使用 `pako` (gzip) + base64 编码传输大体量 PPT JSON 数据,显著减少网络传输:
- 一个 30 页 PPT 的 JSON 数据可达数 MB
- gzip 压缩率约 70-80%base64 编码后仍比原始 JSON 小 50%+
- aitu 可在 AI 生成结果较大时启用压缩传输
#### banana-slides 借鉴补充
> 以下内容借鉴自 [banana-slides](https://github.com/snakeying/banana-slides)(蕉幻)项目分析
**1. 三种创建模式**
banana-slides 的 `Project` 模型 (`backend/models/project.py`) 定义了 `creation_type` 字段,支持三种输入模式:
| 创建模式 | `creation_type` 值 | 说明 | aitu 实现建议 |
|---------|-------------------|------|--------------|
| 灵感模式 | `'idea'` | 一句话输入AI 自动生成完整大纲 | 已在 P0 流程中覆盖 |
| 大纲模式 | `'outline'` | 粘贴大纲文本AI 解析为结构化格式(保留原文不修改) | 新增:支持直接导入大纲文本,调用 `parse_outline_text` 解析 |
| 描述模式 | `'descriptions'` | 提供完整页面描述AI 解析出大纲并切分每页描述 | 新增:高级输入模式,用户可精确控制每页内容 |
每种模式对应不同的 prompt 路径:
- `idea``get_outline_generation_prompt()``get_page_description_prompt()`
- `outline``get_outline_parsing_prompt()`(保留原文) → `get_page_description_prompt()`
- `descriptions``get_description_to_outline_prompt()` + `get_description_split_prompt()`
aitu 建议在 `generate_ppt` MCP 工具中增加 `mode` 参数:
```typescript
interface PPTGenerateOptions {
mode?: 'idea' | 'outline' | 'description'; // 创建模式
// ...existing options
}
```
**2. AI 精炼交互(自然语言迭代修改)**
banana-slides 在大纲和描述编辑阶段提供 `AiRefineInput` 组件 (`frontend/src/components/shared/AiRefineInput.tsx`),用户可用自然语言修改已生成的内容:
- 组件内置历史记录管理,每次提交自动记录修改请求
- 支持 Ctrl+Enter / Cmd+Enter 快捷键提交
- 后端精炼 prompt 保留完整修改历史作为上下文,支持多轮迭代:
- `get_outline_refinement_prompt(current_outline, user_requirement, project_context, previous_requirements, language)`
- `get_descriptions_refinement_prompt(current_descriptions, user_requirement, project_context, outline, previous_requirements, language)`
- 用例示例:「增加一页关于市场分析的内容」「将整体风格改为更商务化」「删除第三页,合并第四和第五页」
aitu 实现建议:
- 在大纲编辑器 UI 底部集成类似的 AI 辅助输入框
- 后端新增 `refine_outline` / `refine_content` MCP 工具
- 保留修改历史上下文,提升多轮迭代质量
- 详见 **P12 — AI 精炼交互**
**3. 参考文件智能解析**
banana-slides 的 `FileParserService` (`backend/services/file_parser_service.py`) 实现了强大的文件解析能力:
| 文件类型 | 解析方式 | 说明 |
|---------|---------|------|
| TXT / MD | 直接读取 | 支持 UTF-8 / GBK 编码自动检测 |
| XLSX / XLS / CSV | `MarkItDown` 库 | 表格转 Markdown 格式 |
| PDF / DOCX / PPTX 等 | **MinerU** 在线 API | 复杂文档版面分析,保留结构 |
MinerU 解析流程4 步):
1. 获取上传 URL → 2. 上传文件 → 3. 轮询解析结果(最长 600s → 4. **AI 增强图片描述**
关键创新:解析后自动为文档中无 alt text 的图片并行生成 AI caption支持 Gemini / OpenAI提升 AI 理解上下文的能力。解析结果以 Markdown 格式作为 AI 生成 PPT 的参考上下文,文档中的图片可被直接引用到 PPT 中(`![图片描述](/files/mineru/xxx/image.png)`)。
aitu 实现建议:
- 复用现有文件上传能力 + 后端集成 MinerU 或类似的文档解析服务
- 参考文件内容作为 `ProjectContext.reference_files_content` 传入 AI prompt
- 图片 caption 生成可复用现有 Gemini API
**4. 分级 Prompt 设计体系**
banana-slides 的 `prompts.py`930 行36KB展示了精心设计的 17 个 prompt 函数,覆盖 PPT 生成全链路:
| 阶段 | Prompt 函数 | 用途 |
|------|-----------|------|
| 大纲生成 | `get_outline_generation_prompt()` | idea → 结构化大纲(支持简单/章节两种格式) |
| 大纲解析 | `get_outline_parsing_prompt()` | 用户文本 → 结构化大纲(保留原文不修改) |
| 页面描述 | `get_page_description_prompt()` | 逐页生成详细视觉描述(含文字简洁要求、图片引用规则) |
| 图片生成 | `get_image_generation_prompt()` | 描述 → AI 图片 prompt含设计指南、模板参考、素材提示 |
| 图片编辑 | `get_image_edit_prompt()` | 编辑指令 → 修改 prompt |
| 大纲精炼 | `get_outline_refinement_prompt()` | 自然语言修改大纲(保留修改历史上下文) |
| 描述精炼 | `get_descriptions_refinement_prompt()` | 自然语言修改描述 |
| 描述转大纲 | `get_description_to_outline_prompt()` | 完整描述文本 → 结构化大纲 |
| 描述切分 | `get_description_split_prompt()` | 完整描述 → 每页描述 |
| 背景生成 | `get_clean_background_prompt()` | 纯背景图(用于可编辑 PPTX 导出) |
| 文字属性提取 | `get_text_attribute_extraction_prompt()` | 单个文字元素的字体/颜色/大小提取 |
| 批量文字提取 | `get_batch_text_attribute_extraction_prompt()` | 全图文字元素批量属性提取 |
| 画质增强 | `get_quality_enhancement_prompt()` | Inpainting 后画质修复 |
语言配置支持 4 种:`zh`(中文) / `en`(English) / `ja`(日本語) / `auto`(自动检测)
aitu 建议:
- 建立类似的分级 prompt 管理模块,每个阶段独立 prompt 函数
- prompt 中内置语言控制和输出格式约束
- 为每种版式/布局类型定义专用的生成 prompt
**5. 项目级额外要求**
banana-slides 的 `Project` 模型包含 `extra_requirements` 字段,其内容会追加到每页 AI 生成的 prompt 中,影响全局生成风格。例如:
- 「所有页面使用蓝色系配色」
- 「图片风格偏向扁平插画」
- 「文字内容偏向技术受众」
aitu 建议在 PPTGenerateOptions 中增加 `extraRequirements` 字段。
**6. 多 AI Provider 工厂模式**
banana-slides 的 `AIService` (`backend/services/ai_service.py`) 实现了灵活的多 Provider 架构:
| Provider 格式 | TextProvider | ImageProvider |
|-------------|-------------|--------------|
| `gemini` (默认) | `GenAITextProvider` | `GenAIImageProvider` |
| `openai` | `OpenAITextProvider` | `OpenAIImageProvider` |
| `vertex` | `GenAITextProvider` (vertexai=True) | `GenAIImageProvider` (vertexai=True) |
核心设计:
- 文本和图像 provider **独立配置**,可混合使用(如文本用 Gemini、图片用 OpenAI
- 推理模式thinking budget独立控制`enable_text_reasoning` / `enable_image_reasoning`
- 运行时可通过设置页切换,无需重启应用
- 工厂函数:`get_text_provider(model)` / `get_image_provider(model)`
aitu 建议:
- 现有 Gemini API 可扩展为 Provider 工厂模式
- 文本理解和图片生成可选用不同模型,发挥各自优势
- 在系统设置中提供 Provider 切换入口
#### LandPPT 借鉴补充
> 以下内容借鉴自 [LandPPT](https://github.com/sligter/LandPPT) 项目分析Python 3.11 + FastAPI + SQLAlchemy 全栈 AI PPT 平台)
**1. 深度研究驱动生成DEEP 方法论)**
LandPPT 的 `DEEPResearchService` (`services/deep_research_service.py`) 实现了 **DEEP 研究方法论**Define → Explore → Evaluate → Present在 AI 生成 PPT 之前先对主题进行深度网络调研:
| 阶段 | 含义 | 实现 |
|------|------|------|
| **D**efine | 定义研究范围 | 解析主题,生成多轮搜索查询 |
| **E**xplore | 探索信息源 | Tavily API + SearXNG 双引擎搜索 |
| **E**valuate | 评估分析 | AI 分析搜索结果,提取关键发现 |
| **P**resent | 呈现报告 | 生成结构化研究报告作为 PPT 上下文 |
**研究报告数据结构**
```python
@dataclass
class ResearchReport:
topic: str
language: str # 'zh' / 'en'
steps: List[ResearchStep] # 多轮搜索步骤
executive_summary: str # 执行摘要
key_findings: List[str] # 关键发现
recommendations: List[str] # 建议
sources: List[str] # 来源列表
total_duration: float # 总耗时
```
研究报告作为 `research_section` 参数传入大纲生成 prompt显著提升内容的深度和准确性。
aitu 实现建议:
- 在 PPT 生成流程中增加可选的「深度研究」步骤
- 复用现有网络搜索能力(如有),或集成 Tavily API
- 研究报告作为 AI 生成 PPT 的上下文参考
- 详见 **P16 — 深度研究驱动 PPT**
**2. 角色级 AI Provider 配置**
LandPPT 的 `EnhancedPPTService` (`services/enhanced_ppt_service.py`, 7295 行) 实现了**角色级 AI 模型配置**——不同生成阶段可使用不同 AI 模型:
| 角色 (Role) | 用途 | 典型配置 |
|------------|------|---------|
| `outline` | 大纲生成 | 推理能力强的模型(如 GPT-4o / Claude |
| `creative` | 创意内容 | 创造力强的模型 |
| `image_prompt` | 图片提示词 | 适合视觉描述的模型 |
| `slide` | 幻灯片内容 | 内容生成模型 |
| `editor` | 编辑器助手 | 轻量快速模型(如 GPT-4o-mini |
| `template` | 模板生成 | 设计能力强的模型 |
核心方法:
- `_get_current_ai_config(role)` → 获取角色配置(`llm_model`, `llm_provider`, `temperature`, `max_tokens`
- `_get_role_provider(role)` → 获取对应角色的 AI Provider 实例
- `_text_completion_for_role(role, prompt)` → 角色级文本补全
支持的 Provider 实现(`ai/providers.py`, 1094 行):
- `OpenAIProvider(AIProvider)` — 兼容所有 OpenAI API 格式DeepSeek/Kimi/MiniMax/302.AI
- `AnthropicProvider(AIProvider)` — Claude 系列
- `GoogleProvider(AIProvider)` — Gemini 系列
- `OllamaProvider(AIProvider)` — 本地模型
- 所有 Provider 支持多模态消息(文本 + 图片 URL和流式输出
- 内置 `<think>...</think>` 标签过滤(兼容推理模型输出)
aitu 建议:
- 扩展现有 Gemini API 为角色级配置
- 大纲用强推理模型、内容用创意模型、编辑用快速模型
- 降低整体成本的同时提升各阶段生成质量
**3. 7 种场景模板**
LandPPT 的 `AIService` (`services/ai_service.py`) 预定义了 7 种 PPT 场景模板,每种含 `style``tone``structure` 三个维度:
| 场景 ID | 名称 | 风格 | 语调 | 结构 |
|--------|------|------|------|------|
| `general` | 通用 | 清晰简洁 | 友好专业 | 平衡叙述 |
| `tourism` | 旅游 | 生动活泼 | 热情邀请 | 景点+体验+攻略 |
| `education` | 教育 | 系统条理 | 循循善诱 | 知识点+案例+练习 |
| `analysis` | 分析 | 数据驱动 | 客观理性 | 数据+趋势+建议 |
| `history` | 历史 | 庄重叙事 | 深沉厚重 | 时间线+事件+影响 |
| `technology` | 科技 | 前沿创新 | 专业前瞻 | 技术+应用+展望 |
| `business` | 商务 | 专业正式 | 自信稳重 | 背景+方案+收益 |
每种场景会自动匹配对应的 prompt 策略,用户选择场景后 AI 生成更具针对性的内容。
aitu 建议在 `PPTGenerateOptions` 中增加 `scenario` 参数:
```typescript
interface PPTGenerateOptions {
scenario?: 'general' | 'tourism' | 'education' | 'analysis' | 'history' | 'technology' | 'business';
// ...existing options
}
```
**4. 分级 Prompt 管理架构6 类模块化 Prompt**
LandPPT 的 prompt 管理采用了精心设计的**模块化架构**,通过 `PPTPromptsManager` 统一管理 6 类 prompt 子模块:
| Prompt 模块 | 类名 | 核心方法 | 用途 |
|------------|------|---------|------|
| **大纲** | `OutlinePrompts` | `get_outline_prompt_zh/en()`, `get_streaming_outline_prompt()` | 生成结构化大纲 JSON |
| **内容** | `ContentPrompts` | `get_slide_content_prompt_zh/en()`, `get_enhancement_prompt_zh/en()` | 幻灯片内容+增强 |
| **设计** | `DesignPrompts` | `get_style_gene_extraction_prompt()`, `get_creative_template_context_prompt()` | 设计基因提取+HTML生成 |
| **系统** | `SystemPrompts` | `get_default_ppt_system_prompt()`, `get_html_generation_system_prompt()` | 系统角色定义 |
| **修复** | `RepairPrompts` | `get_repair_prompt()`, `get_json_validation_prompt()`, `get_quality_check_prompt()` | 输出修复+质量检查 |
| **演讲稿** | `SpeechScriptPrompts` | `get_single_slide_script_prompt()`, `get_opening_remarks_prompt()` | 演讲稿生成 |
统一管理器 `PPTPromptsManager` 聚合所有子类,通过委托模式暴露 30+ 个 prompt 方法。
大纲输出的 JSON 结构包含丰富的元数据:
```json
{
"title": "PPT标题",
"total_pages": 10,
"page_count_mode": "final",
"slides": [{
"page_number": 1,
"title": "页面标题",
"content_points": ["要点1", "要点2"],
"slide_type": "title|content|agenda|thankyou",
"description": "页面说明",
"chart_config": { "type": "bar", "data": {...} }
}],
"metadata": { "scenario", "language", "total_slides", "enhanced_with_charts", "content_depth" }
}
```
**页面类型枚举**`"title"` / `"content"` / `"agenda"` / `"thankyou"`
**页数模式枚举**`"custom_range"` / `"fixed"` / `"ai_decide"`(三种灵活的页数控制)
aitu 建议:
- 建立类似的 6 类模块化 prompt 管理架构
- 统一管理器入口,各模块独立维护
- 大纲 JSON 中加入 `chart_config` 支持图表预配置
- 引入修复 prompt 模块,提升 AI 输出质量和容错能力
**5. summeryanyfile 文档处理模块**
LandPPT 包含独立的 `summeryanyfile` 子模块,专门处理文件上传 → 结构化摘要的完整流程:
| 能力 | 实现 | 说明 |
|------|------|------|
| **32 种文件格式** | `DocumentProcessor.SUPPORTED_EXTENSIONS` | PDF/PPTX/DOCX/XLSX/图片/音频/压缩包等 |
| **MarkItDown 转换** | `MarkItDownConverter` | 复杂文档 → Markdown |
| **MinerU API** | `MineruAPIClient` | 高质量 PDF 解析OCR 109种语言 + 表格 + LaTeX公式 |
| **6 种分块策略** | `SemanticChunker` / `RecursiveChunker` / `ParagraphChunker` / `HybridChunker` / `FastChunker` | 适配不同文档类型的智能分块 |
| **LangGraph 工作流** | `graph/workflow.py` + `graph/nodes.py` | 基于 LangGraph 的文档分析工作流 |
| **7 天缓存** | `FileCacheManager` | 处理结果缓存避免重复解析 |
文档结构分析 prompt 输入变量:`project_topic`, `project_scenario`, `project_requirements`, `target_audience`, `ppt_style` 等 8 个维度。
aitu 建议:
- 参考 summeryanyfile 的智能分块策略,优化长文档处理
- MinerU API 集成可同时参考 banana-slides 和 LandPPT 的实现
- 文档处理结果(结构分析 JSON直接作为 PPT 大纲生成的输入
**6. 进度追踪系统**
LandPPT 的 `ProgressTracker` (`services/progress_tracker.py`) 实现了线程安全的 PPT 生成进度追踪:
```python
@dataclass
class ProgressInfo:
task_id: str
project_id: str
total_slides: int
completed_slides: int
failed_slides: int
skipped_slides: int
current_slide: int
current_slide_title: str
status: str # "running" / "completed" / "failed"
message: str
start_time: float
last_update: float
error_details: Dict
@property
def progress_percentage(self) -> float: ...
@property
def elapsed_time(self) -> float: ...
```
支持单页粒度的状态追踪completed/failed/skipped全局实例 `progress_tracker = ProgressTracker()`1 小时自动清理旧任务。
aitu 建议:
- 复用现有 Service Worker 后台任务 + 进度追踪模式
- 详见 **P18 — TODO 任务板实时追踪**
#### NanoBanana-PPT-Skills 借鉴补充
> 以下内容借鉴自 [NanoBanana-PPT-Skills](https://github.com/op7418/NanoBanana-PPT-Skills) 项目分析Python + Gemini 3 Pro + 可灵 AI 全图片/视频 PPT 生成工具by 歸藏 @op7418
**1. AI 图片直出 PPT 方案**
NanoBanana-PPT-Skills 采用了与前述所有项目截然不同的 PPT 生成范式——**不生成可编辑元素,而是由 AI 直接生成每页 PPT 的完整图片**
| 特性 | 传统方案ai-to-pptx / banana-slides / LandPPT | NanoBanana 方案 |
|------|----------------------------------------------|----------------|
| 输出格式 | 可编辑的 JSON/HTML/PPTX 元素 | 整页 PNG 图片2K/4K |
| AI 模型 | 文本 LLMGPT/Gemini/Claude| 图片生成模型(`gemini-3-pro-image-preview`|
| 设计质量 | 受限于 HTML/CSS 排版能力 | **电影级渲染质量**,无 CSS 限制 |
| 可编辑性 | ✅ 高 | ❌ 低(图片不可编辑) |
| 生成速度 | 多轮 AI 调用(大纲→内容→模板→渲染)| **单次 AI 调用生成完整页面** |
**核心生成流程** (`generate_ppt.py`, 452 行)
```
用户文档 → Claude Code 内容规划 → 逐页生成 Prompt → Gemini 3 Pro 图片生成 → HTML 播放器
```
**Prompt 构建逻辑** (`generate_prompt()`)
1. 加载风格模板 Markdown`styles/*.md`
2. 根据页面类型(`cover` / `data` / `content`)选择对应模板段落
3. 拼合:`基础风格提示词 + 页面类型模板 + 实际内容 + 分辨率指令`
4. 关键参数:`gemini-3-pro-image-preview` 模型、16:9 宽高比、2K(2048×1152) 或 4K(4096×2304) 分辨率
aitu 实现建议:
- **双轨并行**:保留现有元素级 PPT 生成(可编辑)+ 新增「AI 图片直出」模式(高视觉质量)
- 利用现有 Gemini 图片生成能力,新增 `generate_ppt_as_images` MCP 工具
- 图片直出模式适合快速演示、社交分享等不需要二次编辑的场景
- 详见 **P21 — PPT 视频导出**
**2. Markdown 风格模板系统**
NanoBanana 使用 **Markdown 文件** 定义视觉风格(`styles/` 目录),每个风格文件包含:
| 字段 | 说明 | 示例 |
|------|------|------|
| `style_id` | 风格标识 | `gradient-glass` / `vector-illustration` |
| `适配模型` | 推荐的图片生成模型 | `Nano Banana Pro`, `Seedream`, `Lovart` |
| `基础提示词` | 全局视觉风格描述 | Apple Keynote 极简 + 玻璃拟态 + 虹彩渐变 |
| 封面页模板 | cover 页面提示词 | 3D 玻璃物体 + 极光波浪 + 大字标题 |
| 内容页模板 | content 页面提示词 | Bento 网格 + 磨砂玻璃卡片 + 霓虹高光 |
| 数据页模板 | data 页面提示词 | 分屏布局 + 发光 3D 图表 + 数据标注 |
| 技术参数 | 模型/比例/分辨率 | `gemini-3-pro-image-preview`, 16:9, 2K/4K |
**当前内置 2 种风格**
- **渐变毛玻璃卡片** (`gradient-glass.md`)科技感、Apple 风格、虹彩渐变 + 玻璃拟态
- **矢量插画** (`vector-illustration.md`):温暖扁平化、统一黑色轮廓线、复古配色
aitu 建议:
- 为 AI 图片直出模式设计 Markdown 风格模板体系
- 风格模板可作为 P2 模板系统的补充维度(元素布局模板 + 视觉风格模板)
- 支持用户自定义风格描述或选择预设风格
**3. 6 阶段 Claude Code Skill 工作流**
NanoBanana 设计了完整的 **Claude Code Skill 工作流**`SKILL.md`, 675 行),适配不同页数的内容规划策略:
| 页数范围 | 结构模板 |
|---------|---------|
| ~5 页 | 封面 + 3 内容 + 结尾 |
| 5-10 页 | 封面 + 目录 + 5-7 内容 + 数据 + 结尾 |
| 10-15 页 | 封面 + 目录 + 8-12 内容(含 2 数据) + 结尾 |
| 20-25 页 | 封面 + 目录 + 16-22 内容(含 4 数据) + 结尾 |
每个阶段:
1. **收集用户输入**:文档内容、风格选择、页数、分辨率、是否生成视频
2. **文档分析与内容规划**:分析文档 → 按页数模板规划每页内容和类型
3. **生成 PPT 图片**:调用 `generate_ppt.py` 逐页生成
4. **生成转场提示词**:调用 Claude API 分析相邻图片差异,生成转场描述
5. **生成转场视频**:调用可灵 AI API 生成页间转场动画
6. **返回结果**:输出图片+视频+HTML播放器
aitu 建议:
- 参考此页数自适应内容规划策略,在 P0 大纲生成中按页数范围调整结构模板
- 内容规划先于 AI 调用,提升生成效率和一致性
---
### P1 — PPT 导出 (.pptx)
**价值**:高,用户核心需求,完成 PPT 创作闭环
**复杂度**:中
**AiPPT 参考**`json2ppt` API 将 JSON 转回 .pptx
#### 实现方案
**技术选型**:使用 `pptxgenjs` (纯前端 JS 库,无需后端)
**实现路径**
1. **Frame 到 PPTX 转换器** (`services/pptx-export-service.ts`)
- 遍历画布中所有 Frame按顺序作为幻灯片页
- 将 Frame 内的 Plait 元素转换为 pptxgenjs 元素:
- `geometry` (文本框/形状) → `addText()` / `addShape()`
- `image``addImage()` (base64 / URL)
- `line` / `arrow``addShape()` with connector
- `mindmap` → 展开为文本+连线
- `freehand` → SVG path → `addShape()`
- 保留填充、字体、颜色等样式
2. **元素映射表**
| Plait 元素 | pptxgenjs API | 说明 |
|-----------|---------------|------|
| geometry (rect/ellipse/...) | `addShape(type, opts)` | 形状类型映射 |
| geometry + text | `addText(text, opts)` | 带文本的形状 |
| image | `addImage({ data/path })` | 图片导出 |
| arrow/line | `addShape('line', opts)` | 连接线 |
| freehand | `addShape('custGeom', path)` | 自由画笔转路径 |
| 背景 | `slide.background` | Frame 背景 |
3. **UI 入口**
- FramePanel 操作栏增加"导出 PPT"按钮
- 支持选择导出范围(全部 Frame / 选中 Frame
#### banana-slides 借鉴补充
> 以下内容借鉴自 [banana-slides](https://github.com/snakeying/banana-slides)(蕉幻)项目分析
**1. 三种导出格式**
banana-slides 的 `ExportService` (`backend/services/export_service.py`) 支持三种导出格式:
| 导出格式 | 方法 | 实现方式 | 特点 |
|---------|------|---------|------|
| PPTX图片版 | `create_pptx_from_images()` | `python-pptx` 库,每页一张全屏图片 (16:9) | 同步,快速,但不可编辑 |
| PDF | `create_pdf_from_images()` | 优先 `img2pdf`(低内存),失败回退 `Pillow` | 同步,通用格式 |
| **可编辑 PPTX** | `create_editable_pptx_with_recursive_analysis()` | 递归版面分析 + 背景分离 + 文本/图片分层 | **异步,最具创新性** |
**2. 可编辑 PPTX 逆向导出(核心创新)**
banana-slides 最具创新性的功能是将 AI 生成的**图片**逆向转换为**可编辑 PPTX**
**处理流程**4 阶段):
1. **版面分析** (5%-40%)`ImageEditabilityService.make_image_editable()` 递归分析图片中的文字/图片/表格区域
2. **文本样式提取** (45%-70%):混合策略 `_batch_extract_text_styles_hybrid()`
- 全局 AI 识别:`is_bold` / `is_italic` / `is_underline` / `text_alignment`
- 单元素裁剪识别:精确提取 `font_color`(含 `colored_segments` 多色段)
3. **构建 PPTX** (75%-95%)`PPTXBuilder` 递归添加元素到幻灯片
4. **保存输出** (95%-100%)
**背景修复Inpainting**:识别出文字/图片元素后,需要消除这些元素并重建背景:
| Inpainting Provider | 实现 | 说明 |
|--------------------|----|------|
| `generative`(火山引擎/Gemini | `InpaintingService` | AI 生成式修复,效果最好 |
| `baidu`(百度) | `InpaintingService` | 传统图像修复算法 |
| `hybrid` | 混合模式 | 结合两种方式,自动选择最优 |
**错误处理**
- `ExportError` 异常含 `error_type` 枚举:`style_extraction` / `text_render` / `image_add` / `inpaint` / `config` / `service`
- `ExportWarnings` 警告收集器:允许部分失败继续导出(`export_allow_partial` 配置)
aitu 实现建议:
- 虽然 aitu 是元素级编辑(不需要逆向解析),但 **Inpainting 能力** 可用于「删除元素后自动补全背景」
- **版面分析能力** 可用于 PPT 导入场景P6辅助识别导入 PPT 中的元素层次
- 考虑在导出时提供「图片版 PPTX」和「可编辑 PPTX」两种选项
#### LandPPT 借鉴补充
> 以下内容借鉴自 [LandPPT](https://github.com/sligter/LandPPT) 项目分析
**1. 五种导出格式**
LandPPT 支持比 banana-slides 更丰富的导出格式:
| 导出格式 | 实现方式 | 说明 |
|---------|---------|------|
| **PPTX** | `python-pptx` / Playwright HTML→PPTX | 可编辑幻灯片格式 |
| **PDF** | Playwright 截图 → PDF 拼合;或 `pdfkit` (wkhtmltopdf) | 通用文档格式 |
| **HTML** | 直接导出 HTML 模板渲染结果 | 可在浏览器直接演示 |
| **DOCX** | `python-docx` 生成 Word 文档 | 适合内容再编辑 |
| **Markdown** | 结构化导出大纲+内容 | 适合二次处理 |
**2. Playwright + Apryse 双引擎导出**
LandPPT 的 `PyppeteerPdfConverter` (`services/pyppeteer_pdf_converter.py`, 99.9KB) 使用 **Playwright** 浏览器引擎实现高保真 HTML → PDF 转换:
- 每页 HTML 模板在无头浏览器中渲染
- 截取 1280×720 画布为高分辨率图片
- 拼合为 PDF 或插入 PPTX
同时集成 **Apryse SDK**(原 PDFTron`pdf_to_pptx_converter.py`)实现专业级 PDF → PPTX 转换:
- 自动下载平台对应 SDKWindows/Linux/macOS
- 高质量保留原始排版和可编辑性
- 需要 `APRYSE_LICENSE_KEY` 授权
aitu 实现建议:
- PPTX 导出优先使用前端 `pptxgenjs`(已规划)
- PDF 导出可考虑 Playwright 无头浏览器方案作为高保真备选
- 新增 Markdown 导出选项(成本最低,适合二次处理)
- HTML 导出可直接复用 PPT 播放器的渲染结果
---
### P2 — PPT 模板/主题系统
**价值**:高,降低用户使用门槛
**复杂度**:中
**AiPPT 参考**`slideMaster``slideLayout``page` 三级继承
#### 实现方案
1. **PPT 模板数据结构** (`types/ppt-template.types.ts`)
```typescript
interface PPTTemplate {
id: string;
name: string;
thumbnail: string;
theme: PPTTheme;
layouts: PPTLayout[]; // 版式集合
}
interface PPTTheme {
primaryColor: string;
secondaryColor: string;
backgroundColor: string;
fontFamily: string;
headingFontFamily: string;
}
interface PPTLayout {
type: 'cover' | 'toc' | 'content' | 'image-text' | 'ending';
elements: PlaitElement[]; // 版式中的占位元素模板
}
```
2. **内置模板库**
- 5-10 套预设模板(商务/科技/教育/简约/创意等)
- 每套包含 5-8 种版式
- 存储为 JSON打包在应用中
3. **主题色提取**(借鉴 AiPPT `calcSubjectColor()`
- 分析上传图片的像素分布,提取主色调
- 自动生成配色方案应用到模板
4. **模板选择 UI**
- AI 生成 PPT 流程第二步:选择模板
- 模板缩略图网格展示
#### ai-to-pptx 借鉴补充
**1. 模板制作规范**
ai-to-pptx 的 `README_Make_Template.md` 定义了严格的模板规范aitu 可参考建立自己的模板标准:
| 页面类型 | 元素数量 | 布局要求 |
|---------|---------|---------|
| 首页 (cover) | 2 个文本 | 标题 + 副标题/作者 |
| 目录页 (toc) | 13 个文本 | 目录标题 + 6 组(序号+内容) |
| 章节标题页 (section) | 2 个文本 | 章节序号 + 章节标题 |
| 内容页 (content) | 按布局变化 | 标题 + N×M 网格结构 |
**2. 内容页 6 种网格布局**
ai-to-pptx 定义了 6 种内容页网格布局,每种建议 2-8 种不同风格变体:
| 布局 | 结构 | 适用场景 | 建议变体数 |
|------|------|---------|-----------|
| 2×2 | 标题 + 4 格 | 四象限对比 | 2-3 种 |
| 2×3 | 标题 + 6 格 | 三列两行内容 | 2-3 种 |
| 3×2 | 标题 + 6 格3行2列 | 并排对比 | **5-8 种(推荐)** |
| 3×3 | 标题 + 9 格 | 九宫格展示 | **5-8 种(推荐)** |
| 4×2 | 标题 + 8 格 | 详细列表 | 2-3 种 |
| 4×3 | 标题 + 12 格 | 密集信息 | 2-3 种 |
aitu 实现建议:
- 在 `PPTLayout.type` 中扩展支持网格布局类型
- 每种版式定义元素的坐标/尺寸比例规则,而非绝对像素值
- 使用 Frame 预设尺寸 (1920×1080) 下的百分比定位
**3. 更换模板(保留内容)**
ai-to-pptx 的 `StepFiveGeneratePpt.tsx` 支持生成后更换模板:
- 调用 `changePptxTemplate` 传入新模板 ID保留已生成的文字内容
- 后端自动将内容重新映射到新模板的布局中
- 用户无需重新生成即可切换风格
aitu 建议:
- 将 PPT 内容层(文字、数据)与样式层(模板、主题)分离
- 更换模板时只需重新应用版式规则和主题色
- 利用现有 Frame 容器机制,遍历 Frame 内元素重新布局
#### banana-slides 借鉴补充
> 以下内容借鉴自 [banana-slides](https://github.com/snakeying/banana-slides)(蕉幻)项目分析
**1. 预设风格系统AI 风格描述替代传统 JSON 模板)**
banana-slides 采用了一种与传统 JSON 模板截然不同的风格系统:**用自然语言描述视觉风格**,直接作为 AI 图片生成 prompt 的一部分。
`frontend/src/config/presetStyles.ts` 定义了 8 种预设风格:
| # | 风格 ID | 中文名称 | 核心视觉特征 |
|---|--------|---------|-------------|
| 1 | `business-simple` | 简约商务 | 海军蓝+白色,麦肯锡风格,无衬线字体 |
| 2 | `tech-modern` | 现代科技 | 赛博朋克,午夜黑+电光蓝,全息渐变 |
| 3 | `academic-formal` | 严谨学术 | 米白纸张质感,衬线字体,学术排版 |
| 4 | `creative-fun` | 活泼创意 | 孟菲斯风格,手绘涂鸦,不规则形状 |
| 5 | `minimalist-clean` | 极简清爽 | 北欧设计70%留白,细线条 |
| 6 | `luxury-premium` | 高端奢华 | 曜石黑+香槟金Art Deco 几何 |
| 7 | `nature-fresh` | 自然清新 | 米色+森林绿,水彩植物元素 |
| 8 | `gradient-vibrant` | 渐变活力 | 全息渐变色,玻璃拟态,流体形状 |
每种风格包含极其详细的视觉描述(配色方案、材质、排版规则、字体选择、渲染要求),例如「简约商务」风格描述涵盖:
- 配色:海军蓝 (#1a365d) + 白色 + 浅灰辅助色
- 排版:大标题左对齐、正文区域限制在右 2/3、关键数字突出显示
- 材质:纯色背景、无渐变无纹理、细灰色分割线
- 渲染4K 分辨率、干净锐利的矢量感
**接口定义**
```typescript
interface PresetStyle {
id: string;
nameKey: string; // i18n 翻译 key
descriptionKey: string; // i18n 翻译 key完整视觉描述
previewImage?: string; // 预览图路径(如 /preset-previews/business-simple.webp
}
```
**2. 自定义模板图片**
除了预设风格外,用户还可以:
- 上传自定义模板图片(`Project.template_image_path`AI 将参考该图片的风格生成 PPT
- 输入纯文字风格描述(`Project.template_style`),无模板图时使用文字描述
aitu 实现建议:
- **混合模板方案**:在传统 JSON 模板定义布局和占位元素的基础上增加「AI 风格描述」层
- JSON 模板控制布局结构(元素位置/尺寸)
- 风格描述控制视觉风格(配色/材质/字体/渲染风格)
- 两者可独立切换,组合使用
- 预设 5-8 种风格描述,类似 banana-slides 的 `presetStyles`
- 支持用户上传参考图片或输入自定义风格描述
- 风格描述通过 `extraRequirements` 或专用字段传入 AI prompt
#### LandPPT 借鉴补充
> 以下内容借鉴自 [LandPPT](https://github.com/sligter/LandPPT) 项目分析
**1. AI 自动生成母版模板**
LandPPT 的 `GlobalMasterTemplateService` (`services/global_master_template_service.py`, 47KB) 实现了一套完整的 **AI 驱动模板生成系统**
核心流程:
1. **创建模板**`create_template(template_data)` → 检查名称唯一 → AI 生成 HTML 模板 → 自动生成预览图 → 提取样式配置
2. **设计基因提取**`DesignPrompts.get_style_gene_extraction_prompt(template_code)` 从 HTML 模板中提取 6 维设计基因(色彩、字体、布局、间距、装饰、动效)
3. **创意变化**`get_creative_variation_prompt()` 和 `get_content_driven_design_prompt()` 生成同风格的变体页面
**数据库模型** (`database/models.py` → `GlobalMasterTemplate`)
```python
class GlobalMasterTemplate:
template_name: str # 唯一模板名
html_template: Text # 完整 HTML 模板代码
preview_image: Text # Base64 预览图
style_config: JSON # 提取的样式配置
tags: JSON # 标签列表
is_default: bool # 是否默认
is_active: bool # 是否启用
usage_count: int # 使用次数
created_by: str # 创建者
```
**HTML 模板规范**
- 固定画布 `1280×720px`16:9
- 使用 Tailwind CSS + Chart.js + Font Awesome
- 支持占位符:`{{ page_title }}`, `{{ main_heading }}`, `{{ page_content }}`, `{{ current_page_number }}`, `{{ total_page_count }}`
- 严格保留页眉/页脚结构
- 动态内容自适应布局
**2. 25 种预设模板 JSON 系统**
LandPPT 的 `template_examples/` 目录包含 **25 种风格各异的预设模板**
| 风格类别 | 模板名称 |
|---------|---------|
| **中国风** | 中国风、中式书卷风、宣纸风、竹简风 |
| **商务** | 商务、简约答辩风、素白风 |
| **科技** | 科技风、赛博朋克风、终端风 |
| **艺术** | 莫奈风、星月夜风、吉卜力风、Toy风 |
| **自然** | 森林绿、清新风、清新笔记 |
| **现代** | 模糊玻璃、拟态风、渐变活力(星月蓝)|
| **特色** | 五彩斑斓的黑、大气红、速度黄、日落大道、饺子风 |
每个模板 JSON 包含完整 HTML 代码 + 样式配置 + 标签 + 导出信息,例如「商务」模板:
```json
{
"template_name": "默认商务模板",
"description": "现代简约的商务PPT模板...",
"html_template": "...(含完整 CSS + HTML + 占位符)...",
"tags": ["默认", "商务", "现代", "简约", "深色"],
"is_default": false
}
```
aitu 实现建议:
- **混合模板体系**JSON 布局模板 + AI 风格描述 + HTML 渲染模板三层叠加
- 内置 10-15 种精选预设模板(覆盖商务/科技/学术/创意/中国风等主流场景)
- 支持 AI 按用户描述自动生成新模板(参考 LandPPT 的母版模板生成流程)
- 模板支持导入/导出 JSON 格式,方便社区共享
**3. 设计基因提取与创意模板生成**
LandPPT 的 `DesignPrompts` (`services/prompts/design_prompts.py`, 581 行) 定义了精细的设计生成提示词体系:
| Prompt 方法 | 参数量 | 用途 |
|------------|--------|------|
| `get_style_gene_extraction_prompt(template_code)` | 1 | 从模板提取设计基因(色彩/字体/布局等 6 维) |
| `get_unified_design_guide_prompt(slide_data, page_number, total_pages)` | 3 | A-E 五维统一设计指导 |
| `get_creative_variation_prompt(slide_data, page_number, total_pages)` | 3 | 创意变化指导 |
| `get_content_driven_design_prompt(slide_data, page_number, total_pages)` | 3 | 内容驱动设计 |
| `get_creative_template_context_prompt(...)` | **13** | 核心 HTML 生成(含 slide_data/template_html/style_genes/project 上下文等) |
核心的 `get_creative_template_context_prompt` 方法整合 13 个参数包括当前幻灯片数据、HTML 模板、设计基因、项目主题/类型/受众/风格等完整上下文,生成单页 HTML。
aitu 建议:
- 建立设计基因提取能力,用于模板风格分析和迁移
- 在切换模板时,提取源模板设计基因 → 应用到新模板
- 支持用户上传参考图片 → AI 提取设计基因 → 自动生成匹配风格的模板
---
### P3 — 图表元素
**价值**中高PPT 中数据可视化是刚需
**复杂度**:中
**AiPPT 参考**`chart.js` 柱状图/饼图/折线图/环形图 Canvas 原生绘制
#### 实现方案
**技术选型**Mermaid 已有基础图表能力,但 PPT 场景需更专业的图表。两种路线:
**路线 A — 移植 AiPPT chart.js推荐**
- 优势:轻量、无依赖、与 PPT 导出兼容性好
- 实现:
1. 新增 Plait 元素类型 `chart`
2. 将 AiPPT 的 `chart.js` 改造为 TypeScript 模块
3. 创建 `withChart` 插件,在 Canvas 上渲染图表
4. 图表数据编辑面板(类似 Excel 的表格输入)
5. MCP 工具 `insert_chart`AI 可通过对话插入图表
**路线 B — 集成 ECharts/Chart.js 库**
- 优势:功能更强大、图表类型更多
- 劣势包体积大、PPT 导出需要额外处理
**支持的图表类型(初期)**
- 柱状图 (bar)
- 折线图 (line)
- 饼图 (pie)
- 环形图 (doughnut)
#### ai-to-pptx 借鉴补充
**1. 表格元素**
ai-to-pptx 的 `element.js` 中 `createTable()` 提供了完整的表格工厂aitu 当前规划中缺少表格支持:
```typescript
// 参考 ai-to-pptx createTable 签名
function createTable(
rowColumnDataList: string[][], // 二维表格数据
rowFillStyles?: FillStyle[], // 交替行填充色(循环应用)
borderColor?: number, // 边框颜色
fontColor?: FontColor // 字体颜色
): TableElement
```
表格样式能力:
- 交替行背景色(斑马纹效果)
- 自定义边框颜色和线宽
- 单元格文本对齐(水平/垂直)
- 单元格内边距 (textInsets)
- 字体大小和颜色配置
- 四边独立边框配置(上/右/下/左)
aitu 实现建议:
- 新增 Plait 元素类型 `table`,或用 `geometry` 组合实现
- 支持 AI 通过 MCP 工具 `insert_table` 自动插入数据表格
- 导出时映射为 `pptxgenjs` 的 `addTable()` API
- 优先级可归入 P3与图表一并实现
**2. 图表数据格式参考**
ai-to-pptx `createChart()` 的数据格式值得借鉴:
```typescript
// 柱状图/折线图数据格式
const barLineData = [
[' ', '系列1', '系列2', '系列3'], // 表头
['类别1', '4.3', '2.4', '2'],
['类别2', '2.5', '4.4', '2'],
['类别3', '3.5', '1.8', '3'],
];
// 饼图/环形图数据格式
const pieData = [
[' ', '销售额'],
['第一季度', '8.2'],
['第二季度', '3.2'],
['第三季度', '1.4'],
];
```
这种类 Excel 二维数组格式对 AI 生成非常友好,建议作为 `insert_chart` MCP 工具的输入格式。
#### LandPPT 借鉴补充
> 以下内容借鉴自 [LandPPT](https://github.com/sligter/LandPPT) 项目分析
**1. 16+ 种图表类型(含专业图表)**
LandPPT 的大纲生成 prompt (`services/prompts/outline_prompts.py`) 在大纲阶段即可为每页预配置 `chart_config`,支持的图表类型远超常规 PPT 工具:
| 类别 | 图表类型 | 适用场景 |
|------|---------|---------|
| **基础** | 柱状图 (bar)、折线图 (line)、饼图 (pie)、环形图 (doughnut) | 通用数据展示 |
| **对比** | 条形图 (horizontal bar)、面积图 (area)、瀑布图 (waterfall) | 趋势对比 |
| **关系** | 韦恩图 (venn)、和弦图 (chord)、关联图 (network) | 关系展示 |
| **统计** | 森林图 (forest)、生存曲线图 (survival)、漏斗图 (funnel) | 学术/医学统计 |
| **流程** | 甘特图 (gantt)、词云图 (wordcloud) | 项目管理/文本分析 |
| **复杂** | UpSet 图 (upset) | 集合交集可视化 |
**大纲中的图表预配置**AI 在生成大纲时自动建议):
```json
{
"page_number": 3,
"title": "市场分析",
"chart_config": {
"type": "bar",
"data": { "labels": ["Q1", "Q2", "Q3"], "datasets": [...] },
"options": { "title": "季度营收对比" }
}
}
```
aitu 建议:
- 在大纲 JSON 中支持 `chart_config` 字段AI 大纲阶段即建议图表
- 初期支持 6 种基础图表bar/line/pie/doughnut/area/funnel
- 中期扩展专业图表(甘特图/瀑布图/韦恩图)
- 图表数据格式统一为类 Excel 二维数组 + Chart.js 兼容配置
---
### P4 — 幻灯片切换动画
**价值**:中,提升演示体验
**复杂度**:中低
**AiPPT 参考**`animation.js` 进入/退出/强调动画
#### 实现方案
1. **Frame 扩展 transition 属性**
```typescript
interface PlaitFrame extends PlaitElement {
type: 'frame';
name: string;
points: [Point, Point];
transition?: FrameTransition; // 新增
}
interface FrameTransition {
type: 'none' | 'fade' | 'slide-left' | 'slide-right' | 'slide-up' | 'zoom' | 'dissolve';
duration: number; // ms
}
```
2. **FrameSlideshow 增加过渡效果**
- 切换 Frame 时,根据 `transition.type` 应用 CSS 动画
- 方案:在遮罩层和 viewport 切换之间插入过渡动画帧
- 利用 CSS `transition` / `@keyframes` 实现
3. **UI**
- FramePanel 中每个 Frame 可设置切换效果
- 下拉选择动画类型 + 时长滑块
#### ai-to-pptx 借鉴补充
**1. 更丰富的页面切场动画**
ai-to-pptx `animation.js` 定义了 16 种页面切场动画(`transitionList`),比当前规划的 6 种更丰富:
| # | 动画名称 | key | 参数 |
|---|---------|-----|------|
| 1 | 分割 | split | dir: in |
| 2 | 切出 | cut | - |
| 3 | 形状 | wedge | - |
| 4 | 抽出 | pull | dir: l/r/u/d |
| 5 | 推出 | push | dir: u/d/l/r |
| 6 | 插入 | cover | dir: d/u/l/r |
| 7 | 擦除 | wipe | dir: l/r/u/d |
| 8 | 新闻快报 | newsflash | - |
| 9 | 梳理 | comb | dir: horz/vert |
| 10 | 棋盘 | checker | dir: horz/vert |
| 11 | 淡出 | fade | - |
| 12 | 溶解 | dissolve | - |
| 13 | 百叶窗 | blinds | dir: horz/vert |
| 14 | 线条 | randomBar | dir: vert/horz |
| 15 | 轮幅 | wheel | spokes: 8 |
| 16 | 随机 | random | - |
每种动画支持速度参数:`slow` / `med` / `fast`
建议 aitu 扩展 `FrameTransition.type` 枚举,至少支持前 12 种常用切场效果。
**2. 元素级动画(重要扩展)**
ai-to-pptx 除了页面切场,还定义了完整的**元素级动画**体系(`animationList`,共 226 个动画预设),分为三大类:
**退场动画 (exit)** — 20 种效果:
消失、飞出(8方向)、百叶窗、盒状、棋盘、圆形扩展、缓慢移除、菱形、向外溶解、渐变、闪烁一次、切出(4方向)、十字形扩展、随机线条、阶梯状、轮子、擦除、缩放、收缩并旋转、螺旋飞出、劈裂
**入场动画 (entrance)** — 与退场动画对称的 20+ 种效果:
出现、飞入(8方向)、百叶窗、盒状、棋盘、圆形扩展、缓慢进入、菱形、溶解、渐变、闪烁一次、切入(4方向)、十字形扩展、随机线条、阶梯状、轮子、擦除、缩放、旋转飞入、螺旋飞入、劈裂、弹跳
**强调动画 (emphasis)** — 24 种效果:
更改填充颜色、更改字体、更改字体颜色、更改字号、更改字形(7个子类型)、放大缩小、更改线条颜色、陀螺旋、透明、加粗闪烁、爆炸、加粗展示、着色、添加下划线、混色、彩色波纹、补色、补色2、对比色、加深、不饱和、忽明忽暗、闪动、颜色延伸、变淡、样式强调、跷跷板、垂直突出显示、波浪线、闪烁、闪现
**动画路径 (path)** — 8 种运动轨迹:
向右、向左、向上、向下、自定义路径等
aitu 实现建议:
1. **Phase 1**(与 P4 同期):先实现 6 种基础切场 + 入场/退场各 5 种基础效果
2. **Phase 2**:扩展完整切场列表 + 强调动画
3. **数据结构扩展**
```typescript
interface ElementAnimation {
presetClass: 'entr' | 'exit' | 'emph' | 'path'; // 动画类别
presetId: number; // 动画类型 ID
presetSubtype: number; // 方向/变体
duration?: number; // 时长 (ms)
startType: number; // 触发方式 (1=单击, 2=与前一动画同时, 3=前一动画之后)
text?: boolean; // 是否应用于文本
attr?: Record<string, any>; // 额外参数(颜色、字体等)
}
interface PlaitFrame extends PlaitElement {
type: 'frame';
name: string;
points: [Point, Point];
transition?: FrameTransition;
elementAnimations?: Record<string, ElementAnimation[]>; // elementId → 动画序列
}
```
#### NanoBanana-PPT-Skills 借鉴补充
> 以下内容借鉴自 [NanoBanana-PPT-Skills](https://github.com/op7418/NanoBanana-PPT-Skills) 项目分析
**1. AI 视频转场(图生视频方案)**
NanoBanana 在传统 CSS 切换动画之上,开创了 **AI 视频转场**——使用可灵 AIKling将相邻两页 PPT 图片生成转场视频:
| 特性 | 传统 CSS 切换动画 | NanoBanana AI 视频转场 |
|------|-----------------|---------------------|
| 效果 | 淡入淡出/推入/缩放等预设 | **电影级 3D 变形/物理解构** |
| 实现 | CSS animation/transition | AI 图生视频(首帧→尾帧) |
| 定制性 | 固定预设参数 | 每对页面**独立生成**匹配转场 |
| 成本 | 无 | API 调用费用 |
**可灵 AI API 封装** (`kling_api.py`, 431 行)
```python
class KlingVideoGenerator:
API_BASE = "https://api-beijing.klingai.com"
def create_video_task(
first_frame_image, # 首帧图片(当前页截图)
last_frame_image, # 尾帧图片(下一页截图)
prompt, # 转场描述提示词
model_name="kling-v2-6", # 可灵 v2.6 模型
duration="5", # 视频时长 5s/10s
mode="std", # 标准/专业模式
) -> task_id
def wait_for_completion(task_id, timeout=300, interval=5) -> video_url
def download_video(video_url, output_path)
```
**2. 智能转场提示词生成**
NanoBanana 提供两种转场提示词生成策略:
**策略 AClaude AI 分析生成** (`transition_prompt_generator.py`, 314 行)
- 将两张相邻页面图片Base64发送给 Claude`claude-sonnet-4-5-20250929`
- Claude 分析两页视觉差异,生成匹配的转场描述
- 遵循转场模板框架(`prompts/transition_template.md`
**转场模板框架**
1. **分析差异**A 类关联性强→原地演变vs B 类(差异巨大→运镜驱动转场)
2. **选择策略**A 类保持主体位置微调细节B 类用推/拉/横移镜头切换场景
3. **构思变化**:主体变化 + 环境变化 + 风格/特效变化
4. **输出规则**:连贯段落、具体画面感、遵守摄像机策略
**策略 B预设通用模板** (`simple_transition_prompt_generator.py`, 106 行)
- 无需 Claude API使用内置的通用转场描述
- 适用于所有毛玻璃风格 PPT 的默认转场效果
- 包含极光波浪、3D 玻璃解构/重组、磨砂卡片滑入等通用动效
aitu 实现建议:
- 在现有 CSS 切换动画P4基础上新增「AI 视频转场」高级选项
- 利用现有 Gemini API 或集成可灵 AI API实现图生视频转场
- 预设 5-10 种通用转场描述模板,同时支持 AI 自动分析生成
- 详见 **P21 — PPT 视频导出**
---
### P5 — 演讲者备注
**价值**:中,专业演示场景需要
**复杂度**:低
#### 实现方案
1. **Frame 扩展 notes 属性**
```typescript
interface PlaitFrame extends PlaitElement {
notes?: string; // Markdown 格式备注
}
```
2. **备注编辑入口**
- FramePanel 中 Frame 项展开后显示备注编辑区
- 或双击 Frame 标题栏下方区域编辑
3. **演讲者视图**
- 幻灯片播放时,支持"演讲者视图"模式(需要双屏或分窗口)
- 主窗口显示幻灯片,副窗口显示备注 + 下一页预览 + 计时器
#### LandPPT 借鉴补充
> 以下内容借鉴自 [LandPPT](https://github.com/sligter/LandPPT) 项目分析
**1. 完整的 AI 演讲稿生成系统**
LandPPT 的 `SpeechScriptService` (`services/speech_script_service.py`, 793 行) 实现了远超简单备注的**专业演讲稿生成系统**
**三种生成类型**`single`(单页)/ `multi`(多页批量)/ `full`(全套含开场白+结束语)
**7 种语气风格** (`SpeechTone` 枚举)
| 语气 | 枚举值 | 适用场景 |
|------|--------|---------|
| 正式 | `FORMAL` | 学术报告、商务汇报 |
| 随意 | `CASUAL` | 团队分享、内部沟通 |
| 说服性 | `PERSUASIVE` | 方案推介、融资路演 |
| 教育性 | `EDUCATIONAL` | 培训课程、知识分享 |
| 对话式 | `CONVERSATIONAL` | 沙龙分享、圆桌讨论 |
| 权威性 | `AUTHORITATIVE` | 行业报告、专家演讲 |
| 叙事性 | `STORYTELLING` | 品牌故事、案例分享 |
**7 种目标受众** (`TargetAudience` 枚举)
`EXECUTIVES` / `STUDENTS` / `GENERAL_PUBLIC` / `TECHNICAL_EXPERTS` / `COLLEAGUES` / `CLIENTS` / `INVESTORS`
**3 种语言复杂度** (`LanguageComplexity` 枚举)
`SIMPLE`(通俗易懂)/ `MODERATE`(适中专业)/ `ADVANCED`(高度专业)
**自定义配置数据结构**
```python
@dataclass
class SpeechScriptCustomization:
tone: SpeechTone
target_audience: TargetAudience
language_complexity: LanguageComplexity
custom_style_prompt: str # 自定义风格提示(如"幽默轻松"
include_transitions: bool # 是否包含过渡语句
include_timing_notes: bool # 是否包含时间标注
speaking_pace: str # 'slow' / 'normal' / 'fast'
```
**演讲稿生成结果**
```python
@dataclass
class SlideScriptData:
slide_index: int
slide_title: str
script_content: str # 完整演讲稿文本
estimated_duration: float # 预估时长(秒)
speaker_notes: str # 简要提示语
```
**Prompt 设计** (`services/prompts/speech_script_prompts.py`)
- `get_single_slide_script_prompt()` — 单页演讲稿(含上下文:前一页内容、整体结构位置)
- `get_opening_remarks_prompt()` — 开场白(含项目主题、受众分析)
- `get_closing_remarks_prompt()` — 结束语(含总结回顾、号召行动)
- 从 HTML 模板中自动提取文本内容作为演讲稿参考
**数据库持久化** (`database/models.py` → `SpeechScript`)
- 支持按幻灯片索引存储/查询
- 记录生成参数tone/audience/complexity便于重新生成
- 支持多格式导出(独立的 `SpeechScriptExporter` 服务)
aitu 实现建议:
- 将当前 P5 从简单的「备注字段」升级为「AI 演讲稿生成」
- 新增 MCP 工具 `generate_speech_script`(支持单页/全套两种模式)
- UI 中提供语气/受众/复杂度的快捷选择
- 演讲稿与幻灯片独立管理,支持按页查看和编辑
- 演讲者视图中显示 AI 生成的演讲稿 + 预估时长
---
### P6 — PPT 导入 (.pptx)
**价值**:中,用户可编辑已有 PPT
**复杂度**:高
**AiPPT 参考**`pptxObj` JSON 数据结构(完整的 PPT 元素 Schema
#### 实现方案
**技术选型**:无成熟的纯前端 .pptx 解析库,需组合使用
1. **解析 .pptx 文件**(本质是 ZIP + XML
- 使用 `JSZip`(已有依赖)解压 .pptx
- 解析 XML`presentation.xml` → 幻灯片列表, `slide{n}.xml` → 页面内容
- 参考 AiPPT 的 `pptxObj` JSON 结构作为中间格式
2. **PPTX → Plait 元素映射**
| PPTX 元素 | XML 标签 | Plait 元素 |
|-----------|----------|-----------|
| 文本框 | `<p:txBody>` | geometry + text |
| 形状 | `<p:sp>` + `<a:prstGeom>` | geometry (对应 shape type) |
| 图片 | `<p:pic>` | image |
| 表格 | `<a:tbl>` | 多个 geometry 组合 |
| 图表 | `<c:chartSpace>` | chart 元素 (P3 完成后) |
| 连线 | `<p:cxnSp>` | arrow/line |
| 组合 | `<p:grpSp>` | group |
3. **PPT 形状库扩充**
- 借鉴 AiPPT `geometry.js` 中 100+ 种标准 PPT 形状的 SVG path 生成代码
- 建立 PPT `prstGeom` 名称到 Plait 几何形状的映射
4. **实现优先级**
- Phase 1文本框 + 形状 + 图片(覆盖 80% 场景)
- Phase 2表格 + 连线 + 组合
- Phase 3图表 + 动画
---
### P7 — PDF 导出
**价值**:中低,补充导出格式
**复杂度**:低
#### 实现方案
1. 利用浏览器 `window.print()` + CSS `@media print` 方案
2. 遍历 Frame逐页 viewport 对准 → `html2canvas` 截图 → 拼合 PDF
3. 使用 `jspdf` 库生成 PDF 文件
4. 或直接在幻灯片播放模式下调用浏览器打印功能
---
### P8 — 形状库扩充
**价值**:低,丰富编辑能力
**复杂度**:低
**AiPPT 参考**`geometry.js` 100+ 种 PPT 标准形状
#### 实现方案
1. 从 AiPPT `geometry.js` 提取形状 SVG path 定义
2. 转换为 Plait 的 `BasicShapes` / `FlowchartSymbols` 格式
3. 扩充 `shape-picker.tsx` 中的形状选择面板
4. 重点补充 PPT 常用形状:
- 箭头变体(左/右/上/下/双向/弯曲)
- 标注框(圆角/云朵/爆炸)
- 星形/旗帜/括号/数学符号
- 流程图补充形状
---
### P9 — 封面/缩略图自动生成
**价值**:中低,提升模板预览和分享体验
**复杂度**:低
**ai-to-pptx 参考**`cover.js` drawCover() 函数
#### 实现方案
ai-to-pptx 的 `cover.js` 实现了自动生成 PPT 封面缩略图的功能:
**算法**
- 画布尺寸600×338 (16:9)
- 灰色底色 rgb(212, 212, 212)
- 首页大图居中,占画布 65% 宽高
- 周围以 3×3 宫格布局排列最多 8 个子页面缩略图(每个占画布 1/3.3 宽高)
- 首页叠加在子页面之上,形成层叠预览效果
- 支持灰度模式(用于禁用/只读状态),使用 luminance 算法灰度化
**用途**
- 模板选择列表的缩略图
- PPT 分享/导出时的封面预览
- 项目列表中的 PPT 预览卡片
**aitu 实现建议**
1. **新增服务** `services/ppt-cover-service.ts`
```typescript
interface CoverOptions {
width?: number; // 封面宽度,默认 600
height?: number; // 封面高度,默认 338
maxSubPages?: number; // 最大子页面数,默认 8
grayScale?: boolean; // 是否灰度
}
async function generateCover(
frames: PlaitFrame[],
options?: CoverOptions
): Promise<string> // 返回 DataURL
```
2. **利用现有能力**
- 复用 `html2canvas` (P7 依赖) 截取 Frame 内容
- 或利用 Plait 的 SVG 导出能力截取 Frame
- 缩略图缓存在 `unified-cache-service` 中
3. **UI 集成**
- FramePanel 中显示 PPT 封面缩略图
- 模板选择页显示模板封面
- 项目列表卡片显示 PPT 封面预览
---
### P10 — PPT JSON 中间格式与传输优化
**价值**:中,统一数据格式,提升性能
**复杂度**:中低
**ai-to-pptx 参考**`element.js` 元素工厂 + pako gzip 压缩传输
#### 实现方案
**1. PPT JSON 中间格式**
ai-to-pptx 使用 JSON 作为 PPT 数据的统一中间表示(由 [ppt2json](https://github.com/veasion/ppt2json) 工具转换包含完整的页面、元素、样式定义。aitu 可建立类似的中间格式标准:
```typescript
interface PPTJsonDocument {
version: string;
width: number; // PPT 宽度 (如 1920)
height: number; // PPT 高度 (如 1080)
theme: PPTTheme; // 主题信息
pages: PPTJsonPage[]; // 页面列表
}
interface PPTJsonPage {
id: string;
name: string;
transition?: FrameTransition;
notes?: string;
background?: FillConfig;
elements: PPTJsonElement[]; // 页面内元素
}
interface PPTJsonElement {
id: string;
type: 'text' | 'image' | 'shape' | 'table' | 'chart' | 'group';
anchor: [number, number, number, number]; // [x, y, width, height]
fillStyle?: FillConfig;
strokeStyle?: StrokeConfig;
// 类型特有属性...
[key: string]: any;
}
```
**用途**
- AI 生成 PPT 的统一输出格式
- PPTX 导入/导出的中间转换层
- 模板定义的存储格式
- 前后端数据交互的标准协议
- 项目文件的持久化格式
**2. gzip 压缩传输**
当 PPT JSON 数据量较大时20+ 页,含图片 base64启用压缩传输
```typescript
// 压缩
import pako from 'pako';
const compressed = pako.gzip(JSON.stringify(pptJson));
const base64 = btoa(String.fromCharCode(...compressed));
// 解压
const binary = atob(base64);
const bytes = new Uint8Array(binary.length);
for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
const decompressed = JSON.parse(pako.ungzip(bytes, { to: 'string' }));
```
建议:在数据超过 100KB 时自动启用 gzip 压缩。
---
### P11 — 国际化/多语言 PPT 生成
**价值**:中低,扩大用户群体
**复杂度**:低
**ai-to-pptx 参考**`StepOneInputData.tsx` 语言选择 + `i18n.ts` 国际化配置
#### 实现方案
1. **AI 生成内容的语言控制**
- 在 `generate_ppt` MCP 工具中增加 `language` 参数
- AI Prompt 中指定生成内容的语言
- 支持语言:中文(zh)、英文(en)、日文(ja)、韩文(ko) 等
2. **模板中的多语言文案**
- 模板中的固定文案("目录"、"感谢"等)根据语言切换
- 建立模板文案的 i18n 映射表
3. **字体自动适配**
- 根据目标语言自动选择合适字体
- 中文:思源黑体/微软雅黑
- 英文Inter/Roboto
- 日文Noto Sans JP
- 利用现有 `font-manager-service.ts` 能力
---
### P12 — AI 精炼交互(自然语言迭代修改)
**价值**:高,显著提升 AI 辅助编辑的交互体验和内容质量
**复杂度**:中
**banana-slides 参考**`AiRefineInput` 组件 + `get_outline_refinement_prompt()` / `get_descriptions_refinement_prompt()`
#### 实现方案
**核心概念**:在 PPT 生成的各个阶段(大纲、内容、布局),用户可以用自然语言指令对 AI 生成结果进行迭代修改,且系统保留完整修改历史作为上下文,支持多轮对话式精炼。
**1. 精炼输入组件** (`components/ppt/ai-refine-input.tsx`)
参考 banana-slides 的 `AiRefineInput` 组件设计:
```typescript
interface AiRefineInputProps {
title: string; // 标题(如"AI 优化大纲"
placeholder: string; // 占位文字
onSubmit: (requirement: string, previousRequirements: string[]) => Promise<void>;
disabled?: boolean;
onStatusChange?: (isSubmitting: boolean) => void;
}
```
组件特性:
- 内置修改历史记录管理(展开/收起查看)
- 支持 Ctrl+Enter / Cmd+Enter 快捷键提交
- 提交中动画效果(加载态反馈)
- 紧凑模式(无标题时自动切换)
**2. 精炼 MCP 工具**
新增两个 MCP 工具:
```typescript
// 大纲精炼
interface RefineOutlineInput {
currentOutline: PPTOutline; // 当前大纲
requirement: string; // 用户修改需求
previousRequirements?: string[]; // 历史修改记录
}
// 内容精炼
interface RefineContentInput {
pageId: string; // 目标页面 ID
currentContent: PPTPageSpec; // 当前页面内容
requirement: string; // 用户修改需求
previousRequirements?: string[]; // 历史修改记录
outline: PPTOutline; // 完整大纲(上下文)
}
```
**3. 精炼 Prompt 设计**
参考 banana-slides 的精炼 prompt 设计要点:
- 将当前内容(大纲/描述)完整传入
- 附带所有历史修改请求作为上下文(避免 AI 遗忘之前的修改)
- 明确指示"只修改用户要求的部分,保留其他内容不变"
- 输出格式与原内容结构一致
**4. UI 集成**
- 大纲编辑器底部:嵌入精炼输入框
- Frame 内容编辑面板:嵌入精炼输入框
- 全局修改入口Chat Drawer 中支持对整个 PPT 进行自然语言修改
**用例示例**
- 「增加一页关于市场分析的内容」→ AI 在大纲中插入新章节
- 「将第三页的文字精简到 5 条要点」→ AI 重写该页内容
- 「整体风格改为更轻松活泼」→ AI 调整所有页面的措辞和描述
- 「删除第 5 页,将第 6-7 页合并」→ AI 重组大纲结构
---
### P13 — 内容版本管理与回退
**价值**:中高,提升用户编辑信心和容错能力
**复杂度**:中低
**banana-slides 参考**`PageImageVersion` 模型 (`backend/models/page_image_version.py`)
#### 实现方案
**核心概念**:每次 AI 生成或用户修改 Frame 内容时,自动保存一个版本快照,用户可查看历史版本并随时回退。
**1. 版本数据结构**
```typescript
interface FrameContentVersion {
id: string; // 版本 UUID
frameId: string; // 所属 Frame ID
versionNumber: number; // 版本号,从 1 开始递增
isCurrent: boolean; // 是否为当前使用版本
elements: PlaitElement[]; // 该版本的元素快照
createdAt: string; // 创建时间
source: 'ai_generate' | 'ai_refine' | 'user_edit' | 'template_change'; // 版本来源
description?: string; // 版本描述(如"AI 精炼:增加市场分析"
}
```
参考 banana-slides `PageImageVersion` 模型:
- `version_number`:递增整数
- `is_current`:布尔标记当前版本
- `page_id`:关联所属页面
- 切换版本时只需更新 `is_current` 标记
**2. 版本管理服务** (`services/frame-version-service.ts`)
```typescript
class FrameVersionService {
// 保存新版本AI 生成/精炼/用户编辑后自动调用)
saveVersion(frameId: string, elements: PlaitElement[], source: string, description?: string): void;
// 获取所有版本列表
getVersions(frameId: string): FrameContentVersion[];
// 切换到指定版本
switchToVersion(frameId: string, versionId: string): void;
// 获取当前版本号
getCurrentVersion(frameId: string): number;
}
```
**3. 版本触发时机**
| 触发场景 | `source` | 说明 |
|---------|----------|------|
| AI 首次生成 | `ai_generate` | 初始版本 |
| AI 精炼修改 | `ai_refine` | 每次精炼创建新版本 |
| 用户手动编辑 | `user_edit` | 防抖合并(如 5 秒内连续编辑合为一个版本) |
| 更换模板/主题 | `template_change` | 模板切换前自动保存 |
**4. UI 集成**
- FramePanel 中每个 Frame 显示版本计数标记
- 展开 Frame 可查看版本时间线(列表/缩略图形式)
- 点击历史版本可预览,确认后切换
- 存储策略:每个 Frame 最多保留 20 个版本,超出时删除最旧的
---
### P14 — 素材系统
**价值**:中,提升 PPT 内容丰富度和个性化能力
**复杂度**:中
**banana-slides 参考**`Material` 模型 + `MaterialCenterModal` + `MaterialSelector`
#### 实现方案
**核心概念**建立素材中心用户可上传、AI 可生成、从参考文件中提取素材图片,供 PPT 生成和编辑时引用。
**1. 素材数据结构**
```typescript
interface Material {
id: string; // 素材 UUID
projectId?: string; // 所属项目 IDnull 为全局素材)
filename: string; // 文件名
url: string; // 访问 URL
source: 'upload' | 'ai_generate' | 'file_extract'; // 素材来源
tags?: string[]; // 标签(便于检索)
createdAt: string;
}
```
参考 banana-slides `Material` 模型:
- `project_id`:外键,可为 null区分项目级和全局素材
- `relative_path` + `url`:文件存储和访问路径
- 关联关系:`Project.materials` (cascade delete)
**2. 素材来源**
| 来源 | 说明 | 实现方式 |
|------|------|---------|
| 用户上传 | 拖拽/选择上传图片 | 复用现有文件上传能力 |
| AI 生成 | 通过提示词生成素材图片 | 异步任务,复用 Gemini 图片生成 |
| 参考文件提取 | 从上传的 PDF/PPTX 中提取图片 | FileParserService 解析时提取 |
| 网络搜索 | 从网络搜索相关图片(可选) | 后续扩展 |
**3. 素材中心 UI** (`components/ppt/material-center-modal.tsx`)
参考 banana-slides 的 `MaterialCenterModal` + `MaterialSelector`
- 网格布局展示素材缩略图
- 支持按来源/标签筛选
- AI 生成入口:输入提示词,异步生成素材
- 拖拽素材到 Frame 中直接使用
- 生成 PPT 时可选择素材作为参考图片
**4. AI 生成集成**
- PPT 生成 prompt 中附带可用素材列表(图片 URL + 描述)
- AI 可在生成内容时引用素材库中的图片
- 参考 banana-slides素材图片路径以 Markdown 图片语法传入 prompt
---
### P15 — AI 自然语言编辑
**价值**:高,实现真正的"对话式 PPT 编辑"
**复杂度**:高
**banana-slides 参考**`get_image_edit_prompt()` + 图片编辑流程
#### 实现方案
**核心概念**:用户可以用自然语言指令修改已生成的 PPT 页面内容AI 智能判断修改意图并执行编辑操作。
**1. 编辑指令解析**
参考 banana-slides 的 `get_image_edit_prompt(edit_instruction, original_description)`AI 需要:
- 理解用户编辑意图(修改文字、调整布局、替换图片、改变样式等)
- 定位目标元素("标题"、"第二个要点"、"右侧图片"等自然语言定位)
- 生成具体的编辑操作
**2. 编辑 MCP 工具**
```typescript
interface EditFrameByNaturalLanguage {
frameId: string; // 目标 Frame ID
instruction: string; // 自然语言编辑指令
referenceImages?: string[]; // 参考图片(可选)
originalDescription?: string; // 页面原始描述(上下文)
}
```
**3. AI 编辑能力分层**
| 编辑层级 | 示例指令 | 实现方式 |
|---------|---------|---------|
| 文字修改 | 「将标题改为"2025年度报告"」 | 定位文本元素 → 更新 text 属性 |
| 样式调整 | 「把标题颜色改成红色」「放大正文字号」 | 定位元素 → 更新 style 属性 |
| 布局变更 | 「将图文从左右布局改为上下布局」 | 重新计算元素 position/size |
| 内容增删 | 「增加一个数据图表」「删除底部备注」 | 添加/移除 Frame 内元素 |
| 图片替换 | 「将背景图换成科技感更强的」 | AI 重新生成图片 → 替换 image 元素 |
| 整体重做 | 「这页重新生成,风格要更简洁」 | 保留大纲信息,重新生成整页内容 |
**4. 参考图片支持**
参考 banana-slides 的图片编辑流程,支持附加参考图片:
- 用户可从素材库选择参考图片
- 用户可框选 Frame 中的区域作为编辑目标
- AI 判断用户意图:修改选中区域 vs 在选中位置添加素材
**5. 与版本管理联动**
每次 AI 编辑操作自动创建新版本P13用户不满意可随时回退。
---
### P16 — 深度研究驱动 PPT
**价值**:高,显著提升 AI 生成内容的深度和准确性
**复杂度**:中
**LandPPT 参考**`DEEPResearchService` + `EnhancedResearchService` + Tavily/SearXNG 双引擎
#### 实现方案
**核心概念**:在 PPT 生成之前,先对用户主题进行自动化网络调研,生成结构化研究报告,作为 AI 生成 PPT 的知识基础。
**1. DEEP 研究方法论**
参考 LandPPT 的 `DEEPResearchService` 实现,采用 4 阶段研究流程:
```
用户输入主题 → [Define] 解析主题范围
→ [Explore] 多轮搜索Tavily + SearXNG
→ [Evaluate] AI 分析提取关键发现
→ [Present] 生成研究报告
→ 研究报告作为上下文传入大纲生成 prompt
```
**2. 增强研究服务**
LandPPT 的 `EnhancedResearchService` (`services/research/enhanced_research_service.py`, 25KB) 进一步增强了研究能力:
- 深度内容提取(`ContentExtractor`):从搜索结果 URL 中抓取完整文章内容
- 增强报告生成(`EnhancedReportGenerator`):多维度分析 + 引用来源
- SearXNG 自托管搜索(`SearXNGProvider`):开源搜索聚合引擎,支持多搜索引擎并行
**3. MCP 工具设计**
```typescript
interface ResearchForPPT {
topic: string; // 研究主题
language?: 'zh' | 'en'; // 研究语言
depth?: 'quick' | 'standard' | 'deep'; // 研究深度
maxSources?: number; // 最大来源数
}
interface ResearchReport {
executiveSummary: string; // 执行摘要
keyFindings: string[]; // 关键发现
recommendations: string[]; // 建议
sources: string[]; // 来源列表
totalDuration: number; // 耗时(秒)
}
```
**4. 与 P0 生成流程的集成**
研究报告通过 `research_section` 参数传入大纲生成 prompt参考 LandPPT `OutlinePrompts.get_outline_prompt_zh()` 的 `research_section` 参数AI 基于真实数据生成更有深度的内容。
aitu 实现建议:
- 在生成 PPT 对话流程中增加可选的「先研究再生成」步骤
- 集成 Tavily API 或类似搜索 API如 Perplexity、Exa
- 研究报告可缓存复用,避免重复搜索
- UI 中展示研究进度和来源列表,增强用户信任感
---
### P17 — 智能配图系统
**价值**:高,配图质量直接影响 PPT 专业感
**复杂度**:高
**LandPPT 参考**`PPTImageProcessor` + `ImageService`11 个图像 Provider+ 三合一配图策略
#### 实现方案
**核心概念**:为每页 PPT 智能匹配或生成配图,采用「本地图库 + 网络搜索 + AI 生成」三合一策略。
**1. 三合一配图策略**
参考 LandPPT 的 `PPTImageProcessor` (`services/ppt_image_processor.py`, 83KB) 和 `ImageService` (`services/image/image_service.py`, 42KB) 的分层架构:
| 图片来源 | Provider | 适用场景 | 成本 |
|---------|----------|---------|------|
| **本地图库** | `FileSystemStorageProvider` | 用户上传、历史素材 | 免费 |
| **网络搜索** | `PixabayProvider`, `UnsplashProvider`, `SearXNGImageProvider` | 通用场景图、风景、人物 | 免费/低 |
| **AI 生成** | `DalleProvider`, `GeminiProvider`, `OpenAIImageProvider`, `SiliconFlowProvider`, `StableDiffusionProvider`, `PollinationsProvider` | 定制化、创意图、抽象概念 | 中高 |
LandPPT 共实现了 **11 个图像 Provider**,通过 `provider_registry` 统一管理。
**2. 配图适配器**
LandPPT 的 `PPTPromptAdapter` (`services/image/adapters/ppt_prompt_adapter.py`, 14KB) 将 PPT 内容转换为图片搜索/生成的 prompt
- 分析幻灯片标题和内容点
- 生成适合搜索的关键词
- 生成适合 AI 图片模型的描述性 prompt
- 考虑图片用途(背景/配图/图标/数据可视化)
**3. 图片匹配与缓存**
LandPPT 的 `ImageMatcher` (`services/image/matching/image_matcher.py`, 23KB) 实现智能匹配:
- 语义匹配:根据内容语义选择最相关的图片
- 搜索缓存:避免重复搜索相同关键词
- 图片处理:`ImageProcessor` 支持缩放、裁剪、格式转换
- 缓存管理:`ImageCacheManager` (22KB) 管理图片缓存生命周期
**4. 数据模型**
```typescript
// 参考 LandPPT SlideImageInfo 模型
interface SlideImageInfo {
slideIndex: number;
imageSource: 'local' | 'network' | 'ai_generated';
imagePurpose: 'background' | 'illustration' | 'icon' | 'chart';
originalUrl: string;
processedUrl: string;
searchQuery?: string;
generationPrompt?: string;
}
```
**5. 每页图片限制与开关控制**
LandPPT 通过配置控制:
- `IMAGE_MAX_PER_SLIDE`:每页最大图片数
- 各来源独立开关(`ENABLE_PIXABAY` / `ENABLE_DALLE` / ...
- 默认 Provider 选择:`DEFAULT_IMAGE_PROVIDER`
aitu 实现建议:
- 在 PPT 生成流程中增加配图阶段(大纲 → 内容 → **配图** → 渲染)
- 优先使用免费搜索 APIPixabay / UnsplashAI 生成作为高级选项
- 复用现有 Gemini 图片生成能力
- 图片适配器将幻灯片内容自动转换为搜索/生成 prompt
- 用户可手动替换或重新生成单页配图
---
### P18 — TODO 任务板实时追踪
**价值**:中高,提升长任务(多页 PPT 生成)的用户体验
**复杂度**:中
**LandPPT 参考**`ProgressTracker` + `TodoBoard` + `TodoStage` 模型
#### 实现方案
**核心概念**PPT 生成是多阶段长任务(研究 → 大纲 → 内容 → 配图 → 渲染),需要可视化的进度追踪面板。
**1. 进度追踪模型**
参考 LandPPT 的 `TodoBoard` + `TodoStage` 数据库模型:
```typescript
interface PPTGenerationBoard {
projectId: string;
currentStageIndex: number;
overallProgress: number; // 0-100
stages: PPTGenerationStage[];
}
interface PPTGenerationStage {
stageId: string;
stageIndex: number;
title: string; // 如"生成大纲"、"生成第3页内容"
description?: string;
status: 'pending' | 'running' | 'completed' | 'failed' | 'skipped';
progress: number; // 0-100
result?: any; // 阶段结果数据
}
```
**2. 生成阶段定义**
| 阶段 | 标题 | 说明 |
|------|------|------|
| 1 | 深度研究 | (可选)网络调研主题 |
| 2 | 生成大纲 | AI 生成结构化大纲 |
| 3 | 选择模板 | 自动/手动选择模板 |
| 4-N | 生成第 X 页 | 逐页生成内容+布局 |
| N+1 | 智能配图 | (可选)为各页匹配图片 |
| N+2 | 质量检查 | AI 检查输出质量 |
**3. 实时进度推送**
参考 LandPPT 的 SSE 进度推送:
- 后端每完成一个阶段/子阶段,推送进度更新
- 前端实时更新进度面板
- 支持单页粒度的完成/失败/跳过状态
**4. UI 集成**
参考 LandPPT 的 `todo_board.html` (276KB)
- 左侧阶段列表(带状态图标和进度条)
- 右侧当前阶段详情
- 底部总体进度条
- 失败阶段支持重试
- 集成在 Chat Drawer 侧边栏或独立面板中
aitu 实现建议:
- 复用现有 WorkZone 进度展示机制
- 在 Chat Drawer 中嵌入进度面板
- 生成完成后进度面板自动转为结果预览
---
### P19 — AI 聊天编辑(视觉参考)
**价值**:高,提供基于视觉的智能编辑体验
**复杂度**:高
**LandPPT 参考**`project_slides_editor.html` (657KB) 在线编辑器 + 视觉参考聊天
#### 实现方案
**核心概念**:用户可以在查看 PPT 页面的同时,通过 AI 聊天界面描述修改需求AI 理解当前页面视觉内容后执行精确编辑。
**1. 视觉参考编辑**
LandPPT 的 AI 聊天编辑支持**视觉参考**——AI 不仅理解文本内容,还能"看到"当前幻灯片的渲染效果:
- 将当前页面截图作为多模态消息附加给 AI
- AI 基于视觉+文本双重理解,精确定位和修改元素
- 支持 `AIMessage` 中的 `ImageContent` 多模态消息
**2. 场景化编辑**
LandPPT 的 `AIService` 根据 PPT 关键词自动判断用户意图并注入专业系统提示词:
```python
ppt_keywords = [
"PPT", "幻灯片", "演示文稿", "slide", "presentation",
"ppt", "修改", "调整", "优化", "美化", "设计", "布局"
]
```
当检测到 PPT 编辑意图时,自动切换为 PPT 编辑专家角色。
**3. 编辑能力层次**
| 编辑维度 | 示例 | LandPPT 实现 |
|---------|------|-------------|
| 文字内容 | "修改标题为..." | 直接编辑 HTML 文本内容 |
| 视觉样式 | "改为蓝色主题" | 修改 CSS 变量 / 模板配色 |
| 布局调整 | "改为两栏布局" | 重新生成 HTML 模板 |
| 图表更新 | "更新图表数据" | 修改 Chart.js 数据 |
| 整页重做 | "重新生成这一页" | 重新调用内容+模板生成 |
aitu 实现建议:
- 复用现有 Chat Drawer 作为编辑聊天入口
- 利用 Gemini 多模态能力,将当前 Frame 截图附加到聊天消息
- AI 返回结构化编辑指令(而非直接返回 HTML由前端执行
- 与 P15 AI 自然语言编辑融合,统一编辑入口
---
### P20 — 项目管理与协作
**价值**:中,提升多 PPT 项目的管理效率
**复杂度**:中
**LandPPT 参考**`Project` 模型 + `ProjectManager` + 项目分享功能
#### 实现方案
**核心概念**:建立 PPT 项目管理体系,支持项目列表、状态追踪、版本历史、分享协作。
**1. 项目数据模型**
参考 LandPPT 的 `Project` 模型 (`database/models.py`)
```typescript
interface PPTProject {
id: string;
projectId: string; // UUID
title: string;
scenario?: string; // 场景类型
topic: string; // 主题
requirements?: string; // 需求描述
status: 'draft' | 'generating' | 'completed' | 'failed';
outline?: PPTOutline; // 大纲 JSON
confirmedRequirements?: object; // 确认的需求配置
metadata?: object; // 项目元数据
version: number; // 版本号
shareToken?: string; // 分享令牌
shareEnabled: boolean; // 是否启用分享
createdAt: string;
updatedAt: string;
}
```
**2. 项目版本管理**
参考 LandPPT 的 `ProjectVersion` 模型:
- 每次重大操作(生成/重新生成/模板切换)自动保存项目版本
- 版本包含完整数据快照 + 版本描述
- 支持回退到任意历史版本
**3. 项目分享**
LandPPT 支持通过 `share_token` 分享项目:
- 生成唯一分享链接
- 访问者可查看 PPT只读模式
- 可选择是否启用分享
**4. 项目列表与仪表板**
参考 LandPPT 的 `projects_list.html` + `project_dashboard.html`
- 项目卡片列表(含封面缩略图 + 状态 + 创建时间)
- 项目仪表板(统计信息 + 最近编辑 + 快捷操作)
- 支持搜索和筛选
aitu 实现建议:
- 将现有画布文档扩展为「PPT 项目」概念
- 每个 PPT 项目关联一组 Frame + 大纲 + 模板配置
- 支持项目导出/导入JSON 格式)
- 分享功能可复用现有协作基础设施
---
### P21 — PPT 视频导出与 AI 图片直出
**价值**:中高,为 PPT 提供视频化传播和极致视觉质量的新通道
**复杂度**:中高
**NanoBanana 参考**`generate_ppt.py` + `generate_ppt_video.py` + `video_composer.py` + `kling_api.py`
#### 实现方案
**核心概念**:在传统可编辑 PPT 之外提供两种增值输出模式——AI 图片直出(每页为高品质图片)和 PPT 视频导出(含 AI 转场动画的完整演示视频)。
**1. AI 图片直出模式**
参考 NanoBanana 的 `generate_ppt.py` (452 行) 实现,利用 Gemini 图片生成模型直接生成每页 PPT 的完整图片:
```typescript
interface PPTImageGenerationOptions {
topic: string; // 主题
pages: PPTPagePlan[]; // 每页内容规划
style: 'gradient-glass' | 'vector-illustration' | string; // 视觉风格
resolution: '2K' | '4K'; // 输出分辨率
model?: string; // 图片模型(默认 Gemini
}
interface PPTPagePlan {
pageNumber: number;
pageType: 'cover' | 'content' | 'data'; // 页面类型
title: string;
contentPoints: string[];
}
interface PPTImageResult {
pages: { pageNumber: number; imageUrl: string; prompt: string }[];
viewerHtml: string; // HTML 播放器
}
```
**Prompt 构建流程**
1. 加载风格模板Markdown 文件定义的基础提示词 + 页面类型模板)
2. 拼合最终 prompt`基础风格 + 页面类型模板 + 实际内容 + 分辨率指令`
3. 调用图片生成模型16:9 宽高比)
**2. PPT 视频导出**
参考 NanoBanana 的视频生成流水线(`generate_ppt_video.py`, 462 行),实现 PPT → 视频的完整转换:
```
PPT 页面截图 → 页间转场视频生成 → FFmpeg 合成完整视频
```
**视频合成模块** (`video_composer.py`, 493 行)
| 功能 | 实现 | 参数 |
|------|------|------|
| 静态页面视频 | 图片 → 指定时长的视频片段 | H.264, CRF 23, 24fps |
| 视频拼接(快速) | FFmpeg concat demuxer | 无重编码 |
| 视频拼接(标准化) | FFmpeg filter_complex | 统一分辨率/帧率/宽高比 |
| 完整合成 | 预览 + (静态页 + 转场) × N | 可选是否包含预览和转场 |
**视频素材管理** (`video_materials.py`, 459 行)
- `generate_preview_video()`:首页循环预览视频(首尾帧相同)
- `generate_transition_videos()`:页间转场视频(并发生成,`max_concurrent=3`
- 支持 `ThreadPoolExecutor` 并发执行多个视频生成任务
**3. 交互式 HTML 播放器**
NanoBanana 提供两种 HTML 播放器模板:
**图片播放器** (`templates/viewer.html`, 337 行)
- 全屏黑色背景,`object-fit: contain`
- 键盘导航:方向键/Home/End/空格自动播放/ESC 全屏/H 隐藏控件
- 触摸滑动支持(移动设备)
- 鼠标移动自动显示/隐藏控件3 秒超时)
**视频播放器** (`templates/video_viewer.html`, 438 行)
- `VideoPPTPlayer` 类,视频+图片混合播放
- 状态管理:`isPreviewMode` → `isTransitioning` → 静态页面
- 播放逻辑:首页播放预览视频(循环)→ 右键播放转场视频 → 视频结束显示目标页
- 加载动画 + 错误处理
aitu 实现建议:
- **图片直出模式**:作为 P0 AI 生成 PPT 的「极致视觉」选项,复用现有 Gemini 图片生成能力
- **视频导出**:作为 P7PDF 导出)的扩展,新增「导出为视频」选项
- AI 视频转场可作为高级付费功能API 成本较高)
- 简单模式无转场直接拼合每页静态视频FFmpeg 即可实现,无需视频 API
- 高级模式AI 视频转场(可灵 AI / Veo / Sora 等图生视频 API
- HTML 播放器可嵌入分享链接,实现在线演示
---
## 实施路线图
```
Phase 1 (P0 + P1) → AI 生成 PPT + PPTX 导出 = 完整的 PPT 创作闭环
Phase 2 (P2 + P3 + P10) → 模板系统 + 图表/表格 + JSON 格式 = 提升生成质量
Phase 3 (P4 + P5 + P9) → 切换/元素动画 + 演讲稿生成 + 封面 = 专业演示体验
Phase 4 (P6 + P7 + P8 + P11) → 导入 + PDF + 形状库 + 多语言 = 完善生态
Phase 5 (P12 + P13) → AI 精炼交互 + 版本管理 = 智能迭代体验
Phase 6 (P14 + P15) → 素材系统 + AI 自然语言编辑 = 高级 AI 编辑
Phase 7 (P16 + P17 + P18) → 深度研究 + 智能配图 + 任务追踪 = 智能生成增强
Phase 8 (P19 + P20) → AI 聊天编辑 + 项目管理 = 完整产品体验
Phase 9 (P21) → PPT 视频导出 + AI 图片直出 = 视频化传播
```
> 注:
> - P12/P13 建议在 Phase 1 完成后尽早启动,因为精炼交互和版本管理能显著提升 P0 的用户体验。可与 Phase 2 并行开发。
> - P16深度研究和 P17智能配图可在 Phase 1 完成后作为 P0 的增强模块独立开发,与 Phase 2 并行。
> - P18任务追踪建议与 P0 同期开发,提升长任务的用户体验。
> - P21PPT 视频导出)中的图片直出模式可与 Phase 1 并行开发(仅需 Gemini 图片生成能力),视频转场部分可延后。
## 技术依赖
| 新增依赖 | 用途 | 包大小 |
|---------|------|--------|
| `pptxgenjs` | PPTX 导出 (P1) | ~300KB |
| `pako` | gzip 压缩传输 (P10) | ~45KB |
| `jspdf` | PDF 导出 (P7) | ~300KB |
| `html2canvas` | Frame 截图 (P7/P9/P19) | ~40KB |
> 注P0-P20 中大部分能力不需要额外第三方依赖。P5 演讲稿生成、P12 精炼交互、P13 版本管理、P14 素材系统、P15-P20 均依赖现有 AI API 能力实现。
**banana-slides 相关技术参考**
| 技术/服务 | banana-slides 用途 | aitu 参考价值 |
|---------|-------------------|-------------|
| MinerU API | 文档解析PDF/DOCX/PPTX → Markdown | P0 参考文件解析、P6 导入辅助 |
| MarkItDown | Excel/CSV 转 Markdown | P0 表格文件输入 |
| Inpainting (火山引擎/Gemini/百度) | 删除元素后背景修复 | P1 可编辑导出、元素删除后背景补全 |
| ThreadPoolExecutor | 异步任务管理 | P0 批量生成、P14 素材生成 |
**LandPPT 相关技术参考**
| 技术/服务 | LandPPT 用途 | aitu 参考价值 |
|---------|-------------|-------------|
| Tavily API | 深度研究搜索引擎 | P16 深度研究驱动 PPT |
| SearXNG | 自托管搜索聚合引擎 | P16 备选搜索引擎 |
| Playwright | 无头浏览器 HTML→PDF/PPTX 导出 | P1 高保真导出备选方案 |
| Apryse SDK | 专业级 PDF→PPTX 转换 | P6 PPT 导入辅助 |
| LangGraph / LangChain | 文档分析工作流编排 | P0 文档处理工作流 |
| Pixabay / Unsplash API | 免费图片搜索 | P17 智能配图(网络搜索) |
| DALL-E / Stable Diffusion / SiliconFlow | AI 图片生成 | P17 智能配图AI 生成) |
| Chart.js | HTML 幻灯片中图表渲染 | P3 图表元素渲染 |
| Tailwind CSS | HTML 模板样式系统 | P2 模板渲染 |
**NanoBanana-PPT-Skills 相关技术参考**
| 技术/服务 | NanoBanana 用途 | aitu 参考价值 |
|---------|---------------|-------------|
| Gemini 3 Pro (`gemini-3-pro-image-preview`) | AI 图片直出 PPT每页完整图片 | P0 AI 图片直出模式、P21 图片直出 |
| 可灵 AI API (`kling-v2-6`) | 图生视频(首尾帧 → 转场视频) | P4 AI 视频转场、P21 视频导出 |
| Claude API (`claude-sonnet-4-5-20250929`) | 智能分析图片差异生成转场提示词 | P4 AI 视频转场提示词自动生成 |
| FFmpeg | 静态图 → 视频 + 多视频拼接合成 | P21 PPT 视频导出 |
| JWT (HS256) | 可灵 AI API 认证 | P21 视频 API 集成 |
| Markdown 风格模板 | 定义 AI 图片生成的视觉风格 | P2 风格模板体系补充 |
| HTML5 播放器 | 图片/视频交互式播放 | P21 在线演示播放器 |
---
## 附录ai-to-pptx 项目能力对照表
> 以下汇总了从 [ai-to-pptx](https://github.com/SmartSchoolAI/ai-to-pptx) 项目中识别的所有可借鉴能力及其在本文档中的对应位置。
| ai-to-pptx 能力 | 源文件 | aitu 对应规划 | 状态 |
|-----------------|--------|-------------|------|
| 五步向导式生成流程 | `AiPPTX.tsx` | P0 — AI 一键生成 PPT | 已覆盖 |
| SSE 流式大纲生成 | `sse.ts` | P0 — 流式生成体验 | 已覆盖 |
| 三层大纲编辑 | `OutlineEdit.tsx` | P0 — 大纲编辑器 UI | 已覆盖 |
| 多种输入源(文本/文件/URL/大纲) | `StepOneInputData.tsx` | P0 — **借鉴补充** | 新增 |
| 生成选项(篇幅/语言/要求) | `StepOneInputData.tsx` | P0 — **借鉴补充** | 新增 |
| 异步生成 + 进度追踪 | `StepFiveGeneratePpt.tsx` | P0 — **借鉴补充** | 新增 |
| gzip 压缩传输 | pako + base64 | P10 — **新增** | 新增 |
| PPTX 下载导出 | `downloadPptx.php` | P1 — PPT 导出 | 已覆盖 |
| 模板选择系统 | `SelectTemplate.tsx` | P2 — 模板系统 | 已覆盖 |
| 主题色提取 | `calcSubjectColor()` | P2 — 主题色提取 | 已覆盖 |
| 模板制作规范(页面类型/元素数量) | `README_Make_Template.md` | P2 — **借鉴补充** | 新增 |
| 6 种内容页网格布局 | `README_Make_Template.md` | P2 — **借鉴补充** | 新增 |
| 更换模板保留内容 | `changePptxTemplate` | P2 — **借鉴补充** | 新增 |
| 图表渲染(柱/饼/线/环) | `chart.js` | P3 — 图表元素 | 已覆盖 |
| 表格元素 | `element.js createTable()` | P3 — **借鉴补充** | 新增 |
| 图表数据格式(类 Excel 二维数组) | `element.js createChart()` | P3 — **借鉴补充** | 新增 |
| 16 种页面切场动画 | `animation.js transitionList` | P4 — **借鉴补充** | 新增 |
| 元素级动画(入场/退场/强调/路径 226 个预设) | `animation.js animationList` | P4 — **借鉴补充** | 新增 |
| 100+ 标准几何形状 | `geometry.js` | P8 — 形状库扩充 | 已覆盖 |
| 封面缩略图自动生成 | `cover.js` | P9 — **新增** | 新增 |
| PPT JSON 中间格式 | `element.js` 元素工厂 | P10 — **新增** | 新增 |
| 国际化/多语言生成 | `i18n.ts` + 语言选择 | P11 — **新增** | 新增 |
| SVG + Canvas 双引擎渲染 | `ppt2svg.js` + `ppt2canvas.js` | — | aitu 已有 Plait 渲染引擎 |
| SVG 编辑模式(选中/拖拽/文字编辑) | `ppt2svg.js` edit mode | — | aitu 已有 Plait 编辑能力 |
| AI 模型配置DeepSeek/OpenAI | `Setting.tsx` | — | aitu 已有 Gemini API 配置 |
---
## 附录banana-slides 项目能力对照表
> 以下汇总了从 [banana-slides](https://github.com/snakeying/banana-slides)(蕉幻)项目中识别的所有可借鉴能力及其在本文档中的对应位置。
| banana-slides 能力 | 源文件 | aitu 对应规划 | 状态 |
|-------------------|--------|-------------|------|
| 三种创建模式idea/outline/description | `models/project.py` `creation_type` | P0 — **借鉴补充** | 新增 |
| AI 精炼交互(自然语言修改大纲/描述) | `AiRefineInput.tsx` + `prompts.py` `get_*_refinement_prompt()` | P0 — **借鉴补充** + P12 — **新增** | 新增 |
| 参考文件智能解析MinerU + MarkItDown | `file_parser_service.py` | P0 — **借鉴补充** | 新增 |
| 17 种分级 Prompt 设计 | `prompts.py` (930 行) | P0 — **借鉴补充** | 新增 |
| 项目级额外要求extra_requirements | `models/project.py` | P0 — **借鉴补充** | 新增 |
| 多 AI Provider 工厂模式Gemini/OpenAI/Vertex | `ai_service.py` + `ai_providers/` | P0 — **借鉴补充** | 新增 |
| 三种导出格式图片PPTX/PDF/可编辑PPTX | `export_service.py` | P1 — **借鉴补充** | 新增 |
| 可编辑 PPTX 逆向导出(版面分析 + Inpainting | `image_editability/service.py` + `inpainting_service.py` | P1 — **借鉴补充** | 新增 |
| 8 种预设 AI 风格描述 | `presetStyles.ts` + `Home.tsx` | P2 — **借鉴补充** | 新增 |
| 自定义模板图片 + 纯文字风格描述 | `models/project.py` `template_image_path` / `template_style` | P2 — **借鉴补充** | 新增 |
| AI 精炼交互系统(多轮对话 + 历史上下文) | `AiRefineInput.tsx` + `get_outline_refinement_prompt()` | P12 — **新增** | 新增 |
| 内容版本管理与回退 | `page_image_version.py` `PageImageVersion` | P13 — **新增** | 新增 |
| 素材系统(项目级/全局 + AI 生成) | `material.py` + `MaterialCenterModal.tsx` + `MaterialSelector.tsx` | P14 — **新增** | 新增 |
| AI 自然语言图片编辑 | `prompts.py` `get_image_edit_prompt()` + `ai_service.py` `edit_image()` | P15 — **新增** | 新增 |
| 异步任务管理ThreadPoolExecutor + 进度追踪) | `task_manager.py` | P0 — 借鉴补充(异步生成) | 参考 |
| 文本属性提取(字体/颜色/大小) | `prompts.py` `get_text_attribute_extraction_prompt()` | P1 — 借鉴补充(可编辑导出) | 参考 |
| Inpainting 背景修复(火山引擎/Gemini/百度) | `inpainting_service.py` | P1 — 借鉴补充 | 参考 |
| 导出错误处理ExportError + ExportWarnings | `export_service.py` | P1 — 借鉴补充 | 参考 |
| 图片 caption 自动生成 | `file_parser_service.py` `_enhance_image_descriptions()` | P0 — 借鉴补充(参考文件解析) | 参考 |
| 语言配置zh/en/ja/auto | `prompts.py` `LANGUAGE_CONFIG` | P11 — 多语言 | 已覆盖(扩展) |
| 推理模式控制thinking budget | `ai_providers/__init__.py` | — | aitu 已有 Gemini API 配置 |
| React 18 + Zustand + Tailwind 前端架构 | `frontend/` | — | aitu 已有 Angular + Plait 架构 |
| Flask + SQLite 后端架构 | `backend/` | — | aitu 已有 Hono 后端架构 |
---
## 附录LandPPT 项目能力对照表
> 以下汇总了从 [LandPPT](https://github.com/sligter/LandPPT) 项目中识别的所有可借鉴能力及其在本文档中的对应位置。
| LandPPT 能力 | 源文件 | aitu 对应规划 | 状态 |
|-------------|--------|-------------|------|
| DEEP 研究方法论Define/Explore/Evaluate/Present | `deep_research_service.py` + `enhanced_research_service.py` | P0 — **借鉴补充** + P16 — **新增** | 新增 |
| 角色级 AI Provider 配置6 种角色独立模型) | `enhanced_ppt_service.py` `_get_role_provider(role)` | P0 — **借鉴补充** | 新增 |
| 7 种场景模板tourism/education/analysis 等) | `ai_service.py` `scenario_templates` | P0 — **借鉴补充** | 新增 |
| 6 类模块化 Prompt 管理架构PPTPromptsManager | `services/prompts/` 6 个模块 | P0 — **借鉴补充** | 新增 |
| summeryanyfile 文档处理模块32 种格式 + 6 种分块策略) | `summeryanyfile/` 独立模块 | P0 — **借鉴补充** | 新增 |
| 进度追踪系统ProgressTracker 线程安全) | `progress_tracker.py` | P0 — **借鉴补充** + P18 — **新增** | 新增 |
| 5 种导出格式PPTX/PDF/HTML/DOCX/Markdown | `pyppeteer_pdf_converter.py` + `pdf_to_pptx_converter.py` | P1 — **借鉴补充** | 新增 |
| Playwright + Apryse 双引擎导出 | `pyppeteer_pdf_converter.py` (99.9KB) + `pdf_to_pptx_converter.py` | P1 — **借鉴补充** | 新增 |
| AI 自动生成母版模板(设计基因提取) | `global_master_template_service.py` (47KB) | P2 — **借鉴补充** | 新增 |
| 25 种预设模板 JSON 系统 | `template_examples/` 25 个 JSON | P2 — **借鉴补充** | 新增 |
| 设计基因提取与创意变化 Prompt 体系 | `design_prompts.py` (581 行) | P2 — **借鉴补充** | 新增 |
| 16+ 种图表类型(含甘特图/森林图/韦恩图等) | `outline_prompts.py` `chart_config` | P3 — **借鉴补充** | 新增 |
| 大纲阶段图表预配置 | `outline_prompts.py` slides[].chart_config | P3 — **借鉴补充** | 新增 |
| 完整演讲稿生成系统7 语气 × 7 受众 × 3 复杂度) | `speech_script_service.py` (793 行) | P5 — **借鉴补充** | 新增 |
| 演讲稿 Prompt 设计(开场白/正文/结束语) | `speech_script_prompts.py` | P5 — **借鉴补充** | 新增 |
| 深度研究驱动 PPTTavily + SearXNG 双引擎) | `deep_research_service.py` + `research/` | P16 — **新增** | 新增 |
| 智能配图三合一(本地+网络+AI 生成) | `ppt_image_processor.py` (83KB) + `image/` (11 个 Provider) | P17 — **新增** | 新增 |
| TODO 任务板实时追踪 | `todo_board.html` (276KB) + `TodoBoard`/`TodoStage` 模型 | P18 — **新增** | 新增 |
| AI 聊天编辑(视觉参考) | `project_slides_editor.html` (657KB) + `ai_service.py` | P19 — **新增** | 新增 |
| 项目管理与版本历史 | `Project` + `ProjectVersion` 模型 + `project_manager.py` | P20 — **新增** | 新增 |
| 项目分享功能share_token | `share_service.py` + `Project.share_token` | P20 — **新增** | 新增 |
| 4 Provider AI 抽象层OpenAI/Anthropic/Google/Ollama | `ai/providers.py` (1094 行) | P0 — 借鉴补充(多 Provider | 参考 |
| 多模态消息支持(文本+图片) | `ai/base.py` `AIMessage` + `ImageContent` | P19 — AI 聊天编辑 | 参考 |
| Think 标签过滤(推理模型兼容) | `providers.py` `_filter_think_content()` | — | 参考 |
| 修复/验证 Prompt 体系6 种修复) | `repair_prompts.py` | P0 — 借鉴补充(质量保证) | 参考 |
| 文件处理FileProcessor 7 种场景检测) | `file_processor.py` | P0 — 借鉴补充(文件输入) | 参考 |
| OpenAI 兼容 API兼容 DeepSeek/Kimi/MiniMax/302.AI | `api/openai_compat.py` | — | aitu 已有 Gemini API 配置 |
| 用户认证系统JWT + SHA256 | `auth/` | — | aitu 已有认证体系 |
| FastAPI + SQLAlchemy + SQLite 后端架构 | `src/landppt/` | — | aitu 已有 Hono 后端架构 |
| Jinja2 + 原生 JS 前端架构 | `web/templates/` + `web/static/` | — | aitu 已有 Angular + Plait 架构 |
---
## 附录NanoBanana-PPT-Skills 项目能力对照表
> 以下汇总了从 [NanoBanana-PPT-Skills](https://github.com/op7418/NanoBanana-PPT-Skills) 项目中识别的所有可借鉴能力及其在本文档中的对应位置。
>
> 项目特点与其他项目ai-to-pptx / banana-slides / LandPPT生成可编辑元素不同NanoBanana 采用 **AI 图片直接生成整页 PPT** 的范式,并首创了 **AI 视频转场** 能力。
| NanoBanana 能力 | 源文件 | aitu 对应规划 | 状态 |
|----------------|--------|-------------|------|
| AI 图片直出 PPTGemini 3 Pro 全页图片生成) | `generate_ppt.py` (452 行) | P0 — **借鉴补充** + P21 — **新增** | 新增 |
| Markdown 风格模板系统(页面类型分模板) | `styles/gradient-glass.md` + `styles/vector-illustration.md` | P0 — **借鉴补充** | 新增 |
| 6 阶段 Claude Code Skill 工作流 | `SKILL.md` (675 行) | P0 — **借鉴补充** | 新增 |
| 页数自适应内容规划策略5/10/15/25 页模板) | `SKILL.md` 内容规划策略 | P0 — **借鉴补充** | 新增 |
| AI 视频转场(可灵 AI 图生视频) | `kling_api.py` (431 行) + `video_materials.py` (459 行) | P4 — **借鉴补充** + P21 — **新增** | 新增 |
| 智能转场提示词生成Claude 分析图片差异) | `transition_prompt_generator.py` (314 行) | P4 — **借鉴补充** | 新增 |
| 转场提示词模板框架A/B 类策略) | `prompts/transition_template.md` (42 行) | P4 — **借鉴补充** | 新增 |
| 预设通用转场描述(无需 API | `simple_transition_prompt_generator.py` (106 行) | P4 — **借鉴补充** | 新增 |
| FFmpeg 视频合成(静态页+转场拼接) | `video_composer.py` (493 行) | P21 — **新增** | 新增 |
| PPT 视频完整导出流水线 | `generate_ppt_video.py` (462 行) | P21 — **新增** | 新增 |
| 交互式图片播放器HTML5 + 键盘/触摸) | `templates/viewer.html` (337 行) | P21 — **新增** | 新增 |
| 交互式视频播放器(视频+图片混合播放) | `templates/video_viewer.html` (438 行) | P21 — **新增** | 新增 |
| 视频素材并发管理ThreadPoolExecutor | `video_materials.py` `generate_all_materials()` | P21 — 新增(并发生成) | 参考 |
| 渐变毛玻璃卡片风格 | `styles/gradient-glass.md` (91 行) | P2 — 模板系统(风格参考) | 参考 |
| 矢量插画风格 | `styles/vector-illustration.md` (132 行) | P2 — 模板系统(风格参考) | 参考 |
| Prompt 文件读取器 | `prompt_file_reader.py` (118 行) | — | 参考 |
| 可灵 AI JWT 认证封装 | `kling_api.py` `KlingVideoGenerator` | — | 参考 |
| Claude Code Skill 安装脚本 | `install_as_skill.sh` (203 行) | — | aitu 已有 MCP 工具体系 |
| Python 3.8+ CLI 工具架构 | `generate_ppt.py` + `generate_ppt_video.py` | — | aitu 已有 Node.js 后端架构 |