#!/usr/bin/env python3
"""
专业投研风格PPT生成 - 升级版 V2
插入pyecharts生成的专业图表
"""

from pptx import Presentation
from pptx.util import Inches, Pt, Cm
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE
import os

# 投研配色
COLORS = {
    'primary': RGBColor(26, 54, 93),
    'accent': RGBColor(214, 158, 46),
    'bull': RGBColor(239, 68, 68),
    'bear': RGBColor(34, 197, 94),
    'white': RGBColor(255, 255, 255),
    'light': RGBColor(248, 250, 252),
    'gray': RGBColor(148, 163, 184),
    'dark': RGBColor(30, 41, 59),
}

FONT_CN = 'WenQuanYi Micro Hei'
CHART_DIR = '/root/.openclaw/workspace/ppt_charts_pyecharts'

def add_title_slide(prs, title, subtitle, date_str):
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    bg = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height)
    bg.fill.solid()
    bg.fill.fore_color.rgb = COLORS['primary']
    bg.line.fill.background()
    
    line = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, Cm(2), Cm(8), Cm(4), Pt(4))
    line.fill.solid()
    line.fill.fore_color.rgb = COLORS['accent']
    line.line.fill.background()
    
    title_box = slide.shapes.add_textbox(Cm(2), Cm(5), Cm(20), Cm(3))
    tf = title_box.text_frame
    p = tf.paragraphs[0]
    p.text = title
    p.font.size = Pt(48)
    p.font.bold = True
    p.font.color.rgb = COLORS['white']
    p.font.name = FONT_CN
    
    sub_box = slide.shapes.add_textbox(Cm(2), Cm(8.5), Cm(20), Cm(1.5))
    tf = sub_box.text_frame
    p = tf.paragraphs[0]
    p.text = subtitle
    p.font.size = Pt(28)
    p.font.color.rgb = COLORS['accent']
    p.font.name = FONT_CN
    
    info_box = slide.shapes.add_textbox(Cm(2), Cm(16), Cm(20), Cm(2))
    tf = info_box.text_frame
    p = tf.paragraphs[0]
    p.text = f"方正中期期货研究院 | {date_str}"
    p.font.size = Pt(16)
    p.font.color.rgb = COLORS['gray']
    p.font.name = FONT_CN
    
    bar = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, Cm(18.5), prs.slide_width, Cm(0.5))
    bar.fill.solid()
    bar.fill.fore_color.rgb = COLORS['accent']
    bar.line.fill.background()

def add_toc_slide(prs):
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    bg = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height)
    bg.fill.solid()
    bg.fill.fore_color.rgb = COLORS['light']
    bg.line.fill.background()
    
    bar = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Cm(1.5))
    bar.fill.solid()
    bar.fill.fore_color.rgb = COLORS['primary']
    bar.line.fill.background()
    
    title_box = slide.shapes.add_textbox(Cm(1), Cm(0.3), Cm(15), Cm(1))
    tf = title_box.text_frame
    p = tf.paragraphs[0]
    p.text = "目录 CONTENTS"
    p.font.size = Pt(24)
    p.font.bold = True
    p.font.color.rgb = COLORS['white']
    p.font.name = FONT_CN
    
    items = [
        ("01", "核心观点与投资逻辑", "震荡偏多，逢低试多"),
        ("02", "行情回顾与量价分析", "震荡上行，持仓回落"),
        ("03", "基本面深度解析", "供需双弱，政策托底"),
        ("04", "技术面与策略建议", "2350-2400区间布局"),
        ("05", "风险提示", "天气、政策、宏观"),
    ]
    
    y_pos = 2.5
    for num, title, desc in items:
        num_box = slide.shapes.add_textbox(Cm(1.5), Cm(y_pos), Cm(2), Cm(1))
        tf = num_box.text_frame
        p = tf.paragraphs[0]
        p.text = num
        p.font.size = Pt(36)
        p.font.bold = True
        p.font.color.rgb = COLORS['accent']
        p.font.name = FONT_CN
        
        title_box = slide.shapes.add_textbox(Cm(4), Cm(y_pos), Cm(15), Cm(0.8))
        tf = title_box.text_frame
        p = tf.paragraphs[0]
        p.text = title
        p.font.size = Pt(22)
        p.font.bold = True
        p.font.color.rgb = COLORS['primary']
        p.font.name = FONT_CN
        
        desc_box = slide.shapes.add_textbox(Cm(4), Cm(y_pos + 0.8), Cm(15), Cm(0.6))
        tf = desc_box.text_frame
        p = tf.paragraphs[0]
        p.text = desc
        p.font.size = Pt(14)
        p.font.color.rgb = COLORS['gray']
        p.font.name = FONT_CN
        
        if num != "05":
            line = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, Cm(4), Cm(y_pos + 1.5), Cm(20), Pt(1))
            line.fill.solid()
            line.fill.fore_color.rgb = RGBColor(226, 232, 240)
            line.line.fill.background()
        
        y_pos += 2.8

