📦 PPT Pandora
v1.1.0PPT完整制作流程:从素材收集、大纲规划,到图片搜索/裁剪/插入、文字排版调整(字体大小/行间距/位置)、表格处理、整体视觉评估,直至最终验证。支持红白风格等专业PPT的全流程制作。
运行时依赖
安装命令
点击复制技能文档
PPT完整制作流程 一、素材收集与规划 1.1 内容来源优先级 权威官方报道(gov.cn、news.cn、people.com.cn)— 政策、数据、事件 证券研究所报告 — 产业架构图、行业数据图表(极其权威专业) Pexels免费图库 — 通用场景照片 AI生成图片 — 无版权风险,但质量不稳定
1.2 贾老师找图法(内容→来源→关联→配图) 看PPT页面的核心主题和引用内容(政策引领?技术趋势?行业案例?) 搜索引用的原话,找到权威官方报道 从报道里找关联事件(上下文提到的会议/政策/人物/数据) 用关联事件去搜对应的图片 为什么有效:图片和内容有逻辑关联,不是随便配的免费图。 示例: P3 讲"政策引领+习主席指示" → 搜习主席原话 → 找到发改委文章 → 文章提到"二十届三中全会" → 搜该会议照片 P4 讲"十五五规划+人工智能+" → 搜十五五报道 → gov.cn文章有李强主持编制会议照片 P6 讲"中国AI产业" → 搜"AI产业层级架构" → 华西证券研究所报告图片
1.3 特殊图片渠道 gov.cn图片路径:./W0xxxxxxxxxx_ORIGIN.JPG(拼接完整URL) 人民网图片路径:/NMediaFile/xxxxx/MAINxxxxxxxx.jpg 证券研究所图片:搜索"XX证券 AI产业"或"XX证券 行业图谱"
二、图片裁剪与适配 2.1 核心原则 绝不拉伸,保持原始宽高比 裁剪时保留重要内容(人脸、文字不能切掉) 从不重要部分裁切(下半身、留白、背景) 卡片圆弧角 → 必须留边距(≥0.15英寸)
2.2 裁剪策略速查表 场景 | 策略 竖图→横卡片 | 裁掉不重要部分(下半身/背景),保留上半部分,居中放置 文字在底部 | 裁上方留白,让文字靠上 人脸照片 | 用image工具定位脸坐标,以脸为中心裁剪 横图→横卡片 | 从上下等比裁切,保持居中 比例接近但不匹配 | 微调裁切量,尽量保留主要内容 图片比预留区域小 | 按比例缩放后居中放置,四周留白,绝不拉伸
2.3 边距规范 边距大小 | 适用场景 0.15英寸 | 最小值,刚好避免直角碰圆弧 0.3英寸 | 通用推荐值 0.5英寸 | 需要明显留白时
2.4 Python代码示例 from pptx.util import Inches # 图片在卡片区域内带边距 card_left, card_top, card_w, card_h = 0.8, 1.8, 5.0, 2.5 margin = 0.15 img_left = card_left + margin img_top = card_top + margin img_w = card_w - 2 margin img_h = img_w / image_aspect_ratio # 等比计算高度 # 居中在卡片区域内 img_top = card_top + (card_h - img_h) / 2 slide.shapes.add_picture(img_path, Inches(img_left), Inches(img_top), Inches(img_w), Inches(img_h))
三、文字排版调整 3.1 核心三要素:字体大小 + 行间距 + 文本框高度 三者必须配合调整,只改一个参数往往视觉效果不好。 场景 | 字体大小 | 行间距 | 文本框高度 正文段落(填满区域) | 18-20pt | 1.5-2.0x | 匹配内容 数据卡片标签 | 16pt | 1.0x | 自适应 数据卡片数值 | 28pt | 1.0x | 自适应 数据卡片单位 | 14pt | 1.0x | 自适应 标题 | 24-32pt | 1.0x | 自适应
3.2 视觉评估原则 不是参数万能,是根据实际情况定的。 判断标准: 文字是否填满区域(不空不挤) 行间距是否让文字呼吸(1.5-2.0x适合段落) 字体大小是否与区域面积匹配 整体是否上下居中
3.3 主副标题合并 # 用破折号连接,解决右侧太空问题 shape.text_frame.paragraphs[0].text = f'{main_title}——{subtitle}' # 删除旧的副标题shape sub_shape._element.getparent().remove(sub_shape._element)
3.4 文字垂直居中(XML方式) from pptx.oxml.ns import qn sp = shape._element for child in sp: tag = child.tag.split('}')[-1] if '}' in child.tag else child.tag if tag == 'txBody': for sub in child: subtag = sub.tag.split('}')[-1] if '}' in sub.tag else sub.tag if subtag == 'bodyPr': sub.set('anchor', 'ctr') # 垂直居中
3.5 python-pptx 添加新段落 # ❌ 错误:paragraphs[3] 访问不存在的段落不会自动创建 # ✅ 正确:手动创建XML paragraph元素 from pptx.oxml.ns import qn txBody = shape.text_frame._txBody new_p = txBody.makeelement(qn('a:p'), {}) r = new_p.makeelement(qn('a:r'), {}) rPr = r.makeelement(qn('a:rPr'), {'lang': 'zh-CN', 'sz': '2000'}) # 20pt t = r.makeelement(qn('a:t'), {}) t.text = '新段落内容' r.append(rPr) r.append(t) new_p.append(r) txBody.append(new_p)
四、表格处理 4.1 表格实际渲染高度 ≠ shape.height 关键教训:表格shape设的高度可能不够,内容会溢出。 # 表格有5行,每行0.6英寸 → 实际需要3.0英寸 # 如果shape.height设为2.2,内容会溢出到下面的元素 shape.height = Inches(3.0) # 必须等于或大于内容实际需要的高度
4.2 表格与图片的间距 表格底部与下方图片之间至少留 0.2-0.3英寸 间距 检查方法:读取shape的top + height,计算bottom,确保不重叠
五、图片替换工作流 5.1 分段操作原则 铁律:在分段PPT上操作,不要先合并完整版再改。 原因:copy.deepcopy 只复制shape的XML引用,不复制图片二进制数据 合并时图片被重复嵌入,文件膨胀到20MB+ 分段文件只有45-50KB,操作快、发送快
5.2 正确流程 单段脚本生成 → 分段PPT → 在分段PPT里加图/调整 → 所有分段完成后 → 合并完整版
5.3 从原始generate脚本读取正确尺寸 图片占位符的尺寸要从原始生成脚本读取,而不是从合并PPT的文本标签获取。
六、Emoji处理 PowerPoint不支持Unicode emoji(🧠📚🦾等显示为方块)。 替换方案:用文字标识代替 # ❌ 错误 "🧠 大脑(推理规划)" # ✅ 正确 "[大脑] 推理规划" 全量扫描代码 import re emoji_pattern = re.compile('[\U0001F000-\U0001FFFF]') for slide in prs.slides: for shape in slide.shapes: if shape.has_text_frame: for para in shape.text_frame.paragraphs: for run in para.runs: if emoji_pattern.search(run.text): print(f'Found emoji: {run.text}')
七、整体视觉评估 7.1 评估清单(每页修改后检查) 左侧vs右侧:两侧都有内容,没有大片空白 上下居中:文字在文本框内垂直居中 行间距:段落行间距让文字呼吸(1.5-2.0x) 字体大小:与区域面积匹配(不空不挤) 元素间距:表格与图片、卡片与卡片之间有合理间距 图片比例:保持原始比例,不拉伸 图片边距:不碰圆弧角(≥0.15in) 重要内容:人脸、文字未被裁切 emoji:无Unicode emoji残留
7.2 常见问题速查 问题 | 原因 | 解决方案 右侧太空 | 字体太小/行间距太紧 | 放大字体 + 加大行间距(1.5-2.0x) 元素重叠 | 表格实际高度溢出 | 检查行数×行高,设shape.height≥实际高度 图片超出页面 | y+h > 7.5英寸 | 上移图片或缩小高度 上方空下方超 | 元素整体偏下 | 整体上移,检查每个元素的bottom 文件太大(20MB+) | 合并时图片重复嵌入 | 在分段文件上操作,最后合并
八、验证清单(PPT交付前) 全量扫描emoji/特殊字符 每张图片保持原始比例(不拉伸) 图片不碰圆弧角(有边距) 重要内容(人脸/文字)未被裁切 文字居中、间距合理 合并后总页数正确 分段文件合并后检查重叠/错位
九、图片比例处理原则 核心原则:调高度适配原比例,不裁剪重要内容 错误做法:强制裁剪图片到目标比例(2.78:1),导致图表坐标轴、图例等信息丢失 正确做法: 保持图片原始比例 通过调整图片高度来适配区域 上下留白(白色背景匹配PPT背景) 图片居中放置 示例 # ❌ 错误:强制裁剪 cropped = img.crop((left, 0, right, height)) # 丢失图例和坐标轴 # ✅ 正确:保持原比例,调整高度 canvas = Image.new('RGB', (target_w, target_h), 'white') scale = target_w / img_w # 按宽度适配 new_h = int(img_h scale) resized = img.resize((target_w, new_h)) y_offset = (target_h - new_h) // 2 # 垂直居中 canvas.paste(resized, (0, y_offset)) 何时可以裁剪 照片类图片(人物、场景),裁剪不重要区域 绝不裁剪数据图表的坐标轴、图例、标题
十、阿里巴巴普惠体设置(python-pptx) 10.1 正确的字体设置方法 关键:使用 run._r 而非 run._element from pptx.oxml.ns import qn from lxml import etree
def set_alihei(run, font_size=None, bold=None): """设置字体为阿里巴巴普惠体""" run.font.name = "阿里巴巴普惠体" rPr = run._r.get_or_add_rPr() # 注意:是 _r 不是 _element rFonts = rPr.find(qn('w:rFonts')) if rFonts is None: rFonts