在一个幻灯片页面插入一张图片的方法除了前面学过的填充占位符,还可以像插入表格和图表那样指定图片的位置和宽高,那就需要调用SlideShapes对象的add_picture()方法了,该方法的第一个参数是图片路径,后面四个参数是位置和宽高,我们已经接触过这几个参数很多次了,只要是插入形状基本上都会用到left、top、width和height这四个参数。值得注意的是,如果插入图片的时候不设置宽高参数则会以图片本身的尺寸显示,如果只指定了宽(或高),则会自动计算高(或宽)保持图片不变形,即等比缩放,代码如下:
from pptx import Presentation
from pptx.util import Cm
ppt = Presentation()
slide = ppt.slides.add_slide(ppt.slide_layouts[6])
path = "./ppt_ files/images/test.jpg"
top = left = Cm(3)
width = Cm(20)
height = Cm(10)
picture = slide.shapes.add_picture(path,top,left,width,height)
ppt.save("./ppt_ files/test.pptx")
如果想要把一个PPT文档里的图片都提取出来也是可以的,这里说一下大概思路。图片属于形状,所以我们肯定要遍历所有页面的所有形状,然后判断形状对象是否为图片对象。
要注意的是,我们插进来的图片是Picture对象,但别忘了占位符里也可能有图片,占位符里的图片是PlaceholderPicture对象,如果发现还有其他类型的图片,就用type()函数判断具体类型。一般来说图片都是Picture对象或者继承了Picture对象,从源码中可以看出它有一个image属性,访问它能得到一个Image对象,再访问Image对象的blob属性,就能得到图片的二进制数据了,然后通过open()函数将二进制数据写到硬盘上就行。
至于保存的文件名就不是重点了,我这里使用的是形状的name属性作为文件名,它是不会重复出现的,所以保存的图片不会相互覆盖。
有了上面的思路,我们就可以动手写代码了,但如果不看源码的话,这好像有些许难度。可以参考下方的代码,代码里写了注释,如果你想提高自己的编程水平就尽量把整个过程弄清楚吧:
from pptx import Presentation
from pptx.shapes.picture import Picture
from pptx.shapes.placeholder import PlaceholderPicture
ppt = Presentation("./ppt_ files/测试文档3_提取图片.pptx")
for slide in ppt.slides:
for shape in slide.shapes:
pic_type = (Picture,PlaceholderPicture)
# 如果不是Picture或Picture的子类,跳过
if not isinstance(shape,pic_type):
continue
# 图片格式,形如"image/jpeg"
content_type = shape.image.content_type
file_type = content_type.split("/")[-1] if content_type
else "jpg"
# 形状名,但有空格,形如"图片3",可以把空格全部替换掉
shape_name = shape.name
shape_name = str(shape_name).replace(" ","")
# 拼接保存路径,形如"./xxx/图片3.jpg"
save_path = f"./ppt_ files/images/{shape_name}.{ file_type}"
# # 获取图片二进制数据
blob = shape.image.blob
# 保存图片
with open(save_path,"wb") as f:
f.write(blob)
不知道你有没有这种需求,就是把一个PPT文档的所有页面都保存为图片。pythonpptx并不能满足这个需求,但我们可以借鉴一下把doc转为docx的思路,PPT软件有将文档另存为图片的操作,所以我们可以使用win32com完成,查阅微软的官方文档,可以知道把全部幻灯片页面都保存为图片的格式类型是17,代码如下:
from win32com import client
app = client.Dispatch('PowerPoint.Application')
app.DisplayAlerts = False
ppt = app.Presentations.Open(r"E:\xxx\测试文档1.pptx",
WithWindow=False)
ppt.SaveAs(r"C:\xxx\ppt页面",17)
ppt.Close()
app.Quit()
上面的代码是把“测试文档1.pptx”这个PPT文档里的全部页面都以jpg的格式保存到“ppt页面”这个文件夹里,文档的路径和保存的路径以实际情况为准,但别忘了要使用绝对路径。