def add_highlight_slide(prs):
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    bg = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height)
    bg.fill.solid()
    bg.fill.fore_color.rgb = COLORS['light']
    bg.line.fill.background()
    
    bar = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Cm(1.5))
    bar.fill.solid()
    bar.fill.fore_color.rgb = COLORS['primary']
    bar.line.fill.background()
    
    title_box = slide.shapes.add_textbox(Cm(1), Cm(0.3), Cm(15), Cm(1))
    tf = title_box.text_frame
    p = tf.paragraphs[0]
    p.text = "01 核心观点"
    p.font.size = Pt(24)
    p.font.bold = True
    p.font.color.rgb = COLORS['white']
    p.font.name = FONT_CN
    
    card = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, Cm(1), Cm(2.5), Cm(31), Cm(4))
    card.fill.solid()
    card.fill.fore_color.rgb = COLORS['white']
    card.line.fill.background()
    
    accent = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, Cm(1), Cm(2.5), Cm(0.3), Cm(4))
    accent.fill.solid()
    accent.fill.fore_color.rgb = COLORS['accent']
    accent.line.fill.background()
    
    content_box = slide.shapes.add_textbox(Cm(2), Cm(3), Cm(29), Cm(3.5))
    tf = content_box.text_frame
    tf.word_wrap = True
    
    points = [
        "• 玉米主力合约（C0）近期维持震荡上行格局，重心稳步上移",
        "• 自2月初2265元/吨低点反弹至当前2381元/吨，累计涨幅约5.1%",
        "• 技术面上方面临2400-2450元/吨压力区，下方支撑2350元/吨",
        "• 操作建议：2350-2400元/吨区间逢低做多，目标2450-2500元/吨",
        "• 止损位：2320元/吨（跌破MA20）"
    ]
    
    for i, point in enumerate(points):
        if i == 0:
            p = tf.paragraphs[0]
        else:
            p = tf.add_paragraph()
        p.text = point
        p.font.size = Pt(16)
        p.font.color.rgb = COLORS['dark']
        p.font.name = FONT_CN
        p.space_after = Pt(8)
    
    data_items = [
        ("最新收盘价", "2381", "元/吨", "bull"),
        ("60日涨幅", "+5.03", "%", "bull"),
        ("最新持仓", "138.1", "万手", "bear"),
        ("目标价位", "2450-2500", "元/吨", "accent"),
    ]
    
    x_pos = 1
    for label, value, unit, color_key in data_items:
        card = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, Cm(x_pos), Cm(7), Cm(7), Cm(3.5))
        card.fill.solid()
        card.fill.fore_color.rgb = COLORS['white']
        card.line.fill.background()
        
        val_box = slide.shapes.add_textbox(Cm(x_pos), Cm(7.5), Cm(7), Cm(1.5))
        tf = val_box.text_frame
        p = tf.paragraphs[0]
        p.text = value
        p.font.size = Pt(36)
        p.font.bold = True
        p.font.color.rgb = COLORS[color_key]
        p.font.name = FONT_CN
        p.alignment = PP_ALIGN.CENTER
        
        unit_box = slide.shapes.add_textbox(Cm(x_pos + 4), Cm(7.8), Cm(2.5), Cm(0.8))
        tf = unit_box.text_frame
        p = tf.paragraphs[0]
        p.text = unit
        p.font.size = Pt(14)
        p.font.color.rgb = COLORS['gray']
        p.font.name = FONT_CN
        
        label_box = slide.shapes.add_textbox(Cm(x_pos), Cm(9.2), Cm(7), Cm(0.8))
        tf = label_box.text_frame
        p = tf.paragraphs[0]
        p.text = label
        p.font.size = Pt(14)
        p.font.color.rgb = COLORS['gray']
        p.font.name = FONT_CN
        p.alignment = PP_ALIGN.CENTER
        
        x_pos += 8

