欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > 使用 Python 自动化生成 PPT 并结合 LLM 生成内容

使用 Python 自动化生成 PPT 并结合 LLM 生成内容

2025/9/24 15:10:16 来源:https://blog.csdn.net/weixin_32759777/article/details/146875760  浏览:    关键词:使用 Python 自动化生成 PPT 并结合 LLM 生成内容

介绍

PowerPoint(PPT)是常用的文档工具,但手动设计和排版耗时耗力。本文将展示如何通过 Python 自动化提取 PPT 样式并生成新 PPT,同时结合大语言模型(LLM)生成内容(如自我介绍文本),实现高效、个性化的 PPT 制作。


核心代码解析

1. 提取 PPT 样式到 JSON

extract_ppt_with_style 函数用于将 PPT 的样式(字体、颜色、段落格式等)提取到 JSON 文件中,方便后续复用。

关键步骤:
  • 遍历 PPT 的每一页:逐页提取文本框的样式。
  • 记录样式信息:包括字体名称、大小、加粗、斜体、颜色(支持主题色和 RGB 颜色)。
  • JSON 结构示例
    {"slide_number": 1,"shapes": [{"shape_name": "Text","paragraphs": [{"alignment": "LEFT","runs": [{"text": "自我介绍","font": {"name": "Arial","size": 24,"bold": true,"italic": false,"color": {"type": "rgb","rgb": [255, 0, 0]}}}]}]}]
    }
    
