当前位置:  首页>> 技术小册>> Python与办公-玩转PPT

添加图片

在一个幻灯片页面插入一张图片的方法除了前面学过的填充占位符,还可以像插入表格和图表那样指定图片的位置和宽高,那就需要调用SlideShapes对象的add_picture()方法了,该方法的第一个参数是图片路径,后面四个参数是位置和宽高,我们已经接触过这几个参数很多次了,只要是插入形状基本上都会用到left、top、width和height这四个参数。值得注意的是,如果插入图片的时候不设置宽高参数则会以图片本身的尺寸显示,如果只指定了宽(或高),则会自动计算高(或宽)保持图片不变形,即等比缩放,代码如下:

  1. from pptx import Presentation
  2. from pptx.util import Cm
  3. ppt = Presentation()
  4. slide = ppt.slides.add_slide(ppt.slide_layouts[6])
  5. path = "./ppt_ files/images/test.jpg"
  6. top = left = Cm(3)
  7. width = Cm(20)
  8. height = Cm(10)
  9. picture = slide.shapes.add_picture(path,top,left,width,height)
  10. ppt.save("./ppt_ files/test.pptx")

提取图片

如果想要把一个PPT文档里的图片都提取出来也是可以的,这里说一下大概思路。图片属于形状,所以我们肯定要遍历所有页面的所有形状,然后判断形状对象是否为图片对象。

要注意的是,我们插进来的图片是Picture对象,但别忘了占位符里也可能有图片,占位符里的图片是PlaceholderPicture对象,如果发现还有其他类型的图片,就用type()函数判断具体类型。一般来说图片都是Picture对象或者继承了Picture对象,从源码中可以看出它有一个image属性,访问它能得到一个Image对象,再访问Image对象的blob属性,就能得到图片的二进制数据了,然后通过open()函数将二进制数据写到硬盘上就行。

至于保存的文件名就不是重点了,我这里使用的是形状的name属性作为文件名,它是不会重复出现的,所以保存的图片不会相互覆盖。

有了上面的思路,我们就可以动手写代码了,但如果不看源码的话,这好像有些许难度。可以参考下方的代码,代码里写了注释,如果你想提高自己的编程水平就尽量把整个过程弄清楚吧:

  1. from pptx import Presentation
  2. from pptx.shapes.picture import Picture
  3. from pptx.shapes.placeholder import PlaceholderPicture
  4. ppt = Presentation"./ppt_ files/测试文档3_提取图片.pptx"
  5. for slide in ppt.slides:
  6. for shape in slide.shapes:
  7. pic_type = (Picture,PlaceholderPicture)
  8. # 如果不是Picture或Picture的子类,跳过
  9. if not isinstance(shape,pic_type):
  10. continue
  11. # 图片格式,形如"image/jpeg"
  12. content_type = shape.image.content_type
  13. file_type = content_type.split("/")[-1] if content_type
  14. else "jpg"
  15. # 形状名,但有空格,形如"图片3",可以把空格全部替换掉
  16. shape_name = shape.name
  17. shape_name = str(shape_name).replace(" ","")
  18. # 拼接保存路径,形如"./xxx/图片3.jpg"
  19. save_path = f"./ppt_ files/images/{shape_name}.{ file_type}"
  20. # # 获取图片二进制数据
  21. blob = shape.image.blob
  22. # 保存图片
  23. with open(save_path,"wb") as f:
  24. f.write(blob)

页面保存为图片

不知道你有没有这种需求,就是把一个PPT文档的所有页面都保存为图片。pythonpptx并不能满足这个需求,但我们可以借鉴一下把doc转为docx的思路,PPT软件有将文档另存为图片的操作,所以我们可以使用win32com完成,查阅微软的官方文档,可以知道把全部幻灯片页面都保存为图片的格式类型是17,代码如下:

  1. from win32com import client
  2. app = client.Dispatch('PowerPoint.Application')
  3. app.DisplayAlerts = False
  4. ppt = app.Presentations.Open(r"E:\xxx\测试文档1.pptx",
  5. WithWindow=False)
  6. ppt.SaveAsr"C:\xxx\ppt页面",17
  7. ppt.Close()
  8. app.Quit()

上面的代码是把“测试文档1.pptx”这个PPT文档里的全部页面都以jpg的格式保存到“ppt页面”这个文件夹里,文档的路径和保存的路径以实际情况为准,但别忘了要使用绝对路径。