解密市场中基于生成式模型构建的ppt技术背景 如何构建一套我们自己的llm ppt

第一步我们分析目录 .

├── [Content_Types].xml
├── _rels
├── docProps
│   ├── app.xml
│   ├── core.xml
│   └── thumbnail.jpeg
├── ppt
│   ├── _rels
│   │   └── presentation.xml.rels
│   ├── media
│   │   ├── image1.jpg
│   │   ├── image10.png
│   │   ├── image11.png
│   │   ├── image12.png
│   │   ├── image13.png
│   │   ├── image2.png
│   │   ├── image3.png
│   │   ├── image4.jpg
│   │   ├── image5.png
│   │   ├── image6.png
│   │   ├── image7.png
│   │   ├── image8.png
│   │   └── image9.png
│   ├── notesMasters
│   │   ├── _rels
│   │   │   └── notesMaster1.xml.rels
│   │   └── notesMaster1.xml
│   ├── notesSlides
│   │   ├── _rels
│   │   │   ├── notesSlide1.xml.rels
│   │   │   └── notesSlide2.xml.rels
│   │   ├── notesSlide1.xml
│   │   └── notesSlide2.xml
│   ├── presProps.xml
│   ├── presentation.xml
│   ├── slideLayouts
│   │   ├── _rels
│   │   │   ├── slideLayout1.xml.rels
│   │   │   ├── slideLayout10.xml.rels
│   │   │   ├── slideLayout11.xml.rels
│   │   │   ├── slideLayout2.xml.rels
│   │   │   ├── slideLayout3.xml.rels
│   │   │   ├── slideLayout4.xml.rels
│   │   │   ├── slideLayout5.xml.rels
│   │   │   ├── slideLayout6.xml.rels
│   │   │   ├── slideLayout7.xml.rels
│   │   │   ├── slideLayout8.xml.rels
│   │   │   └── slideLayout9.xml.rels
│   │   ├── slideLayout1.xml
│   │   ├── slideLayout10.xml
│   │   ├── slideLayout11.xml
│   │   ├── slideLayout2.xml
│   │   ├── slideLayout3.xml
│   │   ├── slideLayout4.xml
│   │   ├── slideLayout5.xml
│   │   ├── slideLayout6.xml
│   │   ├── slideLayout7.xml
│   │   ├── slideLayout8.xml
│   │   └── slideLayout9.xml
│   ├── slideMasters
│   │   ├── _rels
│   │   │   └── slideMaster1.xml.rels
│   │   └── slideMaster1.xml
│   ├── slides
│   │   ├── _rels
│   │   │   ├── slide1.xml.rels
│   │   │   ├── slide10.xml.rels
│   │   │   ├── slide11.xml.rels
│   │   │   ├── slide2.xml.rels
│   │   │   ├── slide3.xml.rels
│   │   │   ├── slide4.xml.rels
│   │   │   ├── slide5.xml.rels
│   │   │   ├── slide6.xml.rels
│   │   │   ├── slide7.xml.rels
│   │   │   ├── slide8.xml.rels
│   │   │   └── slide9.xml.rels
│   │   ├── slide1.xml
│   │   ├── slide10.xml
│   │   ├── slide11.xml
│   │   ├── slide2.xml
│   │   ├── slide3.xml
│   │   ├── slide4.xml
│   │   ├── slide5.xml
│   │   ├── slide6.xml
│   │   ├── slide7.xml
│   │   ├── slide8.xml
│   │   └── slide9.xml
│   ├── tableStyles.xml
│   ├── theme
│   │   ├── theme1.xml
│   │   └── theme2.xml
│   └── viewProps.xml

