第一步我们分析目录 .
├── [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幻灯片的文件内容。从片段中可以解读出以下信息:
- 幻灯片基本属性:
<p:sld>
: 表示这是一个幻灯片元素。<p:cSld>
: 包含幻灯片内容的主要容器。<p:clrMapOvr>
: 定义了幻灯片的颜色映射,通常用于主题和背景。
- 幻灯片内容:
<p:spTree>
: 包含了幻灯片上的所有视觉元素。<p:pic>
: 表示幻灯片上有一个图片元素,其属性包括图片的位置和大小。<p:cxnSp>
: 表示幻灯片上有一个连接符元素,用于连接不同的视觉元素。<p:sp>
: 表示幻灯片上有文本框元素,其中包含了文本内容。
- 文本内容:
<a:t>
: 表示文本内容。<a:r>
: 表示一个段落中的一个文本元素。<a:endParaRPr>
: 表示一个段落的结束属性。<a:rPr>
: 表示文本的格式属性,包括语言、粗体等。
- 幻灯片布局:
<p:nvGrpSpPr>
: 定义了幻灯片的基本布局属性。<p:grpSpPr>
: 定义了组合元素(如图片和文本框)的布局属性。<p:spPr>
: 定义了单个视觉元素的布局属性,包括位置、大小等。<p:xfrm>
: 定义了元素的变换属性,如旋转、缩放等。
- 幻灯片样式:
<p:style>
: 定义了幻灯片的样式属性,包括线条、填充、效果和字体等。<a:schemeClr>
: 定义了颜色方案中的颜色值。<a:shade>
: 定义了颜色的阴影值。
- 幻灯片关系:
<p:nvCxnSpPr>
: 定义了连接符的布局属性。<p:cxnSpLocks>
: 定义了连接符的锁定属性。<p:cxnSp>
: 定义了连接符元素。
- 幻灯片扩展属性:
<p:extLst>
: 定义了幻灯片的扩展属性,如创建ID等。
这个XML片段中的幻灯片包含了一个图片、一个连接符、多个文本框,以及它们的位置、大小和样式信息。幻灯片的内容主要涉及游戏的相关描述和指示。
基于生成式语言模型构建PPT的过程可以分为以下步骤:
第一步:确定输入
- 定义输入格式:确定用户将如何提供输入信息,例如,通过一个结构化的表单、自由文本输入、关键词列表或其他方式。
- 收集用户需求:获取用户对PPT的主题、内容要点、风格、布局等的需求。
第二步:根据输入寻找证据
- 文本检索:使用输入信息在预定义的文本库、文档或在线资源中搜索相关内容。
- 数据库查询:如果需要,连接到数据库,根据输入提取相关信息。
- 知识图谱查询:在知识图谱中寻找与输入相关的实体和关系,以丰富PPT内容。
- 接口调用:对于需要实时数据的部分,调用外部API或服务接口获取数据。
第三步:生成PPT大纲
- 构建结构:根据收集到的信息,生成PPT的大纲,包括各部分的标题和副标题。
- 确定顺序:排列各部分内容的顺序,确保逻辑流畅。
第四步:根据大纲生成内容
- 生成幻灯片:针对大纲中的每个条目,生成具体的幻灯片内容。
- 标题和文本:为每张幻灯片创建标题和文本内容。
- 图表和数据:如果需要,生成图表和数据可视化内容。
- 图片和媒体:选择或生成相关的图片和媒体文件。
- 布局和设计:应用设计模板,确保内容的布局和风格一致。
第五步:组装PPT文件
- 创建XML结构:根据PPTX格式规范,生成相应的XML文件,包括幻灯片内容、母版、主题等。
- 添加资源:将图片、视频等媒体文件嵌入到PPT中。
- 建立关系:确保所有文件之间的关系正确无误。
第六步:压缩并重命名文件
- 压缩文件夹:将所有PPTX组件文件和资源文件夹压缩成一个ZIP文件。
- 重命名文件:将压缩后的ZIP文件重命名为
.pptx
格式。
第七步:验证和输出
- 验证PPTX文件:打开生成的PPTX文件,确保内容正确且格式无误。
- 输出文件:提供下载链接或直接发送给用户。
在整个过程中,生成式语言模型可以用于多个环节,如生成文本内容、优化语言表达、建议大纲结构等。此外,为了确保PPT的专业性和准确性,可能还需要人工审核和编辑步骤。
简而言之,基于生成式语言模型构建一套PPT需要的输入主要包括以下几个方面:
- 文本内容:这是PPT的核心,包括标题、副标题、正文、备注等。
- 结构:PPT的结构包括幻灯片的布局、设计、动画和过渡效果等。
- 图片:用于增强幻灯片视觉效果的图片,可以是产品图片、图表、流程图等。
- 其他信息:这可能包括演讲者的姓名、职位、组织信息、联系方式等,以及幻灯片的编号、演讲日期等。
通过分析已有的PPT文件,可以提取上述信息,并利用生成式语言模型来构建新的PPT。模型可以根据提供的文本内容生成结构化的大纲,结合图片和其他信息,生成符合要求的PPT。这种方式可以提高PPT制作的效率,并确保内容的一致性和专业性。
大模型构建PPT的意义确实可以从多个角度来理解,以下是一些关键点: - 快速生成内容:大模型可以快速理解和生成文本内容,这意味着可以迅速根据用户的需求生成PPT的大纲、段落文本、标题等。
- 联动本地接口功能:大型模型可以与本地软件接口(如Office套件、设计软件等)集成,自动填充和格式化内容,从而实现自动化创建PPT。这样的集成可以:
- 自动提取和整合数据:例如,从数据库或API中提取最新的销售数据、市场报告等,并直接生成图表或表格。
- 实现个性化定制:根据用户的偏好或历史数据,自动选择合适的模板、颜色方案和字体样式。
- 参考历史支撑意见:大型模型可以存储和分析大量的历史数据,包括:
- 以前的成功案例:模型可以学习哪些PPT设计更受欢迎,哪些内容更有效,并据此提供建议。
- 用户反馈和修改历史:模型可以分析用户对PPT的反馈和修改记录,以改进未来的生成内容。
- 行业标准和最佳实践:模型可以参考行业标准来生成符合特定行业需求的PPT。
- 提高效率:对于需要频繁创建PPT的用户(如市场人员、研究人员、教师等),大模型可以大幅减少手动编辑和设计的时间,从而提高工作效率。
- 促进创新:通过快速原型设计和迭代,大模型可以帮助用户尝试不同的内容和布局,从而可能激发新的想法和创新。
- 确保一致性:对于大型组织来说,大模型可以帮助确保所有PPT都遵循统一的设计指南和品牌风格。
大模型构建PPT的能力不仅在于其快速生成内容的能力,还在于其能够整合多种数据源,提供个性化建议,并与现有工具和流程无缝集成,从而提升整个内容创建过程的效率和质量。
对特定领域如民航和烟草开发一套统一规范的PPT汇报生成软件,带来以下几方面的益处:
- 标准化报告:软件可以确保所有汇报都遵循行业标准和公司规范,从而提高报告的专业性和一致性。
- 减少重复工作:在结构性调整方面,软件可以自动处理模板、格式、图表等重复性任务,让用户专注于内容创作。
- 提高效率:自动化的PPT生成可以大幅缩短报告准备时间,特别是对于周期性的汇报,软件可以快速更新数据并生成新的报告。
- 降低错误率:手动制作PPT报告时,数据输入错误或格式不一致的情况时有发生。自动化软件可以减少这类错误。
- 易于培训和实施:统一的软件界面和流程使得新员工更容易上手,减少了培训成本和时间。
以下是针对民航和烟草领域,一套统一规范的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 文件,提取其中的内容用于进一步分析或处理。