代码片段:
def extract_ppt_with_style(ppt_path, output_json):prs = Presentation(ppt_path)data = []for slide_idx, slide in enumerate(prs.slides):slide_data = {"slide_number": slide_idx + 1,"shapes": []}for shape in slide.shapes:if not shape.has_text_frame:continuetext_frame = shape.text_frametext_info = {"shape_name": "Text",  # 强制设置为 "Text" 类型"paragraphs": []}for paragraph in text_frame.paragraphs:para_info = {"alignment": str(paragraph.alignment),"runs": []}for run in paragraph.runs:run_info = {"text": run.text,"font": {"name": run.font.name,"size": str(run.font.size) if run.font.size else None,"bold": run.font.bold,"italic": run.font.italic,"color": {"type": "theme" if run.font.color.type == MSO_THEME_COLOR else "rgb","theme_color": run.font.color.theme_color,"rgb": (run.font.color.rgb[0], run.font.color.rgb[1], run.font.color.rgb[2]) if run.font.color.rgb else None}}}para_info["runs"].append(run_info)text_info["paragraphs"].append(para_info)slide_data["shapes"].append(text_info)data.append(slide_data)with open(output_json, 'w', encoding='utf-8') as f:json.dump(data, f, indent=2, ensure_ascii=False)

2. 应用 JSON 样式到新 PPT

apply_styles_to_ppt 函数根据 JSON 文件中的样式信息,将内容和格式应用到模板 PPT 中。

关键步骤:
  • 读取 JSON 数据:解析字体、颜色等样式信息。
  • 动态设置样式:支持 RGB 颜色、主题色,并兼容十六进制颜色(如 #FF0000)。
  • 生成最终 PPT:将修改后的样式保存为新文件。
代码片段:
def apply_styles_to_ppt(template_path, json_path, output_pptx):with open(json_path, 'r', encoding='utf-8') as f:data = json.load(f)prs = Presentation(template_path)for slide_idx, slide in enumerate(prs.slides):for shape_idx, shape in enumerate(slide.shapes):if not shape.has_text_frame:continuetext_frame = shape.text_framefor paragraph_idx, paragraph in enumerate(text_frame.paragraphs):for run_idx, run in enumerate(paragraph.runs):run_info = data[slide_idx]["shapes"][shape_idx]["paragraphs"][paragraph_idx]["runs"][run_idx]run.text = run_info["text"]  # 替换文本内容run.font.name = run_info["font"]["name"]run.font.size = run_info["font"]["size"]run.font.bold = run_info["font"]["bold"]run.font.italic = run_info["font"]["italic"]color_data = run_info["font"]["color"]if color_data["type"] == "rgb":r, g, b = color_data["rgb"]  # 直接解析 RGB 数组run.font.color.rgb = RGBColor(r, g, b)elif color_data["type"] == "hex":hex_color = color_data["hex"].lstrip("#")r = int(hex_color[0:2], 16)g = int(hex_color[2:4], 16)b = int(hex_color[4:6], 16)run.font.color.rgb = RGBColor(r, g, b)elif color_data["type"] == "theme":theme_color = getattr(MSO_THEME_COLOR, color_data["theme_color"], MSO_THEME_COLOR.ACCENT_1)run.font.color.theme_color = theme_colorelse:run.font.color.rgb = RGBColor(0, 0, 0)  # 默认黑色prs.save(output_pptx)

结合 LLM 生成内容

场景:生成自我介绍 PPT

假设需要根据用户输入的姓名、职位等信息,自动生成带样式的自我介绍 PPT,可以按以下步骤操作:

1. 使用 LLM 生成文本内容

通过调用 LLM(如 GPT-3.5、通义千问等),生成自我介绍的文本内容:

import openaidef generate_self_introduction(name, role):prompt = f"生成一份关于 {name}{role})的自我介绍,要求简洁明了,适合 PPT 展示。"response = openai.Completion.create(engine="text-davinci-003",prompt=prompt,max_tokens=150)return response.choices[0].text.strip()
2. 将 LLM 内容注入 JSON

将生成的文本内容填充到 JSON 的 text 字段中:

# 假设提取的 JSON 结构如下:
json_data = {"slide_number": 1,"shapes": [{"shape_name": "Text","paragraphs": [{"runs": [{"text": "【待替换的占位符】", ...}]}]}]
}# 替换文本内容
generated_text = generate_self_introduction("张三", "数据分析师")
json_data["shapes"][0]["paragraphs"][0]["runs"][0]["text"] = generated_text
3. 生成最终 PPT

调用 apply_styles_to_ppt 将样式和内容应用到模板中:

apply_styles_to_ppt("template.pptx", "modified.json", "output.pptx")

注意事项

  1. JSON 格式要求

    • 颜色值需为数组格式(如 rgb: [255, 0, 0])或十六进制字符串(如 "hex": "#FF0000")。
    • 主题色需使用 MSO_THEME_COLOR 枚举名称(如 "ACCENT_1")。
  2. 形状名称标准化

    • 在提取样式时,强制将 shape_name 设置为 "Text",确保后续处理一致性。
  3. 兼容性

    • 确保模板 PPT 的形状结构与 JSON 数据匹配(如位置、层级)。

完整示例

if __name__ == '__main__':# 1. 提取模板样式到 JSONextract_ppt_with_style("template.pptx", "output_styles.json")# 2. 生成自我介绍文本并修改 JSONwith open("output_styles.json", "r") as f:data = json.load(f)# 假设修改第一段文本data[0]["shapes"][0]["paragraphs"][0]["runs"][0]["text"] = "我是张三,一名数据分析师..."# 3. 生成最终 PPTapply_styles_to_ppt("template.pptx", "output_styles.json", "new_ppt.pptx")

通过上述方法,你可以自动化生成个性化 PPT,结合 LLM 的内容生成能力,实现从设计到内容的全流程自动化!

from pptx import Presentation
from pptx.enum.dml import MSO_THEME_COLOR
from pptx.dml.color import RGBColor
import jsondef extract_ppt_with_style(ppt_path, output_json):prs = Presentation(ppt_path)data = []for slide_idx, slide in enumerate(prs.slides):slide_data = {"slide_number": slide_idx + 1,"shapes": []}for shape in slide.shapes:if not shape.has_text_frame:continue  # 跳过非文本形状text_frame = shape.text_frametext_info = {"shape_name": shape.name,"paragraphs": []}for paragraph in text_frame.paragraphs:para_info = {"alignment": str(paragraph.alignment),"runs": []}for run in paragraph.runs:run_info = {"text": run.text,"font": {"name": run.font.name,"size": str(run.font.size) if run.font.size else None,"bold": run.font.bold,"italic": run.font.italic,"color": {"type": "theme" if run.font.color.type == MSO_THEME_COLOR else "rgb","theme_color": run.font.color.theme_color,"rgb": (run.font.color.rgb[0], run.font.color.rgb[1],run.font.color.rgb[2]) if run.font.color.rgb else None}},# "highlight_color": str(run.highlight_color)  # 修改:从 run 而非 run.font 获取}para_info["runs"].append(run_info)text_info["paragraphs"].append(para_info)slide_data["shapes"].append(text_info)data.append(slide_data)with open(output_json, 'w', encoding='utf-8') as f:json.dump(data, f, indent=2, ensure_ascii=False)def apply_styles_to_ppt(template_path, json_path, output_pptx):with open(json_path, 'r', encoding='utf-8') as f:data = json.load(f)prs = Presentation(template_path)for slide_idx, slide in enumerate(prs.slides):for shape_idx, shape in enumerate(slide.shapes):if not shape.has_text_frame:continue  # 跳过非文本形状text_frame = shape.text_framefor paragraph_idx, paragraph in enumerate(text_frame.paragraphs):for run_idx, run in enumerate(paragraph.runs):run_info = data[slide_idx]["shapes"][shape_idx]["paragraphs"][paragraph_idx]["runs"][run_idx]run.text = run_info["text"]run.font.name = run_info["font"]["name"]run.font.size = run_info["font"]["size"]run.font.bold = run_info["font"]["bold"]run.font.size = run_info["font"]["size"]run.font.italic = run_info["font"]["italic"]# 假设 run_data 是从 JSON 中读取的字典color_data = run_info["font"]["color"]if color_data["type"] == "rgb":# 解析 RGB 值r_str, g_str, b_str = color_data["rgb"]r = r_strg = g_strb = b_strrun.font.color.rgb = RGBColor(r, g, b)elif color_data["type"] == "hex":# 解析十六进制颜色hex_color = color_data["hex"].lstrip("#")r = int(hex_color[0:2], 16)g = int(hex_color[2:4], 16)b = int(hex_color[4:6], 16)run.font.color.rgb = RGBColor(r, g, b)elif color_data["type"] == "theme":# 使用主题颜色(如 MSO_THEME_COLOR.ACCENT_1)theme_color_name = color_data["theme_color"]theme_color = getattr(MSO_THEME_COLOR, theme_color_name, MSO_THEME_COLOR.ACCENT_1)run.font.color.theme_color = theme_colorelse:# 默认颜色(黑色)run.font.color.rgb = RGBColor(0, 0, 0)prs.save(output_pptx)if __name__ == '__main__':# 使用示例extract_ppt_with_style("template.pptx", "output_styles.json")# 这是一个ppt 模版解析出来的json 结构 name 为 shape 类型保持不变 请 改变 name 为 Text 类型的text ,text 的值进行自我介绍 # 注意:只输出json# 使用示例apply_styles_to_ppt("template.pptx", "output_styles.json", "new_ppt.pptx")

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词