这是一个典型的Microsoft PowerPoint (.pptx) 文件的目录结构。以下是对每个目录和文件的简要说明:

  • [Content_Types].xml: 这个文件定义了包内所有文件的内容类型,比如“presentationml.slide”表示这是一个幻灯片。
  • _rels: 这个目录包含了描述包内文件之间关系的XML文件。每个.rels文件都定义了它所在目录与其他文件的关系。
  • docProps:
    • app.xml: 包含了应用程序特定的文件属性,比如应用程序名称和版本。
    • core.xml: 包含了文件的常见属性,如标题、主题、作者和类别。
    • thumbnail.jpeg: 如果存在,这是文件的缩略图。
  • ppt:
    • _rels: 包含了ppt目录下文件的关系描述。
    • media: 包含了所有嵌入到演示文稿中的媒体文件,如图片、音频和视频。
    • notesMasters: 包含了备注母版,用于定义备注页的布局和格式。
    • notesSlides: 包含了具体的备注页内容。
    • presProps.xml: 包含了演示文稿的属性,如是否循环播放、是否显示备注等。
    • presentation.xml: 这是演示文稿的主要文件,包含了幻灯片的顺序和布局信息。
    • slideLayouts: 包含了幻灯片布局定义,这些定义了幻灯片上不同类型内容的排列方式。
    • slideMasters: 包含了幻灯片母版,这些定义了幻灯片的设计模板,包括字体、颜色方案和背景。
    • slides: 包含了实际的幻灯片内容,每个幻灯片都有自己的XML文件和相应的.rels关系文件。
    • tableStyles.xml: 定义了表格的样式。
    • theme: 包含了演示文稿的主题,这些定义了演示文稿的颜色和字体方案。
    • viewProps.xml: 包含了演示文稿的视图属性,如缩放级别和显示的幻灯片。
      每个幻灯片、备注页、母版和布局都有自己的.xml文件和相应的.rels文件,.rels文件描述了这些XML文件与媒体文件或其他资源的关系。这个结构是标准的Office Open XML格式,用于Microsoft PowerPoint 2007及以后版本的文件。
      接下来我们观察每页中的ppt内容
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:pic><p:nvPicPr><p:cNvPr id="5" name="图片 4"><a:extLst><a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}"><a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{CFA64064-DE87-6710-9737-51ECB534F4E2}"/></a:ext></a:extLst></p:cNvPr><p:cNvPicPr><a:picLocks noChangeAspect="1"/></p:cNvPicPr><p:nvPr/></p:nvPicPr><p:blipFill><a:blip r:embed="rId3"><a:extLst><a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}"><a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0"/></a:ext></a:extLst></a:blip><a:stretch><a:fillRect/></a:stretch></p:blipFill><p:spPr><a:xfrm><a:off x="510357" y="1466034"/><a:ext cx="7539134" cy="4711959"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr></p:pic><p:cxnSp><p:nvCxnSpPr><p:cNvPr id="7" name="直接箭头连接符 6"><a:extLst><a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}"><a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{17F38CAE-7D50-1FDC-B611-CEC1C5DE4017}"/></a:ext></a:extLst></p:cNvPr><p:cNvCxnSpPr><a:cxnSpLocks/></p:cNvCxnSpPr><p:nvPr/></p:nvCxnSpPr><p:spPr><a:xfrm flipH="1"><a:off x="6998241" y="2473742"/><a:ext cx="1175657" cy="0"/></a:xfrm><a:prstGeom prst="straightConnector1"><a:avLst/></a:prstGeom><a:ln><a:solidFill><a:srgbClr val="FF0000"/></a:solidFill><a:tailEnd type="triangle"/></a:ln></p:spPr><p:style><a:lnRef idx="1"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="0"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="0"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="tx1"/></a:fontRef></p:style></p:cxnSp><p:sp><p:nvSpPr><p:cNvPr id="8" name="文本框 7"><a:extLst><a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}"><a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{16C78C8E-1062-08E6-9FB8-0E7ACF92F4D6}"/></a:ext></a:extLst></p:cNvPr><p:cNvSpPr txBox="1"/><p:nvPr/></p:nvSpPr><p:spPr><a:xfrm><a:off x="8295196" y="1389093"/><a:ext cx="3601618" cy="2585323"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:noFill/></p:spPr><p:txBody><a:bodyPr wrap="square" rtlCol="0"><a:spAutoFit/></a:bodyPr><a:lstStyle/><a:p><a:r><a:rPr lang="zh-CN" altLang="en-US" dirty="0"/><a:t>增加:</a:t></a:r><a:endParaRPr lang="en-US" altLang="zh-CN" dirty="0"/></a:p><a:p><a:r><a:rPr lang="en-US" altLang="zh-CN" dirty="0"/><a:t></a:t></a:r><a:r><a:rPr lang="zh-CN" altLang="en-US" dirty="0"/><a:t>玩法介绍</a:t></a:r><a:r><a:rPr lang="en-US" altLang="zh-CN" dirty="0"/><a:t></a:t></a:r></a:p><a:p><a:r><a:rPr lang="zh-CN" altLang="en-US" dirty="0"/><a:t>转动手柄或踏板来启动赛车,转动快则加速,转动慢则减速,停止转动则刹车。适用肌力:</a:t></a:r><a:r><a:rPr lang="en-US" altLang="zh-CN" dirty="0"/><a:t>3~5</a:t></a:r><a:r><a:rPr lang="zh-CN" altLang="en-US" dirty="0"/><a:t>级。</a:t></a:r><a:endParaRPr lang="en-US" altLang="zh-CN" dirty="0"/></a:p><a:p><a:endParaRPr lang="en-US" altLang="zh-CN" dirty="0"/></a:p><a:p><a:r><a:rPr lang="en-US" altLang="zh-CN" dirty="0"/><a:t></a:t></a:r><a:r><a:rPr lang="zh-CN" altLang="en-US" dirty="0"/><a:t>所需配件</a:t></a:r><a:r><a:rPr lang="en-US" altLang="zh-CN" dirty="0"/><a:t></a:t></a:r></a:p><a:p><a:r><a:rPr lang="zh-CN" altLang="en-US" dirty="0"/><a:t>上肢旋转手柄、磨盘手柄、脚蹬踏板(配图</a:t></a:r><a:r><a:rPr lang="en-US" altLang="zh-CN" dirty="0"/><a:t>+</a:t></a:r><a:r><a:rPr lang="zh-CN" altLang="en-US" dirty="0"/><a:t>文字)</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="2" name="矩形 1"><a:extLst><a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}"><a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{6A8BAF3D-7E05-2EEA-7AF5-279DD52F4FF2}"/></a:ext></a:extLst></p:cNvPr><p:cNvSpPr/><p:nvPr/></p:nvSpPr><p:spPr><a:xfrm><a:off x="4987114" y="3636018"/><a:ext cx="2011127" cy="454323"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:noFill/><a:ln><a:solidFill><a:srgbClr val="FF0000"/></a:solidFill></a:ln></p:spPr><p:style><a:lnRef idx="2"><a:schemeClr val="accent1"><a:shade val="15000"/></a:schemeClr></a:lnRef><a:fillRef idx="1"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="0"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="lt1"/></a:fontRef></p:style><p:txBody><a:bodyPr rtlCol="0" anchor="ctr"/><a:lstStyle/><a:p><a:pPr algn="ctr"/><a:endParaRPr lang="zh-CN" altLang="en-US"/></a:p></p:txBody></p:sp><p:cxnSp><p:nvCxnSpPr><p:cNvPr id="4" name="直接箭头连接符 3"><a:extLst><a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}"><a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{CAB71A13-2A36-26BD-45F8-077F0C696DFD}"/></a:ext></a:extLst></p:cNvPr><p:cNvCxnSpPr><a:cxnSpLocks/><a:endCxn id="6" idx="1"/></p:cNvCxnSpPr><p:nvPr/></p:nvCxnSpPr><p:spPr><a:xfrm><a:off x="6998240" y="3920809"/><a:ext cx="1296956" cy="1008642"/></a:xfrm><a:prstGeom prst="straightConnector1"><a:avLst/></a:prstGeom><a:ln><a:solidFill><a:srgbClr val="FF0000"/></a:solidFill><a:tailEnd type="triangle"/></a:ln></p:spPr><p:style><a:lnRef idx="1"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="0"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="0"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="tx1"/></a:fontRef></p:style></p:cxnSp><p:sp><p:nvSpPr><p:cNvPr id="6" name="文本框 5"><a:extLst><a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}"><a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{BA55B427-5B67-D774-9F3F-9253FD182C16}"/></a:ext></a:extLst></p:cNvPr><p:cNvSpPr txBox="1"/><p:nvPr/></p:nvSpPr><p:spPr><a:xfrm><a:off x="8295196" y="4606285"/><a:ext cx="3113783" cy="646331"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:noFill/></p:spPr><p:txBody><a:bodyPr wrap="square" rtlCol="0"><a:spAutoFit/></a:bodyPr><a:lstStyle/><a:p><a:r><a:rPr lang="zh-CN" altLang="en-US" dirty="0"/><a:t>在游戏实际中是反的,需要倒一下</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="9" name="文本框 8"><a:extLst><a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}"><a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{9DE8631B-401E-8126-824A-C4E602645571}"/></a:ext></a:extLst></p:cNvPr><p:cNvSpPr txBox="1"/><p:nvPr/></p:nvSpPr><p:spPr><a:xfrm><a:off x="369077" y="371064"/><a:ext cx="2842443" cy="369332"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:noFill/></p:spPr><p:txBody><a:bodyPr wrap="square" rtlCol="0"><a:spAutoFit/></a:bodyPr><a:lstStyle/><a:p><a:r><a:rPr lang="zh-CN" altLang="en-US" b="1" dirty="0"/><a:t>游戏</a:t></a:r><a:r><a:rPr lang="en-US" altLang="zh-CN" b="1" dirty="0"/><a:t>1</a:t></a:r><a:r><a:rPr lang="zh-CN" altLang="en-US" b="1" dirty="0"/><a:t>:赛车 基础需求</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="10" name="矩形 9"><a:extLst><a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}"><a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{A5C123BC-4BCE-E376-2F0F-7C6B67E8DFC2}"/></a:ext></a:extLst></p:cNvPr><p:cNvSpPr/><p:nvPr/></p:nvSpPr><p:spPr><a:xfrm><a:off x="1385455" y="1466034"/><a:ext cx="480291" cy="270402"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:noFill/><a:ln><a:solidFill><a:srgbClr val="FF0000"/></a:solidFill></a:ln></p:spPr><p:style><a:lnRef idx="2"><a:schemeClr val="accent1"><a:shade val="15000"/></a:schemeClr></a:lnRef><a:fillRef idx="1"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="0"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="lt1"/></a:fontRef></p:style><p:txBody><a:bodyPr rtlCol="0" anchor="ctr"/><a:lstStyle/><a:p><a:pPr algn="ctr"/><a:endParaRPr lang="zh-CN" altLang="en-US"/></a:p></p:txBody></p:sp><p:cxnSp><p:nvCxnSpPr><p:cNvPr id="12" name="直接箭头连接符 11"><a:extLst><a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}"><a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{BEE39ACF-2F0E-745B-E989-F48C71FD55AB}"/></a:ext></a:extLst></p:cNvPr><p:cNvCxnSpPr><a:cxnSpLocks/></p:cNvCxnSpPr><p:nvPr/></p:nvCxnSpPr><p:spPr><a:xfrm flipV="1"><a:off x="1644073" y="1302830"/><a:ext cx="0" cy="177391"/></a:xfrm><a:prstGeom prst="straightConnector1"><a:avLst/></a:prstGeom><a:ln><a:solidFill><a:srgbClr val="FF0000"/></a:solidFill><a:tailEnd type="triangle"/></a:ln></p:spPr><p:style><a:lnRef idx="1"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="0"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="0"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="tx1"/></a:fontRef></p:style></p:cxnSp><p:sp><p:nvSpPr><p:cNvPr id="13" name="文本框 12"><a:extLst><a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}"><a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{88F56F94-04C0-BAE1-4C69-E8669F48CEE8}"/></a:ext></a:extLst></p:cNvPr><p:cNvSpPr txBox="1"/><p:nvPr/></p:nvSpPr><p:spPr><a:xfrm><a:off x="914399" y="927874"/><a:ext cx="2040006" cy="369332"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:noFill/></p:spPr><p:txBody><a:bodyPr wrap="square" rtlCol="0"><a:spAutoFit/></a:bodyPr><a:lstStyle/><a:p><a:r><a:rPr lang="zh-CN" altLang="en-US" dirty="0"/><a:t>放大游戏名称</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="16" name="矩形 15"><a:extLst><a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}"><a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{E42B62E8-0CA7-F3DA-446E-313584B2E98D}"/></a:ext></a:extLst></p:cNvPr><p:cNvSpPr/><p:nvPr/></p:nvSpPr><p:spPr><a:xfrm><a:off x="5541818" y="2031999"/><a:ext cx="757382" cy="369332"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:noFill/><a:ln><a:solidFill><a:srgbClr val="FF0000"/></a:solidFill></a:ln></p:spPr><p:style><a:lnRef idx="2"><a:schemeClr val="accent1"><a:shade val="15000"/></a:schemeClr></a:lnRef><a:fillRef idx="1"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="0"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="lt1"/></a:fontRef></p:style><p:txBody><a:bodyPr rtlCol="0" anchor="ctr"/><a:lstStyle/><a:p><a:pPr algn="ctr"/><a:endParaRPr lang="zh-CN" altLang="en-US"/></a:p></p:txBody></p:sp><p:cxnSp><p:nvCxnSpPr><p:cNvPr id="18" name="直接箭头连接符 17"><a:extLst><a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}"><a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{3720BD0F-1F86-91CD-425B-E4D40488B077}"/></a:ext></a:extLst></p:cNvPr><p:cNvCxnSpPr><a:cxnSpLocks/></p:cNvCxnSpPr><p:nvPr/></p:nvCxnSpPr><p:spPr><a:xfrm flipV="1"><a:off x="5938982" y="1311467"/><a:ext cx="0" cy="720532"/></a:xfrm><a:prstGeom prst="straightConnector1"><a:avLst/></a:prstGeom><a:ln><a:solidFill><a:srgbClr val="FF0000"/></a:solidFill><a:tailEnd type="triangle"/></a:ln></p:spPr><p:style><a:lnRef idx="1"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="0"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="0"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="tx1"/></a:fontRef></p:style></p:cxnSp><p:sp><p:nvSpPr><p:cNvPr id="19" name="文本框 18"><a:extLst><a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}"><a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{ACF10DF2-90FE-4BA0-990C-83A7D7E0E598}"/></a:ext></a:extLst></p:cNvPr><p:cNvSpPr txBox="1"/><p:nvPr/></p:nvSpPr><p:spPr><a:xfrm><a:off x="4987113" y="933498"/><a:ext cx="2011127" cy="369332"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:noFill/></p:spPr><p:txBody><a:bodyPr wrap="square" rtlCol="0"><a:spAutoFit/></a:bodyPr><a:lstStyle/><a:p><a:r><a:rPr lang="zh-CN" altLang="en-US" dirty="0"/><a:t>改为</a:t></a:r><a:r><a:rPr lang="en-US" altLang="zh-CN" dirty="0"/><a:t></a:t></a:r><a:r><a:rPr lang="zh-CN" altLang="en-US" dirty="0"/><a:t>游戏选项</a:t></a:r><a:r><a:rPr lang="en-US" altLang="zh-CN" dirty="0"/><a:t></a:t></a:r><a:endParaRPr lang="zh-CN" altLang="en-US" dirty="0"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="1721792254"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld>

