# PPT 结构组成
PPT 本质上是一个 ZIP 压缩包,将 PPT 改为 ZIP 之后解压可以看到这些文件:
里面的文件数量会根据幻灯片的内容所有不同,但肯定会有
[Content_Types].xml、.rels、presentation 这些文件,如果 PPT 一页都没有是无法解压缩的
[Content_Types] 文件定义了所有幻灯片里用到的格式和内容,就是提前声明这些内容
<Override PartName="/ppt/slideLayouts/slideLayout1.xml" | |
ContentType="application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml"/> # 声明不同母版的布局 | |
<Override PartName="/ppt/slideMasters/slideMaster1.xml" | |
ContentType="application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml"/> # 声明母版 | |
<Override PartName="/ppt/slides/slide1.xml" | |
ContentType="application/vnd.openxmlformats-officedocument.presentationml.slide+xml"/> # 声明每一页幻灯片 |
Relationships 标签它是为了方便各种资源的的引用,格式为:
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml" /> |
Id 就是在其他地方引用的标识符,Type 一般是一个链接,可能是指定类型,Target 就是资源的存放位置,slides、slideMasters、slideLayouts 文件夹下都有一个_rels 的文件夹,presentation.xml 也有对应的 presentation.xml.rels 文件
- Presentation:包含了构成 PPTX 的各种规范、属性、字体、备注、过渡动画等
- Slides:这位更是重量级,它存储的就是每页幻灯片的具体内容,包括动画设置,你有几页幻灯片,那就会有 slide1~n 个 xml 文件
- Slide Master:它包含母版的所有文本、格式等的定义
- Slide Layouts:它包含了幻灯片使用的版式的默认格式,就是母版下的不同布局样式
# 替换背景图
如果要将自己的背景图替换到 PPTX 里作为背景,应该怎么做
-
首先,如果 PPT 里套用了图片、媒体文件等,那么 PPT 目录里就会有一个 media 目录,里面会存放 PPT 套用的图片、媒体文件
-
将我们自己的背景图复制到里面,然后改成不会冲突的名字
-
改背景图不需要修改 slideLayouts 里面的东西,只需要修改 slides 目录,也就是每页幻灯片对应的文件
-
里面一共有 slide1~18 个 xml,也就是有 18 页
-
我们将第一页改成自己的背景图,首先在 slides 目录下有一个_rels 的目录
-
它们都定义了每页幻灯片的资源引用关系,打开 slide1.xml.rels
-
然后我们自己新增一个标签,定义一个背景图的引用,Id 一定不要重复
-
我们再修改一下 slide1.xml,给它新增一个背景图设置的标签
基本上就可以了,我们将所有文件打包成 ZIP 再改成 PPTX 后缀名就能打开文件了,背景图已经设置好了,很简单
# 将自己的母版替换为其他 PPT 的母版
替换母版就非常的麻烦了,要改的东西特别多,来看看如何替换
-
先准备一份自己设置好的 PPT 母版,还是以这个 PPT 为例,替换它所有母版为我们的母版
-
暂且称呼 A 为我们的母版 PPT、B 为被替换的 PPT
-
首先分别将 A、B 两个转为 ZIP 解压,然后删除 B 的 slideLayouts、slideMasters 目录下的所有文件,将 A 的 slideLayouts、slideMasters 下的所有文件复制到 B 文件里
- 复制完之后,修改 B 文件的 [Content_Types].xml 文件,它是用来声明的,我们 A 文件里只有 1 个 slideMaster1.xml 文件和 11 个 slideLayout1~11.xml 文件,所有我们要删掉 [Content_Types].xml 里的一些声明
以上这些超过 slideLayouts11 的声明都要删掉,不然你声明了一个不存在的东西,PPT 打开会报异常
还有 4 个 slideMaster 要删掉,因为 A 文件只有一个 slideMaster,其他东西就不需要修改了
- 然后进入 PPT 目录,修改 presentation.xml 文件
将多余的 4 个 sldMasterId 标签删掉,它是告诉 PPT 你有多少个主题,看下图,以双横线分开每个主题
一共有 5 个,但我们复制过来的 slideMaster 主题只有 1 个
- 然后在 PPT 目录下,有一个_rels 目录,里面有一个 presentation.xml.rels 文件,是用来定义 presentation.xml 里面的引用声明的,将多余的 4 个 slideMaster 声明删掉
- 处理完以上步骤之后,将你 A 文件里的 media 目录下的所有媒体文件都复制到 B 文件的 media,我在 B 文件的 media 里创建了一个 other 目录用来存放 A 媒体文件,因为 PPT 的素材命名都是名字加数字,1~n,如果我们 A 文件也有很多媒体文件,直接复制到 B 文件里,你还得改名保证不重复名字,特别麻烦
- 复制完之后,我们进入 slides/_rels 目录,修改 slide.xml.rel 文件
统一改成了 slideLayout1,因为我们 A 的母版布局只有 11 种,而原本 B 的母版是有 18 种的,它可能某一页幻灯片使用了 11 之后的母版布局,不修改的话,打开 PPT 会报异常,如下图
- 然后再修改 slideMaster1.xml 文件
这时候将所有文件打包成 PPT 再打开看看效果如何!
# 原始文件
# 替换母版后的文件
可以看到母版已经改变为了 A 文件的母版样式,包括版式都是 A 文件的,B 文件的母版都被删除了
# A 文件的母版
为了弄清楚如何更换背景图和更换母版,整个过程真的非常的枯燥,我必须每次复制、解压缩文件,然后不断的观察、比较两个 PPT 之间,母版与母版、背景图、资源的声明、调用方式,然后自己尝试着改,每一步修改,再打包成 PPT 去观察一下,不断的测试,最后直到修改为我要的展现形式,最后再以代码形式实现这些步骤,终于在最后看见了成功的模样,也是带有几分小激动!!!