需求场景
一堆PPT幻灯片中某些页面上含有某个图片Logo,如果有Logo要删除这一页,由于文件比较多,一个一个找费鼠标,也费眼睛,于是妹子来找我,让我给她想办法,给她省点力气,没什么难得到我。
功能分析
抽取图片样本,应用python-ppt 定位符合条件的图片(上一讲我写了如何查找PPT中指定的图片,在这里:python-pptx 操作PPTx幻灯片文件删除并替换图片_锐昆的博客-优快云博客),定位该幻灯片再删除它即可,说得容易,做起来坑一堆,在网上找的一些都是删除最后一页,或者第一页,有固定索引值的,而我这里索引是随机的,遍历的时候删除某一页,进入到下一页的时候 需要删除,这时候给出的索引与删除操作的索引对不上,坑大大的。
from pptx import Presentation
prs = Presentation('./temp.pptx')
# 查看一共几页
slides = prs.slides
number_pages = len(slides)
print(number_pages)
# 删除最后一页
rId = prs.slides._sldIdLst[-1].rId
prs.part.drop_rel(rId)
del prs.slides._sldIdLst[-1]
# 保存新的ppt
prs.save('./new.pptx')
只能换一种思路,采用文档的Element lxml xpath 定位在list中移除它们,不再采用索引了。
新的方式lxml xpath
from pptx import Presentation
import hashlib
import sys
# 把旧样本图片Logo,获取指纹
imageFile = open("课件工坊-PPT模板", "rb")
md5finger = hashlib.md5(imageFile.read()).hexdigest()
prs = Presentation(filename)
for idx, slide in enumerate(prs.slides):
kill_page= True
for shape in list(slide.shapes):
ispicture= False
try:
md5img = hashlib.md5(shape.image.blob).hexdigest()
ispicture = True
except:
pass
e = shape.element
if ispicture:
if md5img == md5finger:
slide.shapes.add_picture(newpic, shape.left,
shape.top, shape.width, shape.height)
e.getparent().remove(e)
print('------>删除替换图片 %s' %(shape.name))
kill_page = False
else:
pass
if kill_page:
#关键代码这里,不按索引进行删除,而是按xpath
slis = (prs.slides._sldIdLst)
_self = slis.xpath("p:sldId[@id='"+ str(slide.slide_id)+"']")[0]
slis.remove(_self)
prs.save("保存结果.pptx")
注意: 关键代码这里,不按索引进行删除,而是按xpath
slis = (prs.slides._sldIdLst)
_self = slis.xpath("p:sldId[@id='"+ str(slide.slide_id)+"']")[0]
slis.remove(_self)
这样不再受索引的影响了。
看看运行结果~!成功删除