这个XML片段代表了一个PowerPoint幻灯片的文件内容。从片段中可以解读出以下信息:

  1. 幻灯片基本属性:
    • <p:sld>: 表示这是一个幻灯片元素。
    • <p:cSld>: 包含幻灯片内容的主要容器。
    • <p:clrMapOvr>: 定义了幻灯片的颜色映射,通常用于主题和背景。
  2. 幻灯片内容:
    • <p:spTree>: 包含了幻灯片上的所有视觉元素。
    • <p:pic>: 表示幻灯片上有一个图片元素,其属性包括图片的位置和大小。
    • <p:cxnSp>: 表示幻灯片上有一个连接符元素,用于连接不同的视觉元素。
    • <p:sp>: 表示幻灯片上有文本框元素,其中包含了文本内容。
  3. 文本内容:
    • <a:t>: 表示文本内容。
    • <a:r>: 表示一个段落中的一个文本元素。
    • <a:endParaRPr>: 表示一个段落的结束属性。
    • <a:rPr>: 表示文本的格式属性,包括语言、粗体等。
  4. 幻灯片布局:
    • <p:nvGrpSpPr>: 定义了幻灯片的基本布局属性。
    • <p:grpSpPr>: 定义了组合元素(如图片和文本框)的布局属性。
    • <p:spPr>: 定义了单个视觉元素的布局属性,包括位置、大小等。
    • <p:xfrm>: 定义了元素的变换属性,如旋转、缩放等。
  5. 幻灯片样式:
    • <p:style>: 定义了幻灯片的样式属性,包括线条、填充、效果和字体等。
    • <a:schemeClr>: 定义了颜色方案中的颜色值。
    • <a:shade>: 定义了颜色的阴影值。
  6. 幻灯片关系:
    • <p:nvCxnSpPr>: 定义了连接符的布局属性。
    • <p:cxnSpLocks>: 定义了连接符的锁定属性。
    • <p:cxnSp>: 定义了连接符元素。
  7. 幻灯片扩展属性:
    • <p:extLst>: 定义了幻灯片的扩展属性,如创建ID等。
      这个XML片段中的幻灯片包含了一个图片、一个连接符、多个文本框,以及它们的位置、大小和样式信息。幻灯片的内容主要涉及游戏的相关描述和指示。
      基于生成式语言模型构建PPT的过程可以分为以下步骤:

第一步:确定输入

  • 定义输入格式:确定用户将如何提供输入信息,例如,通过一个结构化的表单、自由文本输入、关键词列表或其他方式。
  • 收集用户需求:获取用户对PPT的主题、内容要点、风格、布局等的需求。

第二步:根据输入寻找证据

  • 文本检索:使用输入信息在预定义的文本库、文档或在线资源中搜索相关内容。
  • 数据库查询:如果需要,连接到数据库,根据输入提取相关信息。
  • 知识图谱查询:在知识图谱中寻找与输入相关的实体和关系,以丰富PPT内容。
  • 接口调用:对于需要实时数据的部分,调用外部API或服务接口获取数据。

第三步:生成PPT大纲

  • 构建结构:根据收集到的信息,生成PPT的大纲,包括各部分的标题和副标题。
  • 确定顺序:排列各部分内容的顺序,确保逻辑流畅。

第四步:根据大纲生成内容

  • 生成幻灯片:针对大纲中的每个条目,生成具体的幻灯片内容。
    • 标题和文本:为每张幻灯片创建标题和文本内容。
    • 图表和数据:如果需要,生成图表和数据可视化内容。
    • 图片和媒体:选择或生成相关的图片和媒体文件。
  • 布局和设计:应用设计模板,确保内容的布局和风格一致。