def add_chart_slide(prs, title, chart_filename):
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    bg = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height)
    bg.fill.solid()
    bg.fill.fore_color.rgb = COLORS['light']
    bg.line.fill.background()
    
    bar = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Cm(1.5))
    bar.fill.solid()
    bar.fill.fore_color.rgb = COLORS['primary']
    bar.line.fill.background()
    
    title_box = slide.shapes.add_textbox(Cm(1), Cm(0.3), Cm(15), Cm(1))
    tf = title_box.text_frame
    p = tf.paragraphs[0]
    p.text = title
    p.font.size = Pt(24)
    p.font.bold = True
    p.font.color.rgb = COLORS['white']
    p.font.name = FONT_CN
    
    chart_path = os.path.join(CHART_DIR, chart_filename)
    if os.path.exists(chart_path):
        slide.shapes.add_picture(chart_path, Cm(1), Cm(2), width=Cm(31))
    
    note = "数据来源: AKShare | 方正中期期货研究院"
    note_box = slide.shapes.add_textbox(Cm(1), Cm(17), Cm(31), Cm(0.6))
    tf = note_box.text_frame
    p = tf.paragraphs[0]
    p.text = note
    p.font.size = Pt(12)
    p.font.color.rgb = COLORS['gray']
    p.font.name = FONT_CN
    p.alignment = PP_ALIGN.CENTER

def add_fundamental_slide(prs):
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    bg = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height)
    bg.fill.solid()
    bg.fill.fore_color.rgb = COLORS['light']
    bg.line.fill.background()
    
    bar = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Cm(1.5))
    bar.fill.solid()
    bar.fill.fore_color.rgb = COLORS['primary']
    bar.line.fill.background()
    
    title_box = slide.shapes.add_textbox(Cm(1), Cm(0.3), Cm(15), Cm(1))
    tf = title_box.text_frame
    p = tf.paragraphs[0]
    p.text = "03 基本面深度解析"
    p.font.size = Pt(24)
    p.font.bold = True
    p.font.color.rgb = COLORS['white']
    p.font.name = FONT_CN
    
    # 看多
    bull_card = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, Cm(1), Cm(2), Cm(15), Cm(12))
    bull_card.fill.solid()
    bull_card.fill.fore_color.rgb = COLORS['white']
    bull_card.line.fill.background()
    
    bull_header = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, Cm(1), Cm(2), Cm(15), Cm(1.2))
    bull_header.fill.solid()
    bull_header.fill.fore_color.rgb = COLORS['bull']
    bull_header.line.fill.background()
    
    bull_title = slide.shapes.add_textbox(Cm(1), Cm(2.2), Cm(15), Cm(0.8))
    tf = bull_title.text_frame
    p = tf.paragraphs[0]
    p.text = "看多因素"
    p.font.size = Pt(20)
    p.font.bold = True
    p.font.color.rgb = COLORS['white']
    p.font.name = FONT_CN
    p.alignment = PP_ALIGN.CENTER
    
    bull_points = [
        ("南美天气风险", "巴西二季玉米进入关键生长期"),
        ("政策托底", "国家收储政策持续"),
        ("需求改善", "养殖利润修复"),
        ("渠道库存低", "补库需求提供支撑"),
    ]
    
    y = 3.5
    for title, desc in bull_points:
        title_box = slide.shapes.add_textbox(Cm(1.5), Cm(y), Cm(14), Cm(0.7))
        tf = title_box.text_frame
        p = tf.paragraphs[0]
        p.text = f"✓ {title}"
        p.font.size = Pt(16)
        p.font.bold = True
        p.font.color.rgb = COLORS['bull']
        p.font.name = FONT_CN
        
        desc_box = slide.shapes.add_textbox(Cm(1.5), Cm(y + 0.7), Cm(14), Cm(1))
        tf = desc_box.text_frame
        tf.word_wrap = True
        p = tf.paragraphs[0]
        p.text = desc
        p.font.size = Pt(12)
        p.font.color.rgb = COLORS['gray']
        p.font.name = FONT_CN
        y += 2
    
    # 看空
    bear_card = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, Cm(17), Cm(2), Cm(15), Cm(12))
    bear_card.fill.solid()
    bear_card.fill.fore_color.rgb = COLORS['white']
    bear_card.line.fill.background()
    
    bear_header = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, Cm(17), Cm(2), Cm(15), Cm(1.2))
    bear_header.fill.solid()
    bear_header.fill.fore_color.rgb = COLORS['bear']
    bear_header.line.fill.background()
    
    bear_title = slide.shapes.add_textbox(Cm(17), Cm(2.2), Cm(15), Cm(0.8))
    tf = bear_title.text_frame
    p = tf.paragraphs[0]
    p.text = "看空因素"
    p.font.size = Pt(20)
    p.font.bold = True
    p.font.color.rgb = COLORS['white']
    p.font.name = FONT_CN
    p.alignment = PP_ALIGN.CENTER
    
    bear_points = [
        ("新作面积增加", "种植面积可能增加"),
        ("南美新季上市", "供应压力"),
        ("宏观不确定性", "全球经济形势"),
        ("技术面前高压力", "2443元/吨抛压"),
    ]
    
    y = 3.5
    for title, desc in bear_points:
        title_box = slide.shapes.add_textbox(Cm(17.5), Cm(y), Cm(14), Cm(0.7))
        tf = title_box.text_frame
        p = tf.paragraphs[0]
        p.text = f"✗ {title}"
        p.font.size = Pt(16)
        p.font.bold = True
        p.font.color.rgb = COLORS['bear']
        p.font.name = FONT_CN
        
        desc_box = slide.shapes.add_textbox(Cm(17.5), Cm(y + 0.7), Cm(14), Cm(1))
        tf = desc_box.text_frame
        tf.word_wrap = True
        p = tf.paragraphs[0]
        p.text = desc
        p.font.size = Pt(12)
        p.font.color.rgb = COLORS['gray']
        p.font.name = FONT_CN
        y += 2

