Development
#python
competition-ppt
中国国际大学生创新大赛(国赛)路演PPT制作。当用户提到"竞赛PPT"、"国赛"、"路演PPT"、"创新创业大赛"、"比赛幻灯片"时触发。基于两份国赛金奖级模板的设计方法论,使用python-pptx + PIL生成原创高质量PPT。
DeepseekModel
Curated skill
Quality Good · 64
v1.0.0
Get
https://deepseekmodel.com/api/download.php?id=2750527986liu-maker-competition-ppt-skill-skill-md&format=skill
Download .skill
Standard format with system_prompt and model_config, ready for any agent framework
The actual content of the system_prompt field in the .skill file.
name competition-ppt description 中国国际大学生创新大赛(国赛)路演PPT制作。当用户提到"竞赛PPT"、"国赛"、"路演PPT"、"创新创业大赛"、"比赛幻灯片"时触发。基于两份国赛金奖级模板的设计方法论,使用python-pptx + PIL生成原创高质量PPT。 竞赛PPT制作 Skill 触发条件 用户需要制作参加中国国际大学生创新大赛(或类似创新创业比赛)的路演PPT。 第一步:需求收集(必须先做) 在开始制作前,用 AskUserQuestion 工具收集以下信息: 项目文件 :用户是否有策划书、路演稿、流程大纲等文件?如果有,先全部读取理解内容。 参考模板 :用户是否提供了参考PPT模板?如果有,必须用python-pptx分析其结构(见"模板分析"章节), 不要直接复制模板素材 ,而是学习其设计思路。 页数要求 :一般20-43页,根据内容量决定。 配色偏好 :默认深蓝+金色,用户可指定。 第二步:模板分析(如有参考模板) 如果用户提供了参考PPT, 必须 执行以下分析流程: 2.1 用python-pptx提取结构信息 from pptx import Presentation prs = Presentation( "模板路径.pptx" ) slides_list = list (prs.slides) print ( f"尺寸: {prs.slide_width/ 914400 : .1 f} x {prs.slide_height/ 914400 : .1 f} 英寸" ) print ( f"总页数: { len (slides_list)} " ) for i, slide in enumerate (slides_list): pics = sum ( 1 for s in slide.shapes if s.shape_type == 13 ) groups = sum ( 1 for s in slide.shapes if s.shape_type == 6 ) # 提取文本和图片位置 for shape in slide.shapes: if shape.has_text_frame: print ( f" 文本: {shape.text[: 100 ]} @( {shape.left/ 914400 : .1 f} , {shape.top/ 914400 : .1 f} )" ) if shape.shape_type == 13 : print ( f" 图片: @( {shape.left/ 914400 : .1 f} , {shape.top/ 914400 : .1 f} ) {shape.width/ 914400 : .1 f} x {shape.height/ 914400 : .1 f} " ) 2.2 提取背景图片(理解配色和视觉风格) from pptx.oxml.ns import qn import os os.makedirs( "template-bg" , exist_ok= True ) for i, slide in enumerate (slides_list): bg_elem = slide.background._element nsmap = { 'a' : 'http://schemas.openxmlformats.org/drawingml/2006/main' , 'r' : 'http://schemas.openxmlformats.org/officeDocument/2006/relationships' } blip = bg_elem.find( './/a:blipFill/a:blip' , nsmap) if blip is not None : embed = blip.get(qn( 'r:embed' )) if embed: rel = slide.part.rels[embed] img_part = rel.target_part ext = img_part.content_type.split( '/' )[- 1 ].replace( 'jpeg' , 'jpg' ) with open ( f"template-bg/slide {i+ 1 :02d} . {ext} " , 'wb' ) as f: f.write(img_part.blob) 2.3 用Read工具查看背景图片 将提取的背景图片复制到用户可见的工作文件夹,用Read工具查看,理解: 封面的配色方案(渐变色、主色调) 内容页的背景风格(浅色/深色、有无纹理) 特殊页面(时间线、致谢页)的设计 2.4 总结设计语言(不复制素材) 从模板中学习以下设计原则,然后 自己制作 设计素材: 配色方案(主色、辅色、强调色) 排版节奏(标题位置、内容区域划分) 元素密度(每页多少图片、多少文字块) 装饰手法(边框、分割线、图标风格) 第三步:内容大纲 3.1 国赛标准结构(参考两份模板的共同模式) 根据对两份国赛级PPT(41页冰雪经济 + 43页低空经济)的分析,标准结构如下: 编号 页面类型 内容 建议页数 1 封面 项目名称+副标题+团队+赛道+负责人 1页 2 政策背景 国家/行业政策支撑 1-2页 3 行业现状 市场数据、图表 1-2页 4 痛点分析 行业核心痛点(通常3个) 1-2页 5 项目概述 技术原理+核心突破+产品展示 1-2页 6 研发历程 时间线展示 1页 7-N 核心技术 每个核心技术独立1-2页 3-6页 N+1 核心子系统 系统架构展示 1-2页 N+2 核心母系统 整体系统集成 1页 N+3 衍生技术 技术延伸应用 1-2页 N+4 衍生场景 应用场景拓展 1页 N+5 技术参数 关键指标对比表 1页 N+6 技术壁垒/专利 知识产权保护 1页 N+7 项目荣誉 获奖/认证 1页 N+8 应用案例 实际落地案例(每个1页) 2-4页 N+9 应用场景 典型使用场景 1-2页 N+10 竞品分析 对比表格/雷达图 1页 N+11 服务客群/商业模式 用户画像+盈利模式 2-4页 N+12 行业/技术认可 合作方背书 1-2页 N+13 媒体报道 权威媒体引用 1页 N+14 领导关怀 领导视察/指导 1页(可选) N+15 个人成长 负责人成长历程 1-2页 N+16 团队介绍 负责人+成员+顾问 2-3页 N+17 学科引领/带动教育 产教融合成果 1-2页 N+18 社会价值 产业+人才+行业价值 1页 N+19 财务分析 收入预测+盈利模型 1页 N+20 未来规划 发展路线图 1页 N+21 致谢 感谢聆听 1页 关键原则 : 竞赛PPT要 信息密度高、论证充分 ,不要怕页数多 每个核心技术点 独立成页 团队/教育/社会价值需要 多页展开 案例、荣誉、媒体报道都是 加分页 3.2 页面标题体系(必须遵守) 每页内容页必须包含: Section标签 :左上角深色圆角矩形,显示页面类别(如"核心技术"、"痛点分析") 副标题 :以"——"开头,描述本页核心论点 页码 :右下角 "X/总数" [Section标签] ——副标题描述本页核心论点 ───────────────────────────────────────── 正文内容区域 第四步:设计素材制作 4.1 用PIL生成原创背景(不要复制模板素材) from PIL import Image, ImageDraw, ImageFilter import math, random W, H = 2000 , 1125 # 13.33x7.5英寸 @ 150DPI def gradient ( draw, w, h, c1, c2, direction= 'vertical' ): for i in range (h if direction == 'vertical' else w): ratio = i / (h if direction == 'vertical' else w) r = int (c1[ 0 ] + (c2[ 0 ] - c1[ 0 ]) * ratio) g = int (c1[ 1 ] + (c2[ 1 ] - c1[ 1 ]) * ratio) b = int (c1[ 2 ] + (c2[ 2 ] - c1[ 2 ]) * ratio) if direction == 'vertical' : draw.line([( 0 , i), (w, i)], fill=(r, g, b)) else : draw.line([(i, 0 ), (i, h)], fill=(r, g, b)) 必须生成的素材 (每种都需要): cover-bg.png (2000x1125):封面背景。深色渐变+抽象几何/光线/网络线条 content-bg.png (2000x1125):内容页背景。浅色+微妙网格/纹理+角落点缀 timeline-bg.png (2000x1125):时间线/研发历程背景。彩墨飞溅/渐变色块 dark-section-bg.png (2000x1125):深色强调页背景。深蓝+对角线纹理 thankyou-bg.png (2000x1125):致谢页背景。深色+中央金色光晕 gold-line.png (900x6):金色渐变分割线 section-badge.png (400x80):深色section标签底图(可选,也可以用代码画) moon-icon.png 或其他项目相关图标 (200x200) 封面背景制作要点 : 深色渐变(如深蓝→更深蓝) 添加径向光晕(金色/蓝色) 抽象几何线条(网络节点、数据流、网格线) 不能太花哨,要保持专业感 内容页背景制作要点 : 浅色为主(白/浅灰/浅蓝) 极其微妙的网格纹理 角落淡淡的蓝色水彩点缀 保持文字可读性 4.2 配色方案 默认配色(可按项目主题调整): NAVY = RGBColor( 0x0A , 0x16 , 0x28 ) # 深海军蓝,用于标题和section标签 DARK_BLUE = RGBColor( 0x0F , 0x1D , 0x35 ) # 深蓝 GOLD = RGBColor( 0xC9 , 0xA8 , 0x4C ) # 金色,用于强调和装饰 LIGHT_GOLD = RGBColor( 0xE8 , 0xD5 , 0x8C ) # 浅金色 WHITE = RGBColor( 0xFF , 0xFF , 0xFF ) # 白色 DARK_TEXT = RGBColor( 0x1E , 0x29 , 0x3B ) # 深色正文 SUB_TEXT = RGBColor( 0x64 , 0x74 , 0x8B ) # 灰色副文本 ACCENT_BLUE = RGBColor( 0x38 , 0x6F , 0xC4 ) # 蓝色强调 4.3 字体 标题 :等线(DengXian),Windows自带,现代清秀 正文 :等线(DengXian)或微软雅黑 数据/数字 :等线 Bold,突出显示 英文 :等线自动适配 第五步:PPT生成代码模板 5.1 基础框架 from pptx import Presentation from pptx.util import Inches, Pt, Emu from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN, MSO_ANCHOR from pptx.enum.shapes import MSO_SHAPE import os W = Inches( 13.33 ) H = Inches( 7.5 ) IMG = "项目图片目录" BG = "设计素材目录" OUT = "输出路径.pptx" prs = Presentation() prs.slide_width = W prs.slide_height = H BLANK = prs.slide_layouts[ 6 ] # blank layout # 颜色定义(根据项目主题调整) NAVY = RGBColor( 0x0A , 0x16 , 0x28 ) GOLD = RGBColor( 0xC9 , 0xA8 , 0x4C ) WHITE = RGBColor( 0xFF , 0xFF , 0xFF ) DARK_TEXT = RGBColor( 0x1E , 0x29 , 0x3B ) SUB_TEXT = RGBColor( 0x64 , 0x74 , 0x8B ) ACCENT = RGBColor( 0x38 , 0x6F , 0xC4 ) 5.2 核心Helper函数 def add_bg ( slide, bg_path ): """添加全出血背景图""" if os.path.exists(bg_path): slide.background.fill.background() pic = slide.shapes.add_picture(bg_path, Emu( 0 ), Emu( 0 ), W, H) sp = pic._element sp.getparent().remove(sp) slide.shapes._spTree.insert( 2 , sp) def text_box ( slide, left, top, width, height, text, font_size= 18 , color=DARK_TEXT, bold= False , align=PP_ALIGN.LEFT, font_name= "等线" , line_spacing= 1.5 ): """添加文本框""" txBox = slide.shapes.add_textbox(Inches(left), Inches(top), Inches(width), Inches(height)) tf = txBox.text_frame tf.word_wrap = True p = tf.paragraphs[ 0 ] p.alignment = align run = p.add_run() run.text = text run.font.size = Pt(font_size) run.font.color.rgb = color run.font.bold = bold run.font.name = font_name if line_spacing: p.line_spacing = Pt(font_size * line_spacing) return txBox def multi_text ( slide, left, top, width, height, lines, font_size= 16 , color=DARK_TEXT, bold= False , align=PP_ALIGN.LEFT, font_name= "等线" , line_spacing= 1.5 ): """添加多段文本""" txBox = slide.shapes.add_textbox(Inches(left), Inches(top), Inches(width), Inches(height)) tf = txBox.text_frame tf.word_wrap = True for i, line_text in enumerate (lines): p = tf.paragraphs[ 0 ] if i == 0 else tf.add_paragraph() p.alignment = align p.space_after = Pt( 6 ) run = p.add_run() run.text = line_text run.font.size = Pt(font_size) run.font.color.rgb = color run.font.bold = bold run.font.name = font_name p.line_spacing = Pt(font_size * line_spacing) return txBox def gold_line ( slide, left, top, width ): """金色分割线""" shape = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, Inches(left), Inches(top), Inches(width), Pt( 3 )) shape.fill.solid() shape.fill.fore_color.rgb = GOLD shape.line.fill.background() def section_badge ( slide, text, left= 0.3 , top= 0.2 ): """左上角Section标签""" shape = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, Inches(left), Inches(top), Inches( 2.6 ), Inches( 0.6 )) shape.fill.solid() shape.fill.fore_color.rgb = NAVY shape.line.fill.background() tf = shape.text_frame p = tf.paragraphs[ 0 ] p.alignment = PP_ALIGN.CENTER run = p.add_run() run.text = text run.font.size = Pt( 22 ) run.font.color.rgb = WHITE run.font.bold = True run.font.name = "等线" def sub_header ( slide, text, left= 3.2 , top= 0.2 ): """副标题(——前缀)""" text_box(slide, left, top, 9.5 , 0.6 , f"—— {text} " , font_size= 16 , color=SUB_TEXT) def card_shape ( slide, left, top, width, height, fill=WHITE ): """白色卡片""" shape = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, Inches(left), Inches(top), Inches(width), Inches(height)) shape.fill.solid() shape.fill.fore_color.rgb = fill shape.line.color.rgb = RGBColor( 0xE2 , 0xE8 , 0xF0 ) shape.line.width = Pt( 1 ) return shape def add_img ( slide, path, left, top, width= None , height= None ): """安全添加图片""" if not os.path.exists(path): return None if width and height: return slide.shapes.add_picture(path, Inches(left), Inches(top), Inches(width), Inches(height)) elif width: return slide.shapes.add_picture(path, Inches(left), Inches(top), width=Inches(width)) else : return slide.shapes.add_picture(path, Inches(left), Inches(top)) def page_num ( slide, num, total ): """页码""" text_box(slide, 12.0 , 6.9 , 1.0 , 0.4 , f" {num} / {total} " ,
Keywords that activate this skill. Click one to copy it.
This skill does not provide trigger words.
The downloaded .skill package contains the following fields.
| Field | Description |
|---|---|
| format | Format tag (skill/v1) |
| skill_id | Unique skill ID |
| name | Skill name |
| version | Version |
| description | Description |
| category | Categories (array) |
| trigger_words | Trigger words |
| tags | Tags |
| source | Source |
| source_url | Source URL (this page) |
| exported_at | Exported at (set per download) |
| system_prompt | System prompt body |
| model_config | Model config: provider / model / temperature / max_tokens / top_p |
| examples | Examples |
| install_guide | Import guide for Coze / Dify / Claude / custom frameworks |
The same skill can be exported in different platform formats.