第五步:组装PPT文件

  • 创建XML结构:根据PPTX格式规范,生成相应的XML文件,包括幻灯片内容、母版、主题等。
  • 添加资源:将图片、视频等媒体文件嵌入到PPT中。
  • 建立关系:确保所有文件之间的关系正确无误。

第六步:压缩并重命名文件

  • 压缩文件夹:将所有PPTX组件文件和资源文件夹压缩成一个ZIP文件。
  • 重命名文件:将压缩后的ZIP文件重命名为.pptx格式。

第七步:验证和输出

  • 验证PPTX文件:打开生成的PPTX文件,确保内容正确且格式无误。
  • 输出文件:提供下载链接或直接发送给用户。
    在整个过程中,生成式语言模型可以用于多个环节,如生成文本内容、优化语言表达、建议大纲结构等。此外,为了确保PPT的专业性和准确性,可能还需要人工审核和编辑步骤。

简而言之,基于生成式语言模型构建一套PPT需要的输入主要包括以下几个方面:

  1. 文本内容:这是PPT的核心,包括标题、副标题、正文、备注等。
  2. 结构:PPT的结构包括幻灯片的布局、设计、动画和过渡效果等。
  3. 图片:用于增强幻灯片视觉效果的图片,可以是产品图片、图表、流程图等。
  4. 其他信息:这可能包括演讲者的姓名、职位、组织信息、联系方式等,以及幻灯片的编号、演讲日期等。
    通过分析已有的PPT文件,可以提取上述信息,并利用生成式语言模型来构建新的PPT。模型可以根据提供的文本内容生成结构化的大纲,结合图片和其他信息,生成符合要求的PPT。这种方式可以提高PPT制作的效率,并确保内容的一致性和专业性。
    大模型构建PPT的意义确实可以从多个角度来理解,以下是一些关键点:
  5. 快速生成内容:大模型可以快速理解和生成文本内容,这意味着可以迅速根据用户的需求生成PPT的大纲、段落文本、标题等。
  6. 联动本地接口功能:大型模型可以与本地软件接口(如Office套件、设计软件等)集成,自动填充和格式化内容,从而实现自动化创建PPT。这样的集成可以:
    • 自动提取和整合数据:例如,从数据库或API中提取最新的销售数据、市场报告等,并直接生成图表或表格。
    • 实现个性化定制:根据用户的偏好或历史数据,自动选择合适的模板、颜色方案和字体样式。
  7. 参考历史支撑意见:大型模型可以存储和分析大量的历史数据,包括:
    • 以前的成功案例:模型可以学习哪些PPT设计更受欢迎,哪些内容更有效,并据此提供建议。
    • 用户反馈和修改历史:模型可以分析用户对PPT的反馈和修改记录,以改进未来的生成内容。
    • 行业标准和最佳实践:模型可以参考行业标准来生成符合特定行业需求的PPT。
  8. 提高效率:对于需要频繁创建PPT的用户(如市场人员、研究人员、教师等),大模型可以大幅减少手动编辑和设计的时间,从而提高工作效率。
  9. 促进创新:通过快速原型设计和迭代,大模型可以帮助用户尝试不同的内容和布局,从而可能激发新的想法和创新。
  10. 确保一致性:对于大型组织来说,大模型可以帮助确保所有PPT都遵循统一的设计指南和品牌风格。
    大模型构建PPT的能力不仅在于其快速生成内容的能力,还在于其能够整合多种数据源,提供个性化建议,并与现有工具和流程无缝集成,从而提升整个内容创建过程的效率和质量。