def add_strategy_slide(prs):
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    bg = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height)
    bg.fill.solid()
    bg.fill.fore_color.rgb = COLORS['light']
    bg.line.fill.background()
    
    bar = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Cm(1.5))
    bar.fill.solid()
    bar.fill.fore_color.rgb = COLORS['primary']
    bar.line.fill.background()
    
    title_box = slide.shapes.add_textbox(Cm(1), Cm(0.3), Cm(15), Cm(1))
    tf = title_box.text_frame
    p = tf.paragraphs[0]
    p.text = "04 交易策略建议"
    p.font.size = Pt(24)
    p.font.bold = True
    p.font.color.rgb = COLORS['white']
    p.font.name = FONT_CN
    
    strategy_card = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, Cm(1), Cm(2.5), Cm(31), Cm(5))
    strategy_card.fill.solid()
    strategy_card.fill.fore_color.rgb = COLORS['white']
    strategy_card.line.fill.background()
    
    label_box = slide.shapes.add_textbox(Cm(1.5), Cm(3), Cm(4), Cm(4))
    tf = label_box.text_frame
    p = tf.paragraphs[0]
    p.text = "逢低\n做多"
    p.font.size = Pt(48)
    p.font.bold = True
    p.font.color.rgb = COLORS['bull']
    p.font.name = FONT_CN
    p.alignment = PP_ALIGN.CENTER
    
    details = [
        ("方向判断", "震荡偏多"),
        ("入场区间", "2350-2400 元/吨"),
        ("目标价位", "2450-2500 元/吨"),
        ("止损价位", "2320 元/吨"),
        ("仓位建议", "轻仓试多"),
        ("持有周期", "1-2 个月"),
    ]
    
    y = 2.8
    for label, value in details:
        label_box = slide.shapes.add_textbox(Cm(6), Cm(y), Cm(6), Cm(0.7))
        tf = label_box.text_frame
        p = tf.paragraphs[0]
        p.text = label
        p.font.size = Pt(14)
        p.font.color.rgb = COLORS['gray']
        p.font.name = FONT_CN
        
        value_box = slide.shapes.add_textbox(Cm(12), Cm(y), Cm(10), Cm(0.7))
        tf = value_box.text_frame
        p = tf.paragraphs[0]
        p.text = value
        p.font.size = Pt(16)
        p.font.bold = True
        p.font.color.rgb = COLORS['primary']
        p.font.name = FONT_CN
        y += 0.8
    
    table_card = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, Cm(1), Cm(8), Cm(31), Cm(6))
    table_card.fill.solid()
    table_card.fill.fore_color.rgb = COLORS['white']
    table_card.line.fill.background()
    
    table_title = slide.shapes.add_textbox(Cm(1.5), Cm(8.3), Cm(15), Cm(0.8))
    tf = table_title.text_frame
    p = tf.paragraphs[0]
    p.text = "关键技术价位"
    p.font.size = Pt(18)
    p.font.bold = True
    p.font.color.rgb = COLORS['primary']
    p.font.name = FONT_CN

