占位符的作用不就是等待被内容填充吗?现在我们已经能获取到占位符并且知道怎么判断它们的类型了,那就顺便把它填充了呗。填充之前首先要判断该占位符是哪种类型,不要填错了,比如说是文本类型的就填充文本,图片类型的就填充图片,代码如下:
from pptx import Presentation
from pptx.enum.shapes import PP_PLACEHOLDER_TYPE
ppt = Presentation()
slide = ppt.slides.add_slide(ppt.slide_layouts[8])
for placeholder in slide.placeholders:
phf = placeholder.placeholder_format
if phf.type == PP_PLACEHOLDER_TYPE.TITLE:
placeholder.text = "这是标题"
elif phf.type == PP_PLACEHOLDER_TYPE.BODY:
placeholder.text = "这是正文"
ppt.save("./ppt_ files/test.pptx")
Shape对象有一个text属性是用来控制形状的文本内容的,我们可以直接给它赋值达到填充文本的目的,但是要注意,即使该Shape不是文本类型的占位符,也可以使用文本进行填充,但不太推荐,填充对应的类型可以避免给自己带来不必要的麻烦,上面的代码判断了是TITLE和BODY这两种占位符类型才修改text属性。还需要特别注意,text属性只能接收字符串类型的数据,如果是整型或者其他类型的数据,应该先将数据强转成字符串类型再赋值,不然是会报错的。
如果占位符是图片类型,那它会是一个PicturePlaceholder对象,想要填充图片,可以直接调用insert_picture()方法,把图片路径传进去就可以了,代码如下:
from pptx import Presentation
from pptx.enum.shapes import PP_PLACEHOLDER_TYPE
ppt = Presentation()
slide = ppt.slides.add_slide(ppt.slide_layouts[8])
for placeholder in slide.placeholders:
phf = placeholder.placeholder_format
if phf.type == PP_PLACEHOLDER_TYPE.PICTURE:
picture = placeholder.insert_picture("./ppt_ files/images/
test.jpg")
ppt.save("./ppt_ files/test.pptx")
当占位符的长宽比例固定的时候,用一张图片去填充它,如果图片的长宽比例与占位符的比例不匹配,则它会在保持图片长宽比(让图片不被拉伸)的前提下,默认适配图片的最短边尽可能展示更多图片像素,这也意味着图片多余的部分会被裁减掉。如果你想手动控制被裁减的部分,可以调用PicturePlaceholder对象的crop_left()、crop_right()、crop_top()、crop_bottom()这四个方法,分别表示图片左边、右边、上边、下边被裁减掉的比例,比如说我们把图片的上边和下边都裁掉10%,左边和右边都裁掉20%,代码如下:
from pptx import Presentation
from pptx.enum.shapes import PP_PLACEHOLDER_TYPE
ppt = Presentation()
slide = ppt.slides.add_slide(ppt.slide_layouts[8])
for placeholder in slide.placeholders:
phf = placeholder.placeholder_format
if phf.type == PP_PLACEHOLDER_TYPE.PICTURE:
picture = placeholder.insert_picture("./ppt_ files/images/
test.jpg")
picture.crop_left = 0.2
picture.crop_right = 0.2
picture.crop_top = 0.1
picture.crop_bottom = 0.1
ppt.save("./ppt_ files/test.pptx")
除了图片类型的占位符,其实还有其他的几种类型,比如说表示表格类型的TablePlaceholder、表示图表类型的ChartPlaceholder等,但由于我们现在还没学到如何添加和操作表格和图表,所以暂时先不做演示,后面会进行补充。