对特定领域如民航和烟草开发一套统一规范的PPT汇报生成软件,带来以下几方面的益处:

  1. 标准化报告:软件可以确保所有汇报都遵循行业标准和公司规范,从而提高报告的专业性和一致性。
  2. 减少重复工作:在结构性调整方面,软件可以自动处理模板、格式、图表等重复性任务,让用户专注于内容创作。
  3. 提高效率:自动化的PPT生成可以大幅缩短报告准备时间,特别是对于周期性的汇报,软件可以快速更新数据并生成新的报告。
  4. 降低错误率:手动制作PPT报告时,数据输入错误或格式不一致的情况时有发生。自动化软件可以减少这类错误。
  5. 易于培训和实施:统一的软件界面和流程使得新员工更容易上手,减少了培训成本和时间。
    以下是针对民航和烟草领域,一套统一规范的PPT汇报生成软件功能:
  • 数据集成:软件能够从不同的数据源(如航班管理系统、销售数据库等)提取数据,并自动生成图表和表格。
  • 模板库:提供多种预设计的模板,适用于不同的汇报场景,如日常运营报告、财务分析、市场动态等。
  • 自定义模块:允许用户根据需要添加自定义模块,如特定于烟草行业的市场分析或民航的安全报告。
  • 自动化分析:软件能够进行基本的数据分析,如趋势分析、同比环比等,并自动生成分析结论。
  • 权限管理:确保不同级别的用户能够访问和编辑相应的报告部分,保护敏感信息。
  • 审阅和批准流程:集成审阅和批准流程,确保报告在发布前经过必要的审核。
  • 云存储和共享:报告可以存储在云端,便于团队成员共享和协作。
  • 多语言支持:考虑到民航和烟草行业的国际化特点,软件应支持多语言报告生成。
    通过实施这样一套软件,民航和烟草领域的企业不仅可以提高汇报的效率和质量,还能够更好地应对行业内的结构性调整和快速变化的市场需求。

那么接下来我们请出今天的辅助工具

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE_TYPE
from pptx.util import Emu
from pptx.parts.image import ImagePart
import warnings

def emu_to_cm(emu):
    """将EMU单位转换为厘米"""
    try:
        return round(Emu(emu).cm, 2)
    except TypeError:
        return 0.0

def safe_get_image(shape):
    """安全获取图片对象(增强版)"""
    try:
        # 验证是否为有效图片部件
        if not hasattr(shape, 'image'):
            return None
        
        # 绕过可能引发异常的属性直接访问
        image_part = shape.part.related_part(shape._element.blip_rId)
        if not isinstance(image_part, ImagePart):
            return None
        
        return {
            "content_type": image_part.content_type,
            "blob": image_part.blob,
            "filename": image_part.filename,
            "dpi": (getattr(image_part, 'horz_dpi', None), 
                    getattr(image_part, 'vert_dpi', None))
        }
    except Exception as e:
        warnings.warn(f"图片解析失败: {str(e)}")
        return None