def add_risk_slide(prs):
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    bg = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height)
    bg.fill.solid()
    bg.fill.fore_color.rgb = COLORS['light']
    bg.line.fill.background()
    
    bar = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Cm(1.5))
    bar.fill.solid()
    bar.fill.fore_color.rgb = COLORS['primary']
    bar.line.fill.background()
    
    title_box = slide.shapes.add_textbox(Cm(1), Cm(0.3), Cm(15), Cm(1))
    tf = title_box.text_frame
    p = tf.paragraphs[0]
    p.text = "05 风险提示"
    p.font.size = Pt(24)
    p.font.bold = True
    p.font.color.rgb = COLORS['white']
    p.font.name = FONT_CN
    
    risks = [
        ("天气风险", "南美天气变化可能影响供应预期"),
        ("政策风险", "收储政策力度变化"),
        ("宏观风险", "全球经济形势变化"),
        ("资金风险", "持仓量快速变化导致波动"),
    ]
    
    y = 2.5
    for icon_title, desc in risks:
        card = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, Cm(1), Cm(y), Cm(31), Cm(2.5))
        card.fill.solid()
        card.fill.fore_color.rgb = COLORS['white']
        card.line.fill.background()
        
        accent = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, Cm(1), Cm(y), Cm(0.3), Cm(2.5))
        accent.fill.solid()
        accent.fill.fore_color.rgb = COLORS['accent']
        accent.line.fill.background()
        
        title_box = slide.shapes.add_textbox(Cm(1.8), Cm(y + 0.3), Cm(29), Cm(0.7))
        tf = title_box.text_frame
        p = tf.paragraphs[0]
        p.text = icon_title
        p.font.size = Pt(18)
        p.font.bold = True
        p.font.color.rgb = COLORS['bear']
        p.font.name = FONT_CN
        
        desc_box = slide.shapes.add_textbox(Cm(1.8), Cm(y + 1), Cm(29), Cm(1.3))
        tf = desc_box.text_frame
        tf.word_wrap = True
        p = tf.paragraphs[0]
        p.text = desc
        p.font.size = Pt(14)
        p.font.color.rgb = COLORS['gray']
        p.font.name = FONT_CN
        y += 3

def add_ending_slide(prs):
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    bg = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height)
    bg.fill.solid()
    bg.fill.fore_color.rgb = COLORS['primary']
    bg.line.fill.background()
    
    line = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, Cm(10), Cm(5), Cm(12), Pt(4))
    line.fill.solid()
    line.fill.fore_color.rgb = COLORS['accent']
    line.line.fill.background()
    
    thanks_box = slide.shapes.add_textbox(Cm(1), Cm(6), Cm(31), Cm(2))
    tf = thanks_box.text_frame
    p = tf.paragraphs[0]
    p.text = "感谢您的阅读"
    p.font.size = Pt(48)
    p.font.bold = True
    p.font.color.rgb = COLORS['white']
    p.font.name = FONT_CN
    p.alignment = PP_ALIGN.CENTER
    
    disclaimer_box = slide.shapes.add_textbox(Cm(3), Cm(10), Cm(27), Cm(3))
    tf = disclaimer_box.text_frame
    tf.word_wrap = True
    p = tf.paragraphs[0]
    p.text = "免责声明：本报告仅供参考，不构成投资建议。据此操作，风险自担。"
    p.font.size = Pt(14)
    p.font.color.rgb = COLORS['gray']
    p.font.name = FONT_CN
    p.alignment = PP_ALIGN.CENTER

def main():
    prs = Presentation()
    prs.slide_width = Cm(33.867)
    prs.slide_height = Cm(19.05)
    
    add_title_slide(prs, "玉米期货行情研究报告", "C0主力合约深度分析", "2026年3月11日")
    add_toc_slide(prs)
    add_highlight_slide(prs)
    add_chart_slide(prs, "02 行情回顾：K线走势", "kline_chart.png")
    add_chart_slide(prs, "02 行情回顾：量价分析", "volume_chart.png")
    add_fundamental_slide(prs)
    add_chart_slide(prs, "03 相关品种联动", "correlation_chart.png")
    add_strategy_slide(prs)
    add_risk_slide(prs)
    add_ending_slide(prs)
    
    output_path = '/root/.openclaw/workspace/玉米期货投研报告_升级版V2_20260311.pptx'
    prs.save(output_path)
    size = os.path.getsize(output_path) / 1024
    print(f"✅ 升级版PPT生成完成！")
    print(f"📁 文件路径: {output_path}")
    print(f"📊 文件大小: {size:.1f} KB")

if __name__ == '__main__':
    main()
