既然占位符是形状,我们可以通过遍历一张幻灯片上所有的Shape的方式获取占位符,代码如下:
from pptx import Presentation
ppt = Presentation()
slide = ppt.slides.add_slide(ppt.slide_layouts[0])
for shape in slide.shapes:
print(type(shape),shape.shape_type)
# 输出:
# <class 'pptx.shapes.placeholder.SlidePlaceholder'>PLACEHOLDER (14)
# <class 'pptx.shapes.placeholder.SlidePlaceholder'>PLACEHOLDER (14)
上面的代码中使用第0个布局新建一个幻灯片页面,用PPT软件打开看看,第0个布局会有两个文本框,这两个文本框都是占位符,我们自然可以通过Slide对象的shapes属性获取到,这里的每一个占位符都是一个SlidePlaceholder对象,然后访问一下该对象的shape_type属性,可以知道它们的形状类型是PLACEHOLDER。
上面的方式是遍历了所有形状才拿到了占位符,但我们知道并不是所有的形状都是占位符,仅仅通过一个shape_type属性也不好区分啊,毕竟我们对这些枚举值并不是很熟。python-pptx也想到了这一点,所以它在形状对象中提供了一个is_placeholder属性判断该形状是否占位符,代码如下:
from pptx import Presentation
ppt = Presentation()
slide = ppt.slides.add_slide(ppt.slide_layouts[0])
for shape in slide.shapes:
print(shape.is_placeholder) # 输出:True
我们要获取占位符就要先获取形状,再进行判断是否占位符,可能python-pptx觉得这个步骤有点烦琐,所以它在Slide对象上提供了一个placeholders属性,我们访问该属性就能拿到所有占位符,代码如下:
from pptx import Presentation
ppt = Presentation()
slide = ppt.slides.add_slide(ppt.slide_layouts[8])
for placeholder in slide.placeholders:
print(placeholder.shape_type,placeholder.name)
# 输出:
# PLACEHOLDER (14) Title 1
# PLACEHOLDER (14) Picture Placeholder 2
# PLACEHOLDER (14) Text Placeholder 3
上面的代码中,为了方便演示,我使用了索引为8的布局,它有三个不同的占位符,分别是标题、图片和正文,通过访问Slide的placeholders属性也确实顺利拿到了该页面的所有占位符。