# tongyi_ppt_generator.py
import os
import json
import dashscope
from pptx import Presentation
from pptx.util import Pt
from dashscope import Generation

# 请在此处填入你的 API KEY,或者设置环境变量
# dashscope.api_key = "你的_DASHSCOPE_API_KEY"
# 建议通过环境变量设置: export DASHSCOPE_API_KEY="sk-..."

class PPTGenerator:
    def __init__(self, api_key=None):
        if api_key:
            dashscope.api_key = api_key
        elif os.getenv("DASHSCOPE_API_KEY"):
            dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
        else:
            raise ValueError("请设置 DASHSCOPE_API_KEY")

    def get_content_from_qwen(self, topic):
        """
        调用通义千问 API 生成 PPT 内容结构 (JSON)
        """
        print(f"🤖 正在请求通义千问生成关于 '{topic}' 的大纲...")
        
        # 提示词工程:强制模型返回 JSON 格式
        prompt = f"""
        请为一个关于“{topic}”的演示文稿生成内容。
        请返回一个标准的 JSON 格式列表,不要包含 markdown 代码块标记(如 json)。
        JSON 对象应包含 'title' (标题) 和 'slides' (幻灯片列表)。
        每张幻灯片包含 'heading' (页标题) 和 'content' (正文要点,列表格式)。
        
        示例结构:
        {{
            "title": "演示文稿主标题",
            "slides": [
                {{
                    "heading": "第一页标题",
                    "content": ["要点1", "要点2"]
                }}
            ]
        }}
        """

        try:
            response = Generation.call(
                model=Generation.Models.qwen_turbo, # 或者 qwen-plus, qwen-max
                prompt=prompt,
                result_format='message'
            )

            if response.status_code == 200:
                content = response.output.choices[0].message.content
                # 清理可能存在的 markdown 标记
                content = content.replace('```json', '').replace('```', '').strip()
                return json.loads(content)
            else:
                print(f"❌ API 调用失败: {response.code} - {response.message}")
                return None

        except Exception as e:
            print(f"❌ 发生错误: {e}")
            return None

    def create_pptx(self, data, filename="output.pptx"):
        """
        使用 python-pptx 根据 JSON 数据生成文件
        """
        if not data:
            print("没有数据可生成 PPT")
            return

        prs = Presentation()

        # 1. 创建封面页 (使用第一张布局,通常是标题页)
        slide_layout = prs.slide_layouts[0] 
        slide = prs.slides.add_slide(slide_layout)
        title = slide.shapes.title
        subtitle = slide.placeholders[1]

        title.text = data.get('title', '无标题')
        subtitle.text = "由通义千问自动生成"

        # 2. 循环创建内容页
        content_layout = prs.slide_layouts[1] # 使用标题+内容布局
        
        for slide_data in data.get('slides', []):
            slide = prs.slides.add_slide(content_layout)
            shapes = slide.shapes
            
            # 设置标题
            title_shape = shapes.title
            title_shape.text = slide_data['heading']

            # 设置正文内容
            body_shape = shapes.placeholders[1]
            tf = body_shape.text_frame
            tf.clear() # 清空默认空行

            for point in slide_data['content']:
                p = tf.add_paragraph()
                p.text = point
                p.level = 0
                p.font.size = Pt(20) # 设置字体大小
                p.space_after = Pt(10)

        prs.save(filename)
        print(f"✅ PPT 生成成功!已保存为: {filename}")

#--- 主程序入口 ---
if __name__ == "__main__":
    # 替换为你的 API KEY
    API_KEY = "your-tongyi-api-key-here"  # 请替换为你的实际API Key
    
    try:
        generator = PPTGenerator(api_key=API_KEY)
        
        # 输入主题
        topic = "人工智能的发展趋势"
        
        # 第一步:获取内容
        ppt_data = generator.get_content_from_qwen(topic)
        
        # 第二步:生成文件
        if ppt_data:
            generator.create_pptx(ppt_data, f"{topic}.pptx")
            
    except Exception as e:
        print(f"程序运行出错: {e}")

运行结果:

(ai_env) $ python3 tongyi_ppt_generator.py
正在请求通义千问生成关于 '人工智能的发展趋势' 的大纲...
✅ PPT 生成成功!已保存为: 人工智能的发展趋势.pptx
(ai_env) $ 
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