def extract_ppt_info(ppt_path):
    """提取PPT完整结构信息(最终修复版)"""
    prs = Presentation(ppt_path)
    presentation_data = []
    
    for slide_num, slide in enumerate(prs.slides, 1):
        slide_info = {
            "slide_number": slide_num,
            "layout": str(slide.slide_layout.name),
            "shapes": [],
            "placeholders": [],
            "notes": slide.notes_slide.notes_text_frame.text if slide.has_notes_slide else ""
        }

        # 提取占位符信息
        for placeholder in slide.placeholders:
            ph_info = {
                "type": "placeholder",
                "id": placeholder.placeholder_format.idx,
                "ph_type": str(placeholder.placeholder_format.type),
                "text": placeholder.text if placeholder.has_text_frame else ""
            }
            slide_info["placeholders"].append(ph_info)

        # 遍历所有形状
        for shape in slide.shapes:
            try:
                shape_info = {
                    "id": shape.shape_id,
                    "name": shape.name,
                    "type": "unknown",
                    "position": {
                        "left_cm": emu_to_cm(shape.left),
                        "top_cm": emu_to_cm(shape.top)
                    },
                    "size": {
                        "width_cm": emu_to_cm(shape.width),
                        "height_cm": emu_to_cm(shape.height)
                    },
                    "content": {}
                }

                # 处理文本框
                if shape.has_text_frame:
                    shape_info["type"] = "textbox"
                    text_content = []
                    
                    for paragraph in shape.text_frame.paragraphs:
                        para_data = {
                            "alignment": str(paragraph.alignment),
                            "runs": []
                        }
                        
                        for run in paragraph.runs:
                            font = run.font
                            run_info = {
                                "text": run.text.strip(),
                                "font": {
                                    "name": font.name,
                                    "size": font.size.pt if font.size else None,
                                    "bold": font.bold,
                                    "italic": font.italic,
                                    "color": {
                                        "rgb": font.color.rgb if font.color.type == 1 else None,
                                        "theme": font.color.theme_color if font.color.type == 2 else None
                                    }
                                }
                            }
                            para_data["runs"].append(run_info)
                        
                        text_content.append(para_data)
                    
                    shape_info["content"] = text_content

                # 处理图片(最终修复方案)
                elif shape.shape_type == MSO_SHAPE_TYPE.PICTURE:
                    image_data = safe_get_image(shape)
                    if image_data:
                        shape_info.update({
                            "type": "picture",
                            "content": {
                                "format": image_data["content_type"],
                                "size": f"{len(image_data['blob'])/1024:.1f}KB",
                                "filename": image_data["filename"],
                                "dpi": image_data["dpi"]
                            }
                        })
                    else:
                        shape_info.update({
                            "type": "picture",
                            "content": {"error": "invalid_image_format"}
                        })

                # 处理表格
                elif shape.has_table:
                    shape_info["type"] = "table"
                    table = shape.table
                    table_data = []
                    
                    for row_idx, row in enumerate(table.rows):
                        row_data = []
                        for cell in row.cells:
                            cell_info = {
                                "row": row_idx,
                                "text": cell.text.strip(),
                                "merge": {
                                    "cols": cell.span_width,
                                    "rows": cell.span_height
                                }
                            }
                            row_data.append(cell_info)
                        table_data.append(row_data)
                    
                    shape_info["content"] = {
                        "dimensions": f"{len(table.rows)}x{len(table.columns)}",
                        "data": table_data
                    }

                # 处理其他形状类型
                else:
                    shape_info["type"] = str(shape.shape_type).split(".")[-1]

                slide_info["shapes"].append(shape_info)

            except Exception as e:
                warnings.warn(f"形状{shape.shape_id}处理失败: {str(e)}")
                slide_info["shapes"].append({
                    "id": shape.shape_id,
                    "error": str(e)
                })

        presentation_data.append(slide_info)
    
    return presentation_data

if __name__ == "__main__":

    import glob

    slides = glob.glob('./pptx/*.pptx')
    len(slides)
    for lide in slides:
        data = extract_ppt_info(lide)
    
        # 打印结构化信息
        import json
        # print(json.dumps(data, indent=2, ensure_ascii=False))
        print(len(json.dumps(data, indent=2, ensure_ascii=False)))

这段代码的主要功能是从 PowerPoint 文件(.pptx)中提取结构化信息,包括幻灯片中的文本、图片、表格等内容,并将其转换为 JSON 格式的数据。以下是对代码的详细解读:

1. 导入模块

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE_TYPE
from pptx.util import Emu
from pptx.parts.image import ImagePart
import warnings
  • Presentation: 用于打开和操作 PowerPoint 文件。
  • MSO_SHAPE_TYPE: 用于识别形状的类型(如文本框、图片、表格等)。
  • Emu: 用于处理 PowerPoint 中的长度单位(EMU)。
  • ImagePart: 用于处理 PowerPoint 中的图片部分。
  • warnings: 用于捕获和处理警告信息。

2. 辅助函数

emu_to_cm(emu)
def emu_to_cm(emu):
    """将EMU单位转换为厘米"""
    try:
        return round(Emu(emu).cm, 2)
    except TypeError:
        return 0.0
  • 该函数将 PowerPoint 中的 EMU 单位转换为厘米(cm),并保留两位小数。
  • 如果传入的值无法转换为 EMU 单位,则返回 0.0
safe_get_image(shape)
def safe_get_image(shape):
    """安全获取图片对象(增强版)"""
    try:
        # 验证是否为有效图片部件
        if not hasattr(shape, 'image'):
            return None
        
        # 绕过可能引发异常的属性直接访问
        image_part = shape.part.related_part(shape._element.blip_rId)
        if not isinstance(image_part, ImagePart):
            return None
        
        return {
            "content_type": image_part.content_type,
            "blob": image_part.blob,
            "filename": image_part.filename,
            "dpi": (getattr(image_part, 'horz_dpi', None), 
                    getattr(image_part, 'vert_dpi', None))
        }
    except Exception as e:
        warnings.warn(f"图片解析失败: {str(e)}")
        return None
  • 该函数用于安全地获取幻灯片中的图片信息。
  • 首先检查形状是否包含图片属性,然后通过 related_part 方法获取图片部件。
  • 如果成功获取图片部件,则返回图片的格式、二进制数据、文件名和 DPI 信息。
  • 如果发生异常,则捕获异常并返回 None,同时发出警告。

3. 主函数 extract_ppt_info(ppt_path)

