给 powerpoint 文档中应用母版页能够为演示文稿提供一致的设计和格式,使得整体外观更加专业。通过母版可以批量修改字体、颜色和布局,减少手动调整每张幻灯片的繁琐工作,提高效率。在本文中,我们将演示如何使用 spire.presentation for python 在 python 中操作 powerpoint 文档里母版页,包括创建并应用母版页、移除未使用母版页、克隆母版页。
安装 spire.presentation for python
本教程需要用到 spire.presentation for python 和 plum-dispatch v1.7.4。可以通过以下 pip 命令将它们轻松安装到 windows 中。
pip install spire.presentation
如果您不确定如何安装,请参考此教程: 如何在 windows 中安装 spire.presentation for python
在 powerpoint 文档中创建并应用母版页
spire.presentation for python 提供了 presentation.masters.appendslide(imasterslide slide) 方法用于给 powerpoint 文档新增母版页;提供了 imasterslide.slides[index].layout 来获取指定的母版页的页面布局。再通过 presentation.slide[index].layout 属性将获取的母版页页面布局设置给指定幻灯片,具体步骤如下:
- 创建 presentation 类的对象。
- 使用 presentation.slidesize.type 属性设置当前 powerpoint 演示文稿的尺寸。
- 通过 presentation.slides.append() 方法给当前 powerpoint 演示文稿添加4张新的幻灯片,加上初始化 presentation 时默认会新增一张幻灯片,此时文档中共有5张幻灯片。
- 通过 presentation.masters[index] 来获取第一个默认幻灯片母版。
- 通过 presentation.masters.appendslide(imasterslide slide) 方法来新增一个幻灯片母版。
- 通过 imasterslide.slidebackground.fill.filltype 来设置幻灯片母版填充类型为图片。
- 通过 imasterslide.shapes.appendembedimagebypath(shapetype shapetype, iimagedata embedimage, rectanglef rectangle) 来把图片读取到第一个幻灯片母版页中。
- 通过 imasterslide.slidebackground.fill.picturefill.picture.embedimage 来设置第一个幻灯片母版的背景图片。
- 重复前面2个步骤为第二个幻灯片母版设置背景图片。
- 通过 imasterslide.slides[index].layout 获取母版页页面布局,并通过 presentation.slide[index].layout 给第一张幻灯片的页面布局设置为第一张幻灯片母版页的页面布局,给第二到五张幻灯片的页面布局设置为第二张幻灯片母版页的页面布局。
- 使用 presentation.savetofile() 方法保存结果演示文稿。
- python
from spire.presentation.common import *
from spire.presentation import *
# 设置输出文件路径
outputfile = "output.pptx"
# 创建一个新的ppt演示文稿对象
ppt = presentation()
# 设置幻灯片尺寸为16:9的屏幕尺寸
ppt.slidesize.type = slidesizetype.screen16x9
# 添加4个空白幻灯片到演示文稿中
for i in range(0, 4):
ppt.slides.append()
# 获取第一个幻灯片母版
first_master = ppt.masters[0]
# 为powerpoint添加第二个母版页
ppt.masters.appendslide(first_master)
second_master = ppt.masters[1]
# 设置两个图片的路径
pic1 = "image/bg.png"
pic2 = "image/setbackground.png"
# 创建一个矩形区域,覆盖整个幻灯片尺寸
rect = rectanglef.fromltrb (0, 0, ppt.slidesize.size.width, ppt.slidesize.size.height)
# 设置第一个幻灯片母版的填充类型为图片
first_master.slidebackground.fill.filltype = fillformattype.picture
# 在第一个幻灯片母版中嵌入背景图片
image1 = first_master.shapes.appendembedimagebypath (shapetype.rectangle, pic1, rect)
# 设置第一个幻灯片母版的背景图片
first_master.slidebackground.fill.picturefill.picture.embedimage = image1.picturefill.picture.embedimage
# 设置第二个幻灯片母版的填充类型为图片
second_master.slidebackground.fill.filltype = fillformattype.picture
# 在第二个幻灯片母版中嵌入背景图片
image2 = second_master.shapes.appendembedimagebypath (shapetype.rectangle, pic2, rect)
# 设置第二个幻灯片母版的背景图片
second_master.slidebackground.fill.picturefill.picture.embedimage = image2.picturefill.picture.embedimage
# 将第一个幻灯片的布局设置为第一个幻灯片母版的第二个子布局
ppt.slides[0].layout = first_master.layouts[1]
# 将剩余的幻灯片布局设置为第二个幻灯片母版的第九个子布局
for i in range(1, ppt.slides.count):
ppt.slides[i].layout = second_master.layouts[8]
# 保存演示文稿到指定的文件路径,使用pptx2013格式
ppt.savetofile(outputfile, fileformat.pptx2013)
# 释放演示文稿资源
ppt.dispose()
在 powerpoint 文档中移除未使用的母版页
对于一个已经制作完成的在 powerpoint 文档,有时会存在一些没有被任何幻灯片使用的母版页,那么如何使用 spire.presentation for python 来删除这些不必要的母版页呢?首先,我们需要把每张幻灯片使用到的页面布局 id 存放进一个名为 layouts 的列表中,接着遍历 powerpoint 文档的所有母版布局,如果当前母版布局的 id 不在列表 layouts 中,则表明当前母版布局没有被使用,调用 imasterlayouts. removemasterlayout 删除当前母版页。具体步骤如下:
- 创建 presentation 类的对象。
- 使用 presentation.loadfromfile() 方法加载一个 powerpoint 演示文稿。
- 遍历 powerpoint 文档中所有幻灯片,通过 presentation.slides[index].layout.slideid 获取当前幻灯片的布局id,并将其添加到一个名为 layouts 的列表中。
- 遍历遍历 powerpoint 文档中所有母版页,通过 presentation.master[index].layouts 获取到当前母版布局的所有子布局集合 imasterlayouts,再遍历这个子布局集合,通过 imasterlayouts[index].slideid 获取当前子布局的 id,并判断该 id 是否在 layouts 这个列表中,如果不在,表明当前母版布局没有被使用,通过 imasterlayouts. removemasterlayout 方法删除当前母版页。
- 使用 presentation.savetofile() 方法保存结果演示文稿。
- python
from spire.presentation.common import *
from spire.presentation import *
# 输入文件路径,指向一个pptx格式的演示文稿
inputfile = "input.pptx"
# 输出文件路径,用于保存处理后的演示文稿
outputfile = "output.pptx"
# 创建一个presentation对象,用于操作powerpoint演示文稿
ppt = presentation()
# 从指定路径加载演示文稿到presentation对象中
ppt.loadfromfile(inputfile)
# 创建一个空列表,用于存储所有幻灯片使用的布局id
layouts = []
# 遍历演示文稿中的所有幻灯片
for i, unuseditem in enumerate(ppt.slides):
# 获取当前幻灯片的布局对象
layout = ppt.slides[i].layout
# 将当前幻灯片的布局id添加到layouts列表中
layouts.append(layout.slideid)
# 遍历演示文稿中的所有母版布局
for i, unuseditem in enumerate(ppt.masters):
# 获取当前母版布局的所有子布局集合
masterlayouts = ppt.masters[i].layouts
# 从后向前遍历子布局集合,以便在删除时不影响索引
for j in range(masterlayouts.count - 1, -1, -1):
# 如果当前子布局的id不在layouts列表中,说明该布局未被使用
if not masterlayouts[j].slideid in layouts:
# 从母版布局中移除未使用的子布局
masterlayouts.removemasterlayout(j)
# 将处理后的演示文稿保存到指定的输出文件路径,使用pptx2013格式
ppt.savetofile(outputfile, fileformat.pptx2013)
# 释放presentation对象的资源
ppt.dispose()
克隆一个 powerpoint 文档中的母版页到另一个 powerpoint 文档中
有时我们需要在演示文稿b中使用演示文稿 a 中定义好的母版页,我们就可以将演示文稿 a 中的母版克隆到演示文稿 b 中,这样就能在演示文稿 b 中使用相应母版页了,具体步骤如下:
- 创建2个 presentation 类的对象,presentation1 和 presentation2。
- 使用 presentation.loadfromfile() 方法来加载2个待操作的 powerpoint 演示文稿。
- 遍历 presentation1 的 powerpoint 文档中所有母版页,再通过 presentation.master.appendslide() 方法将 presentation1 中所有母版页添加到 presentation2 中。
- 使用 presentation.savetofile() 方法保存 presentation2 结果演示文稿。
- python
from spire.presentation.common import *
from spire.presentation.common import *
from spire.presentation import *
# 定义输入文件路径1,指向第一个pptx文件
inputfile_1 = "input/clonemaster1.pptx"
# 定义输入文件路径2,指向第二个pptx文件
inputfile_2 = "input/clonemaster2.pptx"
# 定义输出文件路径,用于保存合并后的pptx文件
outputfile ="output/clonepptmastertoanother.pptx"
# 创建一个presentation对象,用于操作第一个pptx文件
presentation1 = presentation()
# 从文件加载第一个pptx文件的内容到presentation1对象中
presentation1.loadfromfile(inputfile_1)
# 创建另一个presentation对象,用于操作第二个pptx文件
presentation2 = presentation()
# 从文件加载第二个pptx文件的内容到presentation2对象中
presentation2.loadfromfile(inputfile_2)
# 遍历第一个pptx文件中的所有母版幻灯片
for masterslide in presentation1.masters:
# 将每个母版幻灯片添加到第二个pptx文件的母版幻灯片集合中
presentation2.masters.appendslide(masterslide)
# 将合并后的第二个pptx文件内容保存到指定的输出文件中,使用pptx2013格式
presentation2.savetofile(outputfile, fileformat.pptx2013)
# 释放二个pptx文件对象的资源
presentation2.dispose()
presentation1.dispose()
申请临时 license
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用javascript。获取有效期 30 天的临时许可证。