
Document Illustrator
- 664 installs
- 573 repo stars
- Updated January 21, 2026
- op7418/document-illustrator-skill
document-illustrator is a Generative Media skill that automatically generates styled illustrations and cover images from any document or article for developers who need format-agnostic visuals without manual image design
About
document-illustrator is an agent skill that reads Markdown, plain text, PDF, or other documents, uses AI to extract core themes, and generates professional illustrations per section plus an optional full-document cover image. It supports three visual styles—gradient glass card, ticket style, and vector illustration—and two aspect ratios: 16:9 landscape and 3:4 portrait. Developers reach for document-illustrator when publishing README guides, blog posts, or internal notes that need consistent branded imagery without opening Figma. The skill allows Read, Write, Glob, AskUserQuestion, and Bash python commands, targeting claude-sonnet-4-5-20250514, and accepts paths like /path/to/document.md for end-to-end illustration pipelines.
- AI intelligently extracts core themes from any document format including Markdown, plain text, or PDF
- Generates images in three distinct styles: gradient glass cards, ticket style, and vector illustration
- Supports flexible aspect ratios: 16:9 landscape and 3:4 portrait
- Optional cover image that summarizes the entire document
- Interactive 3-question workflow that asks for ratio, cover preference, and number of images (recommended 3-10)
Document Illustrator by the numbers
- 664 all-time installs (skills.sh)
- +6 installs in the week ending Jul 26, 2026 (Skillselion tracking)
- Ranked #336 of 1,901 Documentation skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Jul 26, 2026 (Skillselion catalog sync)
npx skills add https://github.com/op7418/document-illustrator-skill --skill document-illustratorAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 664 |
|---|---|
| repo stars | ★ 573 |
| Security audit | 3 / 3 scanners passed |
| Last updated | January 21, 2026 |
| Repository | op7418/document-illustrator-skill ↗ |
How do you generate illustrations from documents?
Automatically generate styled illustrations and cover images from any document or article.
Who is it for?
Developers publishing technical articles or documentation who want AI-generated section art and covers from existing Markdown or PDF source files.
Skip if: UI mockups, icon sets for apps, or photo editing workflows that do not start from a written document's structure and themes.
When should I use this skill?
The user asks to generate illustrations, cover images, or document images from an article, README, or notes file.
What you get
Themed section illustrations, optional cover image, and saved image files matched to document topics and chosen style ratio.
- Section illustrations
- Optional cover image
By the numbers
- Supports 3 illustration styles
- Supports 2 aspect ratios: 16:9 and 3:4
Files
Document Illustrator Skill
基于 AI 智能分析的文档配图生成工具。无需依赖特定格式,自动理解内容并生成专业配图。
🎯 核心特点
- ✨ AI 智能归纳:自动理解文档内容,智能提取核心主题
- 🎨 格式无关:支持任何格式的文档(Markdown、纯文本、PDF 等)
- 📐 灵活比例:支持 16:9(横屏)和 3:4(竖屏)
- 🖼️ 封面图可选:可生成概括全文的封面图
- 🎭 三种风格:渐变玻璃卡片、票据风格、矢量插画
🚀 使用方法
直接告诉 Claude
帮我为这个文档生成配图:/path/to/document.md或者:
我想为这篇文章生成一些配图📝 完整工作流程
第 1 步:Claude 读取和理解文档
当你请求生成配图时,Claude 会: 1. 使用 Read 工具读取完整文档 2. AI 分析理解文档内容和结构 3. 识别核心主题和要点
无需担心文档格式:
- ✅ 标准 Markdown(##、###)
- ✅ 分隔线格式(======、------)
- ✅ 纯文本段落
- ✅ 任何其他格式
第 2 步:配置选项(3 个问题)
Claude 会询问你的偏好:
问题 1:图片比例
请选择图片比例:
1. 16:9 (横屏) - 适合演示文稿、幻灯片、横屏展示
2. 3:4 (竖屏) - 适合社交媒体、手机查看、海报
请选择 (1/2):问题 2:封面图
是否生成封面图?
封面图将概括文档的所有核心信息,作为系列配图的引导。
1. 是 - 生成封面图 + 内容配图
2. 否 - 仅生成内容配图
请选择 (1/2):问题 3:内容配图数量
期望生成多少张内容配图?
建议范围:3-10 张
根据文档内容,推荐生成 6 张
请输入数字:第 3 步:Claude 归纳内容并展示
根据你指定的数量,Claude 会智能归纳文档,然后展示给你确认:
📋 内容归纳完成
📄 封面图内容:(如果选择生成)
"AI 编程工具概念演化:从 Rules 到 Skills"
- 核心概念:静态上下文 vs 动态上下文
- 演化路径:Rules → Commands → MCP → Modes → Skills
- 最佳实践:简化为两个核心工具
📚 内容配图(共 6 张):
1. Rules 的诞生与演化
包含:早期模型幻觉问题、rules 文件的作用、静态上下文概念
2. Commands 和工作流打包
包含:固定工作流的出现、slash command、团队分享
3. MCP Servers 带来动态能力
包含:第三方工具集成、OAuth 认证、上下文膨胀问题
4. Modes 和 Subagents 的登场
包含:人设提示词、系统提示词修改、可靠性设计、Hooks 确定性
5. Skills 统一动态上下文
包含:Skills 概念、动态加载、编程工具优化
6. 最佳实践与未来展望
包含:Rules 使用建议、Skills 探索、核心理念总结
✓ 所有内容已覆盖,无遗漏
确认开始生成配图吗?(Y/N)关键保证:
- ✅ 内容完整:所有重要信息都会被归入某张图片
- ✅ 逻辑清晰:按照内容的自然逻辑分段
- ✅ 用户可控:展示归纳结果,等待用户确认
第 4 步:生成配图
确认后,Claude 调用 Python 脚本生成图片:
🖼️ 开始生成配图...
正在生成封面图...
✓ 已保存: /path/to/document/images/cover.png
正在生成第 1/6 张...
标题: Rules 的诞生与演化
✓ 已保存: /path/to/document/images/illustration-01.png
正在生成第 2/6 张...
标题: Commands 和工作流打包
✓ 已保存: /path/to/document/images/illustration-02.png
...
✨ 完成!共生成 7 张配图(1 张封面 + 6 张内容)第 5 步:输出结果
输出位置:文档所在目录下的 images/ 文件夹
/path/to/your/document/
└── images/
├── cover.png # 封面图(如果选择生成)
├── illustration-01.png # 第 1 张内容配图
├── illustration-02.png # 第 2 张内容配图
├── illustration-03.png
├── illustration-04.png
├── illustration-05.png
└── illustration-06.png🎨 三种风格说明
1. 渐变玻璃卡片风格 (gradient-glass)
特点:
- Apple Keynote 风格的极简主义
- 玻璃拟态(Glassmorphism)设计
- 深邃虚空黑或纯净陶瓷白基底
- 流动的极光渐变色
- 3D 玻璃物体和发光效果
适用场景:
- 科技产品介绍
- 数据分析报告
- 未来趋势展望
- 产品功能演示
2. 票据风格 (ticket)
特点:
- 数字极简票券设计
- 高度对比的黑白配色
- 类似登机牌、门票的结构
- 精确的几何分区
- 中英混排,多向文字布局
适用场景:
- 信息图表
- 统计数据展示
- 时间线和流程图
- 要点总结
3. 矢量插画风格 (vector-illustration)
特点:
- 扁平化矢量插画
- 统一粗细的黑色轮廓线
- 复古柔和的配色
- 几何化处理
- 横向全景式构图
适用场景:
- 故事叙述
- 概念解释
- 教育内容
- 品牌宣传
💡 使用示例
示例 1:完整流程
用户: 帮我为 ~/blog/ai-tools.md 生成配图,用票据风格
Claude: 好的,让我先读取这个文档...
[读取文档,分析内容]
检测到文档长度约 3000 字,内容涉及 AI 工具演化。
请选择图片比例:
1. 16:9 (横屏)
2. 3:4 (竖屏)
用户: 1
Claude: 是否生成封面图?
1. 是
2. 否
用户: 是
Claude: 期望生成多少张内容配图?
建议范围:3-10 张
根据文档内容,推荐生成 5 张
用户: 5
Claude: [展示归纳的 5 个主题]
确认开始生成配图吗?
用户: Y
Claude: [调用 Python 脚本生成 6 张图片]
✨ 完成!配图已保存到 ~/blog/images/示例 2:纯文本文档
用户: 为这个纯文本笔记生成配图
Claude: [读取笔记,即使没有任何标题也能理解内容]
[智能识别 3 个核心主题]
[询问配置、展示归纳、生成配图]示例 3:自定义数量
用户: 我想要 8 张图,竖屏的,不要封面
Claude: 好的,16:9 竖屏,不生成封面,8 张内容配图。
[将文档归纳为 8 个主题]
[展示归纳结果,用户确认后生成]🔧 技术细节
图片规格
| 比例 | 分辨率 | 适用场景 |
|---|---|---|
| 16:9 | 2560x1440 (2K) | 演示文稿、横屏展示 |
| 3:4 | 1920x2560 | 社交媒体、竖屏查看 |
可选 4K 分辨率:
- 16:9 → 3840x2160
- 3:4 → 2880x3840
API 调用
- 模型:Gemini 2.0 Flash Image Preview (Nano Banana Pro)
- 成本:每张图片 = 1 次 API 调用
- 速度:平均 10-20 秒/张
环境要求
必需:
pip install google-genai pillow python-dotenvAPI 密钥:
- 在
~/.claude/skills/document-illustrator/.env中配置 - 或设置环境变量
GEMINI_API_KEY
📊 内容归纳原则
Claude 归纳内容时遵循以下原则:
1. 完整性优先
- ✅ 所有重要信息都会被包含
- ✅ 不会遗漏关键概念
- ✅ 保留原文的核心观点
2. 逻辑清晰
- 按照内容的自然逻辑分段
- 相关内容归为一组
- 保持叙事的连贯性
3. 平衡分配
- 每张图片包含相似的信息量
- 避免某张过于拥挤或空洞
- 根据内容重要性调整
4. 用户可控
- 展示归纳结果给用户确认
- 用户可以要求调整
- 确认后才开始生成
🐛 故障排除
问题 1:API 密钥错误
错误信息:
Error: Invalid API key解决方案: 1. 检查 .env 文件中的 GEMINI_API_KEY 2. 确保 API 密钥有效且未过期 3. 获取新密钥:https://makersuite.google.com/app/apikey
问题 2:内容归纳不理想
问题:归纳的主题不符合预期
解决方案: 1. 在归纳展示阶段,告诉 Claude 你的期望 2. Claude 会重新归纳并调整 3. 确认满意后再开始生成
问题 3:图片生成失败
可能原因:
- 网络连接问题
- API 配额用尽
- 内容过长超过限制
解决方案: 1. 检查网络连接 2. 检查 API 配额 3. 尝试增加图片数量(分散内容)
💰 成本估算
| 图片数量 | API 调用次数 | 预估成本 |
|---|---|---|
| 无封面 + 3 张 | 3 次 | 低 |
| 有封面 + 5 张 | 6 次 | 中 |
| 有封面 + 10 张 | 11 次 | 较高 |
建议:
- 短文档(<1000字):3-5 张
- 中等文档(1000-3000字):5-7 张
- 长文档(>3000字):8-10 张
📚 最佳实践
1. 合理选择图片数量
太少:
- 每张图片信息量过大
- 不容易理解和记忆
太多:
- 内容分散
- 增加成本和生成时间
推荐:
- 根据文档长度选择
- 每张图片涵盖 1-2 个核心观点
2. 根据用途选择比例
16:9 适合:
- PPT 演示
- 网站横幅
- 视频封面
- 博客配图(桌面端)
3:4 适合:
- 社交媒体(Instagram、小红书)
- 移动端文章
- 海报设计
- 竖屏视频
3. 封面图的使用
建议生成封面图的场景:
- 系列文章(作为统一引导)
- 社交分享(作为预览图)
- 文档首页(概括全文)
可以不生成的场景:
- 仅内部使用
- 图片数量已足够
- 希望降低成本
4. 风格选择建议
技术文档 → 渐变玻璃卡片风格 数据报告 → 票据风格 教程故事 → 矢量插画风格 产品介绍 → 渐变玻璃卡片风格
🔄 工作原理
传统方式(已废弃)
[代码] 读取文档 → 识别 ## ### 标题 → 机械切分
↓
依赖特定格式
容易遗漏内容
不够智能新方式(当前实现)
[Claude] 读取文档 → AI 理解内容 → 智能归纳主题
↓
格式无关
内容完整
用户可控核心区别:
- ❌ 旧方式:依赖代码解析,只能处理标准格式
- ✅ 新方式:AI 理解内容,任何格式都能处理
🎯 与其他工具的对比
| 功能 | Document Illustrator | 传统 PPT 工具 | AI 图片生成器 |
|---|---|---|---|
| 理解文档内容 | ✅ AI 智能理解 | ❌ 需要手动 | ❌ 需要手动输入 |
| 格式依赖 | ✅ 格式无关 | ❌ 依赖特定格式 | ✅ 无依赖 |
| 内容完整性 | ✅ 自动验证 | ⚠️ 手动确保 | ❌ 无法保证 |
| 批量生成 | ✅ 一次生成多张 | ❌ 逐张制作 | ⚠️ 需要多次输入 |
| 风格一致性 | ✅ 自动保持 | ⚠️ 手动调整 | ⚠️ 需要重复提示词 |
📞 获取帮助
如有问题或建议: 1. 直接在 Claude Code 中询问 Claude 2. 查看计划文件:~/.claude/plans/shimmering-tickling-seahorse.md 3. 检查 Skill 目录:~/.claude/skills/document-illustrator/
---
让 AI 帮你理解和归纳内容,生成专业配图! ✨
# 环境变量和敏感信息
.env
.env.local
.env.*.local
# API 密钥和凭证
*.key
*.pem
credentials.json
# Python 缓存
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
# 虚拟环境
venv/
env/
ENV/
.venv
# IDE 和编辑器
.vscode/
.idea/
*.swp
*.swo
*~
.DS_Store
# 生成的图片(可选,根据需要调整)
# images/
# *.png
# *.jpg
# *.jpeg
# 日志文件
*.log
# 临时文件
*.tmp
*.temp
.cache/
# 测试覆盖率
.coverage
htmlcov/
.pytest_cache/
# 打包文件
dist/
build/
*.egg-info/
示例图片
本目录用于存放 Document Illustrator 生成的示例图片,展示不同风格和场景的配图效果。
📂 目录结构
examples/
├── README.md # 本文件
├── tech-article.png # 技术文章示例(占位符)
├── data-report.png # 数据报告示例(占位符)
└── tutorial.png # 教程示例(占位符)🎨 示例说明
1. tech-article.png - 技术文章配图
风格:渐变玻璃卡片风格(gradient-glass) 比例:16:9(横屏) 分辨率:2560x1440 (2K) 适用场景:科技博客、技术文档、演示文稿
特点:
- 现代科技感
- 玻璃拟态效果
- 流动的渐变色
- 适合深色或浅色背景
2. data-report.png - 数据报告配图
风格:票据风格(ticket) 比例:3:4(竖屏) 分辨率:1920x2560 (2K) 适用场景:信息图表、统计数据、社交媒体分享
特点:
- 黑白极简设计
- 高对比度
- 结构化布局
- 适合数据展示
3. tutorial.png - 教程配图
风格:矢量插画风格(vector-illustration) 比例:16:9(横屏) 分辨率:2560x1440 (2K) 适用场景:教育内容、故事叙述、品牌宣传
特点:
- 扁平化插画
- 温馨友好
- 复古柔和配色
- 适合故事化内容
📝 如何添加示例
如果你想为本项目贡献示例图片:
1. 使用 Document Illustrator 生成高质量的配图 2. 确保图片具有代表性和展示价值 3. 将图片保存到本目录 4. 更新本 README.md,添加图片说明 5. 提交 Pull Request
⚠️ 注意事项
- 示例图片仅用于展示目的
- 请确保示例内容不包含敏感信息
- 图片文件大小建议控制在 2MB 以内
- 推荐使用 PNG 格式以保证质量
🔗 相关资源
- 主 README - 查看完整文档
- 风格提示词 - 查看所有可用风格
- 生成脚本 - 了解技术实现
---
说明:当前示例图片为占位符。实际使用时,你可以用自己生成的图片替换这些占位符,以展示真实的生成效果。
MIT License
Copyright (c) 2026 歸藏
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Document Illustrator
基于 AI 智能分析的文档配图生成工具
 
Document Illustrator 是一个 Claude Code Skill,它能智能理解文档内容,自动归纳核心要点,并为每个主题生成专业配图。无需依赖特定文档格式,AI 会理解内容并生成符合你选择风格的高质量图片。
✨ 核心特性
- 🤖 AI 智能归纳:自动理解文档内容,智能提取核心主题,无需依赖标题格式
- 📝 格式无关:支持任何格式的文档(Markdown、纯文本、PDF 等)
- 🎨 三种风格:渐变玻璃卡片、票据风格、矢量插画,满足不同场景需求
- 📐 灵活比例:支持 16:9(横屏)和 3:4(竖屏)两种图片比例
- 🖼️ 封面图可选:可生成概括全文的封面图作为系列配图的引导
- ✅ 内容完整:展示归纳结果供你确认,确保所有重要信息都被包含
🚀 快速开始
使用 npx 安装(推荐)
npx skills add https://github.com/op7418/Document-illustrator-skill手动安装
1. 克隆或下载本仓库到 Claude Skills 目录:
cd ~/.claude/skills/
git clone https://github.com/op7418/Document-illustrator-skill.git2. 配置 API 密钥(见下方"配置说明"部分)
3. 安装 Python 依赖(见下方"环境要求"部分)
基本使用
在 Claude Code 中直接告诉 Claude:
帮我为这个文档生成配图:/path/to/document.md或者:
我想为这篇文章生成一些配图Claude 会引导你完成整个配图生成流程。
🎨 三种风格说明
1. 渐变玻璃卡片风格 (gradient-glass)
视觉特点:
- Apple Keynote 风格的极简主义设计
- 玻璃拟态(Glassmorphism)效果
- 深邃虚空黑或纯净陶瓷白基底
- 流动的极光渐变色
- 3D 玻璃物体和发光效果
适用场景:
- 科技产品介绍
- 数据分析报告
- 未来趋势展望
- 产品功能演示
2. 票据风格 (ticket)
视觉特点:
- 数字极简票券设计
- 高度对比的黑白配色
- 类似登机牌、门票的结构化布局
- 精确的几何分区
- 中英混排,多向文字布局
适用场景:
- 信息图表
- 统计数据展示
- 时间线和流程图
- 要点总结
3. 矢量插画风格 (vector-illustration)
视觉特点:
- 扁平化矢量插画
- 统一粗细的黑色轮廓线
- 复古柔和的配色方案
- 几何化处理
- 横向全景式构图
适用场景:
- 故事叙述
- 概念解释
- 教育内容
- 品牌宣传
📦 安装和配置
步骤 1: 安装 Skill
使用 npx(推荐):
npx skills add https://github.com/op7418/Document-illustrator-skill手动安装:
cd ~/.claude/skills/
git clone https://github.com/op7418/Document-illustrator-skill.git
cd document-illustrator步骤 2: 配置 API 密钥
1. 获取 Gemini API 密钥:Google AI Studio
2. 在 Skill 根目录创建 .env 文件:
cd ~/.claude/skills/document-illustrator
echo "GEMINI_API_KEY=your-api-key-here" > .env或直接编辑 .env 文件:
GEMINI_API_KEY=your-api-key-here安全提示:.env 文件包含敏感信息,请勿提交到版本控制系统步骤 3: 安装 Python 依赖
cd ~/.claude/skills/document-illustrator
pip install google-genai pillow python-dotenv或使用 pip3:
pip3 install google-genai pillow python-dotenv步骤 4: 验证安装
运行测试命令:
python3 scripts/generate_single_image.py --help预期输出应显示脚本的帮助信息,表示安装成功。
📖 使用方法
方式 1: 通过 Claude Code 使用(推荐)
这是主要的使用方式,让 Claude 智能处理整个流程。
基本命令:
帮我为这个文档生成配图:~/blog/my-article.md交互式流程:
1. 选择图片比例
- 16:9(横屏)- 适合演示文稿、网站横幅
- 3:4(竖屏)- 适合社交媒体、手机查看
2. 是否生成封面图
- 是 - 生成封面图 + 内容配图
- 否 - 仅生成内容配图
3. 指定配图数量
- 根据文档长度,Claude 会推荐合适的数量
- 你可以自定义需要的图片数量(建议 3-10 张)
4. 确认内容归纳
- Claude 会展示归纳的主题列表
- 确认所有重要内容都被包含
- 可以要求调整归纳结果
5. 生成配图
- 确认后,自动调用 Gemini API 生成图片
- 图片保存到文档所在目录的
images/文件夹
完整示例:
用户: 帮我为 ~/documents/ai-evolution.md 生成配图,用渐变玻璃风格
Claude: 好的,让我先读取这个文档...
[读取并分析文档内容]
检测到文档长度约 3000 字。
请选择图片比例:
1. 16:9 (横屏)
2. 3:4 (竖屏)
用户: 1
Claude: 是否生成封面图?
1. 是
2. 否
用户: 是
Claude: 期望生成多少张内容配图?
建议范围:3-10 张
根据文档内容,推荐生成 5 张
用户: 5
Claude: 📋 内容归纳完成
📄 封面图内容:
"AI 技术演化:从规则到智能"
- 核心概念、演化路径、最佳实践
📚 内容配图(共 5 张):
1. AI 技术的起源
2. 机器学习的突破
3. 深度学习革命
4. 大语言模型时代
5. 未来发展趋势
✓ 所有内容已覆盖,无遗漏
确认开始生成配图吗?(Y/N)
用户: Y
Claude: 🖼️ 开始生成配图...
正在生成封面图...
✓ 已保存: ~/documents/images/cover.png
正在生成第 1/5 张...
✓ 已保存: ~/documents/images/illustration-01.png
...
✨ 完成!共生成 6 张配图方式 2: 直接使用 Python 脚本(高级用户)
如果你想要更多控制或进行批量处理,可以直接调用 Python 脚本。
单图生成:
python3 scripts/generate_single_image.py \
--title "人工智能的未来" \
--content "AI 技术正在快速发展..." \
--style gradient-glass \
--aspect-ratio 16:9 \
--resolution 2K \
--output ~/output/image.png参数说明:
--title: 图片标题--content: 图片内容描述--style: 风格(gradient-glass / ticket / vector-illustration)--aspect-ratio: 比例(16:9 / 3:4)--resolution: 分辨率(2K / 4K)--output: 输出文件路径
🔍 示例展示
示例 1: 技术文章配图
!技术文章示例
使用渐变玻璃卡片风格,16:9 比例,适合科技博客和演示文稿。
示例 2: 数据报告配图
!数据报告示例
使用票据风格,3:4 比例,适合信息图表和社交媒体分享。
示例 3: 教程配图
!教程示例
使用矢量插画风格,16:9 比例,适合教育内容和故事叙述。
注意:以上为示例占位符。实际生成的图片效果取决于文档内容和选择的风格。
⚙️ 工作原理
整体架构
📄 文档输入
↓
🤖 Claude 读取和理解
↓
💡 AI 智能归纳核心主题
↓
✅ 用户确认内容分配
↓
🎨 调用 Gemini API 生成图片
↓
💾 保存到本地目录与传统方式的对比
传统方式:
代码解析标题 → 机械切分章节 → 生成配图
↓
❌ 依赖特定格式(## ###)
❌ 容易遗漏非标准内容
❌ 无法理解语义Document Illustrator:
AI 理解内容 → 智能归纳主题 → 用户确认 → 生成配图
↓
✅ 格式无关,任何文档都能处理
✅ 保证内容完整性
✅ 用户可控,结果透明核心优势:
- AI 理解文档语义,而非简单的格式解析
- 智能归纳保证内容完整,不会遗漏重要信息
- 用户确认机制,生成前可以调整归纳结果
👨💻 开发者指南
目录结构
document-illustrator/
├── README.md # 项目说明文档(本文件)
├── LICENSE # MIT 许可证
├── SKILL.md # Skill 定义文件(供 Claude Code 使用)
├── .env # API 密钥配置(需自行创建)
├── .gitignore # Git 忽略规则
├── scripts/ # Python 脚本目录
│ ├── generate_illustrations.py # 批量生成脚本(已废弃)
│ └── generate_single_image.py # 单图生成脚本
├── styles/ # 风格提示词目录
│ ├── gradient-glass.md # 渐变玻璃卡片风格
│ ├── ticket.md # 票据风格
│ └── vector-illustration.md # 矢量插画风格
└── examples/ # 示例图片目录(可选)
└── README.md # 示例说明自定义风格
你可以创建自己的图片风格:
1. 在 styles/ 目录创建新的 .md 文件,例如 my-style.md
2. 编写 Gemini 提示词:
### 提示词
帮我生成一张[描述你的风格]的图片...
[详细的风格要求]
- 配色方案
- 构图规则
- 设计元素
- 视觉效果3. 修改 scripts/generate_single_image.py 以支持新风格(在 --style 参数中添加新选项)
贡献指南
我们欢迎贡献!如果你想为本项目做出贡献:
1. Fork 本仓库
2. 创建功能分支:
git checkout -b feature/my-new-feature3. 提交你的更改:
git commit -m "Add: 新功能描述"4. 推送到分支:
git push origin feature/my-new-feature5. 创建 Pull Request
贡献类型:
- 新的图片风格
- 功能改进
- Bug 修复
- 文档完善
- 测试用例
代码规范:
- 遵循 PEP 8 Python 代码风格
- 添加必要的注释和文档字符串
- 确保代码可读性和可维护性
❓ 常见问题
Q: API 密钥无效怎么办?
A: 请检查以下几点: 1. 确认 .env 文件中的 GEMINI_API_KEY 拼写正确 2. 确保 API 密钥有效且未过期 3. 检查 API 密钥是否有足够的配额 4. 重新获取密钥:Google AI Studio
Q: 生成的图片不符合预期怎么办?
A: 可以尝试: 1. 在归纳展示阶段,告诉 Claude 你的期望,它会重新归纳 2. 尝试不同的风格 3. 调整配图数量(增加或减少) 4. 提供更详细的文档内容
Q: 如何调整图片质量?
A: 使用 --resolution 参数:
2K(默认):16:9 为 2560x1440,3:4 为 1920x25604K:16:9 为 3840x2160,3:4 为 2880x3840
注意:4K 图片生成时间更长,API 成本可能更高。
Q: 支持批量处理多个文档吗?
A: 目前推荐通过 Claude Code 逐个处理文档。如果需要批量处理,可以编写自定义脚本循环调用 generate_single_image.py。
Q: 成本估算?
A: 每张图片需要调用一次 Gemini API:
- 无封面 + 3 张:3 次调用
- 有封面 + 5 张:6 次调用
- 有封面 + 10 张:11 次调用
具体成本取决于 Google AI 的定价策略,请查看 Gemini API 定价。
Q: 为什么有时图片生成失败?
A: 可能的原因: 1. 网络连接问题 - 检查网络连接 2. API 配额用尽 - 检查 API 使用量 3. 内容过长 - 脚本会自动截取前 1000 字符 4. API 服务临时不可用 - 稍后重试
📊 技术规格
| 项目 | 说明 |
|---|---|
| AI 模型 | gemini-3-pro-image-preview (Nano Banana Pro) |
| 图片格式 | PNG |
| 16:9 分辨率 | 2K (2560x1440) / 4K (3840x2160) |
| 3:4 分辨率 | 2K (1920x2560) / 4K (2880x3840) |
| 支持文档格式 | Markdown, 纯文本, PDF 等(任何 Claude 可读的格式) |
| 平均生成时间 | 10-20 秒/张 |
| Python 版本 | 3.8+ |
| 主要依赖 | google-genai, pillow, python-dotenv |
💡 最佳实践
1. 合理选择图片数量
太少(1-2 张):
- 每张图片信息量过大
- 不容易理解和记忆
- 视觉负担重
太多(15+ 张):
- 内容分散,缺乏重点
- 增加生成时间和成本
- 可能过于碎片化
推荐:
- 短文档(<1000 字):3-5 张
- 中等文档(1000-3000 字):5-7 张
- 长文档(>3000 字):8-10 张
- 每张图片涵盖 1-2 个核心观点
2. 根据用途选择比例
16:9 适合:
- PPT 演示和幻灯片
- 网站横幅和博客配图
- 视频封面和缩略图
- 桌面端展示
3:4 适合:
- 社交媒体(Instagram、小红书、微信朋友圈)
- 移动端文章和 H5 页面
- 海报设计
- 竖屏视频和 Story
3. 封面图的使用场景
建议生成封面图:
- 系列文章(作为统一的视觉引导)
- 社交分享(作为预览图吸引点击)
- 文档首页(概括全文主旨)
- 演示文稿开场
可以不生成封面图:
- 仅内部使用的文档
- 图片数量已经足够
- 希望降低 API 调用成本
- 不需要总览性的图片
4. 风格选择建议
| 内容类型 | 推荐风格 | 理由 |
|---|---|---|
| 技术文档 | 渐变玻璃卡片 | 现代、科技感强 |
| 数据报告 | 票据风格 | 简洁、信息密度高 |
| 教程故事 | 矢量插画 | 温馨、易于理解 |
| 产品介绍 | 渐变玻璃卡片 | 高端、未来感 |
| 学术论文 | 票据风格 | 专业、严谨 |
| 儿童内容 | 矢量插画 | 可爱、友好 |
📄 许可证
本项目采用 MIT 许可证。
你可以自由地:
- ✅ 使用本软件用于商业或非商业目的
- ✅ 修改本软件
- ✅ 分发本软件
- ✅ 将本软件用于私人用途
前提是:
- 📝 在所有副本中包含原始许可证和版权声明
🙏 致谢
本项目由以下技术驱动:
- Claude Sonnet 4.5 - AI 智能内容分析和归纳
- Gemini 3 Pro Image Preview - 高质量图片生成
- Claude Code - Skill 执行环境
特别感谢所有为本项目做出贡献的开发者和用户。
📞 联系方式
- Issues: GitHub Issues
- Discussions: GitHub Discussions
如有问题或建议,欢迎通过以上方式联系!
---
让 AI 帮你理解和归纳内容,生成专业配图! ✨
#!/usr/bin/env python3
"""
Document Illustrator - 为文档生成配图
基于文档内容和风格提示词,使用 Gemini AI 生成高质量配图
"""
import os
import sys
import re
import argparse
from pathlib import Path
from dotenv import load_dotenv
def find_and_load_env():
"""
智能查找并加载 .env 文件
优先级:
1. 当前脚本所在目录的上一级(Skill 根目录)
2. 当前工作目录
3. 用户主目录下的 .claude/skills/document-illustrator/
"""
# 获取脚本所在目录的上一级(Skill 根目录)
skill_root = Path(__file__).parent.parent
env_path = skill_root / ".env"
if env_path.exists():
load_dotenv(env_path, override=True)
print(f"✅ 已加载环境变量: {env_path}")
return True
# 尝试当前工作目录
if Path(".env").exists():
load_dotenv(".env", override=True)
print("✅ 已加载环境变量: ./.env")
return True
# 尝试 Claude Code Skill 标准位置
claude_skill_env = Path.home() / ".claude" / "skills" / "document-illustrator" / ".env"
if claude_skill_env.exists():
load_dotenv(claude_skill_env, override=True)
print(f"✅ 已加载环境变量: {claude_skill_env}")
return True
# 如果都没找到,尝试默认加载
load_dotenv(override=True)
print("⚠️ 未找到 .env 文件,尝试使用系统环境变量")
return False
# 智能加载环境变量
find_and_load_env()
def analyze_document_structure(doc_path):
"""
分析文档的标题层级结构
返回:{
'h2': ['标题1', '标题2', ...],
'h3': ['标题1', '标题2', ...],
'h4': ['标题1', '标题2', ...],
'sections': [
{'level': 'h2', 'title': '...', 'content': '...'},
{'level': 'h3', 'title': '...', 'content': '...'},
...
]
}
"""
if not Path(doc_path).exists():
print(f"错误: 文件不存在: {doc_path}", file=sys.stderr)
sys.exit(1)
with open(doc_path, 'r', encoding='utf-8') as f:
content = f.read()
# 使用正则表达式识别标题
# 匹配 ##、###、#### 等标题(不包括 # 一级标题)
heading_pattern = re.compile(r'^(#{2,4})\s+(.+)$', re.MULTILINE)
headings = heading_pattern.findall(content)
if not headings:
print("错误: 文档中没有找到标题(##、###、####)", file=sys.stderr)
print("请确保文档使用 Markdown 格式并包含标题", file=sys.stderr)
sys.exit(1)
# 统计各级标题
h2_titles = []
h3_titles = []
h4_titles = []
for level, title in headings:
if level == '##':
h2_titles.append(title)
elif level == '###':
h3_titles.append(title)
elif level == '####':
h4_titles.append(title)
# 提取每个小节的内容
sections = []
# 将文档按标题分割
lines = content.split('\n')
current_section = None
for i, line in enumerate(lines):
# 检查是否是标题行
match = re.match(r'^(#{2,4})\s+(.+)$', line)
if match:
# 保存上一个小节
if current_section:
sections.append(current_section)
# 开始新小节
level_marks, title = match.groups()
level = 'h' + str(len(level_marks))
current_section = {
'level': level,
'title': title,
'content': '',
'line_start': i
}
elif current_section:
# 累积当前小节的内容
current_section['content'] += line + '\n'
# 添加最后一个小节
if current_section:
sections.append(current_section)
# 清理每个小节的内容(移除首尾空白)
for section in sections:
section['content'] = section['content'].strip()
return {
'h2': h2_titles,
'h3': h3_titles,
'h4': h4_titles,
'sections': sections
}
def merge_sections_by_level(sections, target_level):
"""
根据目标层级智能合并章节,确保不丢失内容
规则:
- 如果选择 h2:将所有 h3、h4 内容合并到对应的 h2 父章节下
- 如果选择 h3:将所有 h4 内容合并到对应的 h3 父章节下
- 如果选择 h4:保持原样
返回:合并后的章节列表
"""
level_hierarchy = {'h2': 2, 'h3': 3, 'h4': 4}
target_level_num = level_hierarchy[target_level]
merged_sections = []
current_parent = None
for section in sections:
section_level_num = level_hierarchy[section['level']]
if section_level_num == target_level_num:
# 找到目标层级的章节
if current_parent:
# 保存上一个父章节
merged_sections.append(current_parent)
# 创建新的父章节
current_parent = {
'level': section['level'],
'title': section['title'],
'content': section['content'],
'merged_from': [section['title']] # 记录合并来源
}
elif section_level_num > target_level_num:
# 子章节,需要合并到当前父章节
if current_parent:
# 添加子章节的内容
if current_parent['content']:
current_parent['content'] += '\n\n'
# 添加子章节标题和内容
current_parent['content'] += f"【{section['title']}】\n{section['content']}"
current_parent['merged_from'].append(section['title'])
else:
# 没有父章节,说明文档结构有问题,作为独立章节处理
merged_sections.append({
'level': section['level'],
'title': section['title'],
'content': section['content'],
'merged_from': [section['title']]
})
elif section_level_num < target_level_num:
# 比目标层级更高的章节(比如选了 h3 但遇到 h2)
# 保存当前父章节
if current_parent:
merged_sections.append(current_parent)
# 这个高层级章节作为独立章节
merged_sections.append({
'level': section['level'],
'title': section['title'],
'content': section['content'],
'merged_from': [section['title']]
})
current_parent = None
# 保存最后一个父章节
if current_parent:
merged_sections.append(current_parent)
return merged_sections
def verify_content_coverage(original_sections, merged_sections):
"""
验证内容覆盖度,确保没有章节被遗漏
返回:{
'all_covered': True/False,
'original_count': 原始章节数,
'merged_count': 合并后章节数,
'coverage_report': [
{'title': '...', 'status': 'included/merged', 'merged_into': '...'},
...
]
}
"""
# 收集所有原始章节标题
original_titles = {s['title'] for s in original_sections}
# 收集合并后覆盖的所有标题
covered_titles = set()
coverage_report = []
for merged in merged_sections:
covered_titles.update(merged['merged_from'])
if len(merged['merged_from']) == 1:
# 未合并的章节
coverage_report.append({
'title': merged['title'],
'status': 'independent',
'merged_into': None
})
else:
# 合并的章节
main_title = merged['merged_from'][0]
sub_titles = merged['merged_from'][1:]
coverage_report.append({
'title': main_title,
'status': 'parent',
'merged_into': None
})
for sub_title in sub_titles:
coverage_report.append({
'title': sub_title,
'status': 'merged',
'merged_into': main_title
})
# 检查是否有遗漏
missing_titles = original_titles - covered_titles
for missing in missing_titles:
coverage_report.append({
'title': missing,
'status': 'MISSING',
'merged_into': None
})
return {
'all_covered': len(missing_titles) == 0,
'original_count': len(original_sections),
'merged_count': len(merged_sections),
'missing_count': len(missing_titles),
'coverage_report': coverage_report
}
def prompt_user_for_granularity(structure):
"""
根据文档结构,让用户选择生成粒度
返回:选中的标题级别('h2', 'h3', 或 'h4')
"""
print(f"\n检测到文档结构:")
print(f"- {len(structure['h2'])} 个二级标题 (##)")
print(f"- {len(structure['h3'])} 个三级标题 (###)")
print(f"- {len(structure['h4'])} 个四级标题 (####)")
print(f"\n请选择生成粒度:")
options = []
if len(structure['h2']) > 0:
print(f"1. 粗粒度 - 按二级标题生成 ({len(structure['h2'])} 张图片)")
options.append(('1', 'h2'))
if len(structure['h3']) > 0:
print(f"2. 中等粒度 - 按三级标题生成 ({len(structure['h3'])} 张图片)")
options.append(('2', 'h3'))
if len(structure['h4']) > 0:
print(f"3. 细粒度 - 按四级标题生成 ({len(structure['h4'])} 张图片)")
options.append(('3', 'h4'))
if not options:
print("错误: 文档中没有找到任何标题", file=sys.stderr)
sys.exit(1)
while True:
valid_choices = [opt[0] for opt in options]
choice = input(f"\n请输入选择 ({'/'.join(valid_choices)}): ").strip()
for opt_choice, opt_level in options:
if choice == opt_choice:
return opt_level
print(f"无效选择,请输入 {' 或 '.join(valid_choices)}")
def prompt_user_for_style():
"""
让用户选择风格
返回:风格文件路径
"""
# 获取 styles 目录路径
skill_root = Path(__file__).parent.parent
styles_dir = skill_root / "styles"
# 定义风格选项
styles = [
{
'number': '1',
'name': '渐变玻璃卡片风格',
'description': '现代科技感,毛玻璃效果,未来感强',
'file': 'gradient-glass.md'
},
{
'number': '2',
'name': '票据风格',
'description': '黑白对比,极简设计,高级感',
'file': 'ticket.md'
},
{
'number': '3',
'name': '矢量插画风格',
'description': '扁平化插画,色彩柔和,温馨可爱',
'file': 'vector-illustration.md'
}
]
print("\n请选择配图风格:")
for style in styles:
print(f"{style['number']}. {style['name']} - {style['description']}")
while True:
choice = input("\n请输入选择 (1/2/3): ").strip()
for style in styles:
if choice == style['number']:
style_path = styles_dir / style['file']
if not style_path.exists():
print(f"错误: 风格文件不存在: {style_path}", file=sys.stderr)
sys.exit(1)
return str(style_path)
print("无效选择,请输入 1、2 或 3")
def extract_core_prompt(style_file_path):
"""
从风格文件中智能提取核心提示词部分
规则:
1. 对于"渐变玻璃卡片风格":提取"### 提示词"之后的内容
2. 对于"票据风格":提取整个文件内容(因为整个文件就是提示词模板)
3. 对于"矢量插画风格":提取"### 提示词"之后的内容
通用策略:
- 查找"提示词"、"prompt"等关键词
- 排除"概述"、"适配模型"、"适用模型"等说明性章节
- 保留核心的风格描述和要求
"""
with open(style_file_path, 'r', encoding='utf-8') as f:
content = f.read()
# 尝试匹配 "### 提示词" 或 "## 提示词"
prompt_section_pattern = re.compile(r'###?\s+提示词(.+)', re.DOTALL)
match = prompt_section_pattern.search(content)
if match:
# 提取提示词之后的内容
extracted = match.group(1).strip()
# 移除可能的尾部章节(如"需要生成 PPT 的内容:")
# 查找"需要生成"、"文本信息"等标记
end_markers = [
'需要生成 PPT 的内容:',
'需要生成 PPT 的内容:',
'文本信息:',
'文本信息:',
'内容:',
'内容:'
]
for marker in end_markers:
if marker in extracted:
extracted = extracted.split(marker)[0].strip()
break
return extracted
# 如果没有找到"提示词"章节,尝试更智能的提取
# 查找"帮我"、"基于"等开头的段落
if content.startswith('帮我') or content.startswith('基于'):
# 票据风格的情况:整个文件就是提示词
# 但要移除"文本信息:"之后的部分
for marker in ['文本信息:', '文本信息:']:
if marker in content:
content = content.split(marker)[0].strip()
break
return content
# 如果以上都不匹配,排除说明性章节
# 移除"## 概述"、"### 适配模型"等章节
lines = content.split('\n')
filtered_lines = []
skip = False
for line in lines:
# 检查是否是需要跳过的章节
if re.match(r'##?\s+(概述|适配模型|适用模型及软件)', line):
skip = True
continue
elif re.match(r'##?\s+', line):
# 遇到其他章节,停止跳过
skip = False
if not skip:
filtered_lines.append(line)
return '\n'.join(filtered_lines).strip()
def generate_illustration(section_title, section_content, style_prompt, output_dir, index, resolution='2K'):
"""
调用 Gemini API 生成单张配图
参数:
- section_title: 小节标题
- section_content: 小节内容
- style_prompt: 风格提示词
- output_dir: 输出目录
- index: 图片序号
- resolution: 图片分辨率('2K' 或 '4K')
返回:生成的图片路径
"""
try:
from google import genai
from google.genai import types
except ImportError:
print("错误: 未安装 google-genai 库", file=sys.stderr)
print("请运行: pip install google-genai", file=sys.stderr)
sys.exit(1)
# 获取 API 密钥
api_key = os.environ.get("GEMINI_API_KEY")
if not api_key:
print("错误: 未设置 GEMINI_API_KEY 环境变量", file=sys.stderr)
print("请在 .env 文件中设置: GEMINI_API_KEY=your-api-key", file=sys.stderr)
sys.exit(1)
# 组合提示词
full_prompt = f"{style_prompt}\n\n根据以下内容生成配图:\n\n标题:{section_title}\n\n内容:{section_content}"
try:
# 调用 API
client = genai.Client(api_key=api_key)
response = client.models.generate_content(
model="gemini-3-pro-image-preview", # Nano Banana Pro
contents=full_prompt,
config=types.GenerateContentConfig(
response_modalities=['IMAGE'],
image_config=types.ImageConfig(
aspect_ratio="16:9",
image_size=resolution
)
)
)
# 保存图片
for part in response.parts:
if part.inline_data is not None:
image = part.as_image()
image_path = os.path.join(output_dir, f"illustration-{index:02d}.png")
image.save(image_path)
return image_path
print(f"警告: 第 {index} 张图片生成失败 - 未收到图片数据", file=sys.stderr)
return None
except Exception as e:
print(f"错误: 第 {index} 张图片生成失败 - {e}", file=sys.stderr)
return None
def main():
"""主流程"""
parser = argparse.ArgumentParser(
description='Document Illustrator - 为文档生成配图',
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
示例用法:
python generate_illustrations.py document.md
python generate_illustrations.py document.md --resolution 4K
python generate_illustrations.py document.md --output /custom/output
环境变量:
GEMINI_API_KEY: Google AI API 密钥(必需)
"""
)
parser.add_argument('document', help='文档路径')
parser.add_argument(
'--output',
default=None,
help='输出目录(默认:文档所在目录下的 images/ 文件夹)'
)
parser.add_argument(
'--resolution',
choices=['2K', '4K'],
default='2K',
help='图片分辨率(默认: 2K)'
)
parser.add_argument(
'--style',
choices=['gradient-glass', 'ticket', 'vector-illustration'],
help='配图风格(gradient-glass: 渐变玻璃卡片, ticket: 票据风格, vector-illustration: 矢量插画)'
)
parser.add_argument(
'--level',
choices=['h2', 'h3', 'h4'],
help='标题层级(h2: 二级标题, h3: 三级标题, h4: 四级标题)'
)
args = parser.parse_args()
print("=" * 60)
print("Document Illustrator - 文档配图生成器")
print("=" * 60)
print()
# 1. 分析文档结构
print("📖 分析文档结构...")
structure = analyze_document_structure(args.document)
# 2. 用户选择生成粒度
if args.level:
# 非交互模式:使用命令行参数
selected_level = args.level
level_counts = {
'h2': len(structure['h2']),
'h3': len(structure['h3']),
'h4': len(structure['h4'])
}
print(f"\n🎯 使用指定粒度: {selected_level} ({level_counts[selected_level]} 张图片)")
else:
# 交互模式:提示用户选择
print("\n🎯 选择生成粒度...")
selected_level = prompt_user_for_granularity(structure)
# 3. 用户选择风格
if args.style:
# 非交互模式:使用命令行参数
skill_root = Path(__file__).parent.parent
styles_dir = skill_root / "styles"
style_file = str(styles_dir / f"{args.style}.md")
if not Path(style_file).exists():
print(f"错误: 风格文件不存在: {style_file}", file=sys.stderr)
sys.exit(1)
style_names = {
'gradient-glass': '渐变玻璃卡片风格',
'ticket': '票据风格',
'vector-illustration': '矢量插画风格'
}
print(f"\n🎨 使用指定风格: {style_names[args.style]}")
else:
# 交互模式:提示用户选择
print("\n🎨 选择配图风格...")
style_file = prompt_user_for_style()
style_prompt = extract_core_prompt(style_file)
# 显示提取的风格提示词预览(前 200 个字符)
print(f"\n✓ 已加载风格提示词")
print(f" 预览: {style_prompt[:200]}...")
# 4. 创建输出目录(在文档所在目录下)
doc_dir = os.path.dirname(os.path.abspath(args.document))
if args.output:
output_dir = os.path.join(args.output, "images")
else:
# 默认:文档所在目录下的 images/ 文件夹
output_dir = os.path.join(doc_dir, "images")
os.makedirs(output_dir, exist_ok=True)
print(f"\n📁 输出目录: {output_dir}")
# 4.5. 智能合并章节并验证内容覆盖
print(f"\n📋 合并子章节内容...")
merged_sections = merge_sections_by_level(structure['sections'], selected_level)
print(f"\n✓ 已合并章节")
print(f" 原始章节数: {len(structure['sections'])}")
print(f" 合并后章节数: {len(merged_sections)}")
# 验证内容覆盖度
print(f"\n🔍 验证内容覆盖...")
verification = verify_content_coverage(structure['sections'], merged_sections)
if verification['all_covered']:
print(f"✓ 所有内容已覆盖,无遗漏")
else:
print(f"⚠️ 警告: 发现 {verification['missing_count']} 个章节可能遗漏")
# 显示详细的覆盖报告
print(f"\n📊 内容覆盖报告:")
for item in verification['coverage_report']:
if item['status'] == 'MISSING':
print(f" ⚠️ 遗漏: {item['title']}")
elif item['status'] == 'merged':
print(f" ✓ 已整合: {item['title']} → 合并到「{item['merged_into']}」")
elif item['status'] == 'parent':
# 统计该父章节合并了多少子章节
merged_count = sum(1 for x in verification['coverage_report']
if x.get('merged_into') == item['title'])
if merged_count > 0:
print(f" ✓ 父章节: {item['title']} (包含 {merged_count} 个子章节)")
else:
print(f" ✓ 独立章节: {item['title']}")
if not verification['all_covered']:
print(f"\n❌ 错误: 有内容遗漏,请检查文档结构")
print(f"建议: 尝试不同的粒度,或检查文档标题层级是否规范")
sys.exit(1)
# 5. 生成配图
sections = merged_sections
if not sections:
print(f"错误: 没有找到级别为 {selected_level} 的小节", file=sys.stderr)
sys.exit(1)
print(f"\n🖼️ 开始生成 {len(sections)} 张配图...")
print(f"分辨率: {args.resolution}")
print("=" * 60)
print()
successful = 0
failed = 0
for i, section in enumerate(sections, 1):
print(f"正在生成第 {i}/{len(sections)} 张...")
print(f" 标题: {section['title']}")
# 限制内容长度(避免超过 API 限制)
content = section['content']
if len(content) > 1000:
content = content[:1000] + "..."
print(f" 提示: 内容较长,已截取前 1000 字符")
image_path = generate_illustration(
section['title'],
content,
style_prompt,
output_dir,
i,
args.resolution
)
if image_path:
print(f" ✓ 已保存: {image_path}")
successful += 1
else:
print(f" ✗ 生成失败")
failed += 1
print()
# 6. 完成
print("=" * 60)
print("✨ 生成完成!")
print("=" * 60)
print(f"成功: {successful} 张")
if failed > 0:
print(f"失败: {failed} 张")
print(f"\n所有配图已保存到: {output_dir}")
print()
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""
Document Illustrator - 单图片生成工具
由 Claude 负责文档分析和内容归纳,此脚本只负责调用 Gemini API 生成图片
"""
import os
import sys
import argparse
from pathlib import Path
from dotenv import load_dotenv
def find_and_load_env():
"""
智能查找并加载 .env 文件
优先级:
1. 当前脚本所在目录的上一级(Skill 根目录)
2. 当前工作目录
3. 用户主目录下的 .claude/skills/document-illustrator/
"""
# 获取脚本所在目录的上一级(Skill 根目录)
skill_root = Path(__file__).parent.parent
env_path = skill_root / ".env"
if env_path.exists():
load_dotenv(env_path, override=True)
return True
# 尝试当前工作目录
if Path(".env").exists():
load_dotenv(".env", override=True)
return True
# 尝试 Claude Code Skill 标准位置
claude_skill_env = Path.home() / ".claude" / "skills" / "document-illustrator" / ".env"
if claude_skill_env.exists():
load_dotenv(claude_skill_env, override=True)
return True
# 如果都没找到,尝试默认加载
load_dotenv(override=True)
return False
# 智能加载环境变量
find_and_load_env()
def get_image_dimensions(aspect_ratio, resolution):
"""
根据比例和分辨率返回图片尺寸
参数:
- aspect_ratio: "16:9" 或 "3:4"
- resolution: "2K" 或 "4K"
返回:(width, height)
"""
dimensions = {
"16:9": {
"2K": (2560, 1440),
"4K": (3840, 2160)
},
"3:4": {
"2K": (1920, 2560),
"4K": (2880, 3840)
}
}
if aspect_ratio not in dimensions:
raise ValueError(f"不支持的比例: {aspect_ratio},请使用 '16:9' 或 '3:4'")
if resolution not in dimensions[aspect_ratio]:
raise ValueError(f"不支持的分辨率: {resolution},请使用 '2K' 或 '4K'")
return dimensions[aspect_ratio][resolution]
def generate_image(title, content, style_prompt, output_path, aspect_ratio="16:9", resolution="2K", is_cover=False):
"""
调用 Gemini API 生成单张配图
参数:
- title: 图片标题
- content: 图片内容文本
- style_prompt: 风格提示词
- output_path: 输出文件路径(包含文件名)
- aspect_ratio: 宽高比 "16:9" 或 "3:4"
- resolution: 分辨率 "2K" 或 "4K"
- is_cover: 是否为封面图
返回:成功返回图片路径,失败返回 None
"""
try:
from google import genai
from google.genai import types
except ImportError:
print("错误: 未安装 google-genai 库", file=sys.stderr)
print("请运行: pip install google-genai", file=sys.stderr)
sys.exit(1)
# 获取 API 密钥
api_key = os.environ.get("GEMINI_API_KEY")
if not api_key:
print("错误: 未设置 GEMINI_API_KEY 环境变量", file=sys.stderr)
print("请在 .env 文件中设置: GEMINI_API_KEY=your-api-key", file=sys.stderr)
sys.exit(1)
# 组合提示词
if is_cover:
# 封面图的提示词,强调概括性和引导性
full_prompt = f"""{style_prompt}
这是一张封面图,需要概括整个文档的核心信息。
标题:{title}
核心内容(需要在一张图中体现):
{content}
要求:
- 封面图需要突出主题,具有引导性
- 信息要精炼但完整,能代表整个系列
- 视觉冲击力强,吸引读者注意
"""
else:
# 普通内容配图
full_prompt = f"""{style_prompt}
根据以下内容生成配图:
标题:{title}
内容:
{content}
"""
try:
# 调用 API
client = genai.Client(api_key=api_key)
response = client.models.generate_content(
model="gemini-3-pro-image-preview", # Nano Banana Pro
contents=full_prompt,
config=types.GenerateContentConfig(
response_modalities=['IMAGE'],
image_config=types.ImageConfig(
aspect_ratio=aspect_ratio,
image_size=resolution
)
)
)
# 检查响应是否有效
if response is None:
print(f"错误: API 返回空响应", file=sys.stderr)
return None
if not hasattr(response, 'parts') or response.parts is None:
print(f"错误: API 响应中没有 parts 属性", file=sys.stderr)
print(f"响应内容: {response}", file=sys.stderr)
return None
# 保存图片
for part in response.parts:
if part.inline_data is not None:
image = part.as_image()
# 确保输出目录存在
output_dir = os.path.dirname(output_path)
if output_dir:
os.makedirs(output_dir, exist_ok=True)
image.save(output_path)
return output_path
print(f"警告: 图片生成失败 - 未收到图片数据", file=sys.stderr)
return None
except Exception as e:
import traceback
print(f"错误: 图片生成失败 - {e}", file=sys.stderr)
print(f"详细错误信息:", file=sys.stderr)
traceback.print_exc(file=sys.stderr)
return None
def main():
"""主流程"""
parser = argparse.ArgumentParser(
description='Document Illustrator - 单图片生成工具',
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
示例用法:
# 生成普通内容配图
python generate_single_image.py \\
--title "AI 工具演化" \\
--content "从 Rules 到 Skills 的演化历程..." \\
--style-file ../styles/ticket.md \\
--output /path/to/output/image-01.png \\
--ratio 16:9 \\
--resolution 2K
# 生成封面图
python generate_single_image.py \\
--title "AI 编程工具完全指南" \\
--content "本文介绍..." \\
--style-file ../styles/gradient-glass.md \\
--output /path/to/output/cover.png \\
--ratio 3:4 \\
--resolution 2K \\
--cover
环境变量:
GEMINI_API_KEY: Google AI API 密钥(必需)
"""
)
parser.add_argument('--title', required=True, help='图片标题')
parser.add_argument('--content', required=True, help='图片内容文本')
parser.add_argument('--style-file', required=True, help='风格提示词文件路径')
parser.add_argument('--output', required=True, help='输出文件路径(包含文件名)')
parser.add_argument(
'--ratio',
choices=['16:9', '3:4'],
default='16:9',
help='宽高比(默认: 16:9)'
)
parser.add_argument(
'--resolution',
choices=['2K', '4K'],
default='2K',
help='分辨率(默认: 2K)'
)
parser.add_argument(
'--cover',
action='store_true',
help='标记为封面图(会使用不同的提示词策略)'
)
args = parser.parse_args()
# 读取风格提示词
style_file_path = Path(args.style_file)
if not style_file_path.exists():
print(f"错误: 风格文件不存在: {args.style_file}", file=sys.stderr)
sys.exit(1)
with open(style_file_path, 'r', encoding='utf-8') as f:
style_prompt = f.read()
# 显示生成信息
image_type = "封面图" if args.cover else "内容配图"
print(f"正在生成{image_type}...")
print(f" 标题: {args.title}")
print(f" 比例: {args.ratio}")
print(f" 分辨率: {args.resolution}")
width, height = get_image_dimensions(args.ratio, args.resolution)
print(f" 尺寸: {width}x{height}")
# 生成图片
result_path = generate_image(
title=args.title,
content=args.content,
style_prompt=style_prompt,
output_path=args.output,
aspect_ratio=args.ratio,
resolution=args.resolution,
is_cover=args.cover
)
if result_path:
print(f"✓ 已保存: {result_path}")
sys.exit(0)
else:
print(f"✗ 生成失败", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()
渐变拟物玻璃卡片风格 PPT
概述
整了一套非常漂亮的渐变拟物玻璃卡片风格 PPT 提示词,可以在 NotebookLM、Youmind、Listenhub、Lovart等支持 Nano Banana Pro 生成 PPT 的位置使用
适配模型
- Nano Banana Pro
- Seedream
提示词
你是一位专家级UI UX演示设计师,请生成高保真、未来科技感的16比9演示文稿幻灯片。请根据视觉平衡美学,自动在封面、网格布局或数据可视化中选择一种最完美的构图。
全局视觉语言方面,风格要无缝融合Apple Keynote的极简主义、现代SaaS产品设计和玻璃拟态风格。整体氛围需要高端、沉浸、洁净且有呼吸感。光照采用电影级体积光、柔和的光线追踪反射和环境光遮蔽。配色方案选择深邃的虚空黑或纯净的陶瓷白作为基底,并以流动的极光渐变色即霓虹紫、电光蓝、柔和珊瑚橙、青色作为背景和UI高光点缀。
关于画面内容模块,请智能整合以下元素:
1. 排版引擎采用Bento便当盒网格系统,将内容组织在模块化的圆角矩形容器中。容器材质必须是带有模糊效果的磨砂玻璃,具有精致的白色边缘和柔和的投影,并强制保留巨大的内部留白,避免拥挤。
2. 插入礼物质感的3D物体,渲染独特的高端抽象3D制品作为视觉锚点。它们的外观应像实体的昂贵礼物或收藏品,材质为抛光金属、幻彩亚克力、透明玻璃或软硅胶,形状可是悬浮胶囊、球体、盾牌、莫比乌斯环或流体波浪。
3. 字体与数据方面,使用干净的无衬线字体,建立高对比度。如果有图表,请使用发光的3D甜甜圈图、胶囊状进度条或悬浮数字,图表应看起来像发光的霓虹灯玩具。
构图逻辑参考: 如果生成封面,请在中心放置一个巨大的复杂3D玻璃物体,并覆盖粗体大字,背景有延伸的极光波浪。 如果生成内容页,请使用Bento网格布局,将3D图标放在小卡片中,文本放在大卡片中。 如果生成数据页,请使用分屏设计,左侧排版文字,右侧悬浮巨大的发光3D数据可视化图表。
渲染质量要求:虚幻引擎5渲染,8k分辨率,超细节纹理,UI设计感,UX界面,Dribbble热门趋势,设计奖获奖作品。
帮我根据下面的设计风格要求和内容要求,生成一张中文的信息图片: 设计风格要求: 运用3-4种不同字号创造层次感,关键词使用最大字号 主标题字号需要比副标题和介绍大三倍以上,采用网格排版,类似高级杂志 文字与装饰元素间保持和谐的比例关系 确保视觉流向清晰,引导读者目光移动 数字极简票券风设计风格 黑白对比主导:高度对比的黑白配色方案,形成强烈视觉冲击 票券化布局:类似登机牌、门票或电子凭证的结构设计 几何分区明确:画面被精确划分为信息区块,井然有序 留白艺术运用:大量有效留白提升整体通透感和优雅度 东西方美学融合:结合中文传统排版与西方现代设计语言 工业设计感:注册商标符号、条形码等商业元素的精致运用 数字界面映射:模拟电子屏幕或应用界面的信息呈现方式 文字排版风格 中英混排对比:中英文字体混合使用,创造文化融合感 尺寸层级分明:主标题大号处理,副文本精致小巧 多向排列组合:包含横排、竖排、斜排等多方向文字布局 间距精确控制:字符间距和行距经过精心计算,保持呼吸感 符号化装饰:括号、下划线、箭头融入文字设计 衬线与非衬线混搭:不同字体家族交替使用,增强层次感 时间信息格式化:日期标注采用统一格式,搭配方向指示符 视觉元素风格 功能性指示符:各类箭头、星号作为视觉引导和强调 UI元素借鉴:"CHECK IN"、"@"等数字界面元素的平面化应用 边框与分割线:简洁线条用于区隔不同信息区域 简约图形符号:最小化的设计符号传达核心信息 手写风点缀:如"Romantic"的手写体为机械排版增添人文温度 方向性视觉流动:通过元素排布创造从左到右、从上到下的阅读节奏 负空间利用:将空白区域视为积极设计元素的一部分 文本信息:
矢量插画风格PPT生成
适用模型及软件
- Nano Banana Pro
- Notebookml
- Youmind
- Listenhub
- Lovart
提示词
帮我基于这个风格要求和内容生成 PPT:
视觉风格与美术指导 (Visual Style & Art Direction)
插画风格: 扁平化矢量插画(Flat Vector Illustration)。必须包含清晰、统一粗细的黑色轮廓线(Monoline/Stroke)。色彩填涂需简洁,仅使用少量阴影,严禁使用渐变色或3D渲染效果。 构图形式: 横向全景式构图(Panoramic),占据版面顶部 1/3 的空间。 线条风格 (Line Work): 必须使用统一粗细的黑色单线描边(Monoline/Uniform Stroke)。所有物体(建筑、植物、云朵)都必须有封闭的黑色轮廓,类似填色书的线稿风格。线条末端圆润,避免尖锐的棱角。 几何化处理 (Geometric Simplification): 将复杂的物体简化为基本几何形状。例如,树木简化为棒棒糖形状或三角形,建筑物简化为简单的矩形块面,窗户简化为整齐的小方格网格。不要追求写实细节,要追求“玩具模型”般的可爱感。 空间与透视: 采用平视或稍微俯视的 2.5D 视角(类似等轴测,但更自由)。通过图层的前后遮挡来表现纵深,不要使用大气透视(即远景不要变模糊或变淡),所有图层清晰度一致。 装饰元素: 在空白处添加装饰性的几何元素,如放射状的线条(代表阳光或能量)、药丸形状的云朵、或者是简单的小圆点和星星,以平衡画面的视觉密度。 配色方案: 复古且柔和的色调。 背景: 米色/奶油色(Cream/Off-white)纸张纹理感底色。 强调色: 珊瑚红、薄荷绿、芥末黄、赭石色(Burnt Orange)和岩石蓝。 字体排版: 主标题: 巨大的、加粗的复古衬线体(Retro Serif),体现权威感与优雅感。 副标题: 位于矩形色块内的全大写无衬线体。 正文: 清晰易读的几何感无衬线体。
需要生成 PPT 的内容:
Related skills
FAQ
What document formats does document-illustrator accept?
The document-illustrator skill is format-agnostic: it analyzes Markdown, plain text, PDF, and other documents, extracts core themes, and generates matching illustrations without requiring a specific template structure.
What image styles and ratios does document-illustrator offer?
The document-illustrator skill provides three styles—gradient glass card, ticket style, and vector illustration—and supports 16:9 landscape and 3:4 portrait ratios plus an optional cover summarizing the full document.
Is Document Illustrator safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.