def extract_ppt_info(ppt_path):
    """提取PPT完整结构信息(最终修复版)"""
    prs = Presentation(ppt_path)
    presentation_data = []
    
    for slide_num, slide in enumerate(prs.slides, 1):
        slide_info = {
            "slide_number": slide_num,
            "layout": str(slide.slide_layout.name),
            "shapes": [],
            "placeholders": [],
            "notes": slide.notes_slide.notes_text_frame.text if slide.has_notes_slide else ""
        }

        # 提取占位符信息
        for placeholder in slide.placeholders:
            ph_info = {
                "type": "placeholder",
                "id": placeholder.placeholder_format.idx,
                "ph_type": str(placeholder.placeholder_format.type),
                "text": placeholder.text if placeholder.has_text_frame else ""
            }
            slide_info["placeholders"].append(ph_info)

        # 遍历所有形状
        for shape in slide.shapes:
            try:
                shape_info = {
                    "id": shape.shape_id,
                    "name": shape.name,
                    "type": "unknown",
                    "position": {
                        "left_cm": emu_to_cm(shape.left),
                        "top_cm": emu_to_cm(shape.top)
                    },
                    "size": {
                        "width_cm": emu_to_cm(shape.width),
                        "height_cm": emu_to_cm(shape.height)
                    },
                    "content": {}
                }

                # 处理文本框
                if shape.has_text_frame:
                    shape_info["type"] = "textbox"
                    text_content = []
                    
                    for paragraph in shape.text_frame.paragraphs:
                        para_data = {
                            "alignment": str(paragraph.alignment),
                            "runs": []
                        }
                        
                        for run in paragraph.runs:
                            font = run.font
                            run_info = {
                                "text": run.text.strip(),
                                "font": {
                                    "name": font.name,
                                    "size": font.size.pt if font.size else None,
                                    "bold": font.bold,
                                    "italic": font.italic,
                                    "color": {
                                        "rgb": font.color.rgb if font.color.type == 1 else None,
                                        "theme": font.color.theme_color if font.color.type == 2 else None
                                    }
                                }
                            }
                            para_data["runs"].append(run_info)
                        
                        text_content.append(para_data)
                    
                    shape_info["content"] = text_content

                # 处理图片(最终修复方案)
                elif shape.shape_type == MSO_SHAPE_TYPE.PICTURE:
                    image_data = safe_get_image(shape)
                    if image_data:
                        shape_info.update({
                            "type": "picture",
                            "content": {
                                "format": image_data["content_type"],
                                "size": f"{len(image_data['blob'])/1024:.1f}KB",
                                "filename": image_data["filename"],
                                "dpi": image_data["dpi"]
                            }
                        })
                    else:
                        shape_info.update({
                            "type": "picture",
                            "content": {"error": "invalid_image_format"}
                        })

                # 处理表格
                elif shape.has_table:
                    shape_info["type"] = "table"
                    table = shape.table
                    table_data = []
                    
                    for row_idx, row in enumerate(table.rows):
                        row_data = []
                        for cell in row.cells:
                            cell_info = {
                                "row": row_idx,
                                "text": cell.text.strip(),
                                "merge": {
                                    "cols": cell.span_width,
                                    "rows": cell.span_height
                                }
                            }
                            row_data.append(cell_info)
                        table_data.append(row_data)
                    
                    shape_info["content"] = {
                        "dimensions": f"{len(table.rows)}x{len(table.columns)}",
                        "data": table_data
                    }

                # 处理其他形状类型
                else:
                    shape_info["type"] = str(shape.shape_type).split(".")[-1]

                slide_info["shapes"].append(shape_info)

            except Exception as e:
                warnings.warn(f"形状{shape.shape_id}处理失败: {str(e)}")
                slide_info["shapes"].append({
                    "id": shape.shape_id,
                    "error": str(e)
                })

        presentation_data.append(slide_info)
    
    return presentation_data
  • 该函数是核心功能,用于提取 PowerPoint 文件中的信息。
  • 首先打开 PowerPoint 文件,然后遍历每一张幻灯片。
  • 对于每张幻灯片,提取以下信息:
    • 幻灯片编号、布局、占位符、备注。
    • 遍历幻灯片中的所有形状,包括文本框、图片、表格等,并提取相关信息。
    • 对于文本框,提取文本内容、字体、颜色等信息。
    • 对于图片,提取图片格式、大小、文件名和 DPI 信息。
    • 对于表格,提取表格的行列数、单元格内容等信息。
  • 如果处理过程中发生异常,则捕获异常并记录错误信息。

4. 主程序

if __name__ == "__main__":

    import glob

    slides = glob.glob('./pptx/*.pptx')
    len(slides)
    for lide in slides:
        data = extract_ppt_info(lide)
    
        # 打印结构化信息
        import json
        # print(json.dumps(data, indent=2, ensure_ascii=False))
        print(len(json.dumps(data, indent=2, ensure_ascii=False)))
  • 该部分代码用于测试 extract_ppt_info 函数。
  • 使用 glob 模块查找指定目录下的所有 .pptx 文件。
  • 对于每个 PowerPoint 文件,调用 extract_ppt_info 函数提取信息,并将结果转换为 JSON 格式。
  • 最后打印 JSON 数据的长度(字符数)。

总结

这段代码的主要功能是从 PowerPoint 文件中提取结构化信息,并将其转换为 JSON 格式。代码通过处理幻灯片中的文本框、图片、表格等内容,生成了一个包含详细信息的 JSON 对象。该代码可以用于自动化处理 PowerPoint 文件,提取其中的内容用于进一步分析或处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值