Python-pptx 遍历PPT幻灯片时删除符合条件的slide页

需求场景

一堆PPT幻灯片中某些页面上含有某个图片Logo,如果有Logo要删除这一页,由于文件比较多,一个一个找费鼠标,也费眼睛,于是妹子来找我,让我给她想办法,给她省点力气,没什么难得到我。

功能分析

 抽取图片样本,应用python-ppt 定位符合条件的图片(上一讲我写了如何查找PPT中指定的图片,在这里:python-pptx 操作PPTx幻灯片文件删除并替换图片_锐昆的博客-CSDN博客​​​​),定位该幻灯片再删除它即可,说得容易,做起来坑一堆,在网上找的一些都是删除最后一页,或者第一页,有固定索引值的,而我这里索引是随机的,遍历的时候删除某一页,进入到下一页的时候 需要删除,这时候给出的索引与删除操作的索引对不上,坑大大的。

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)

这样不再受索引的影响了。

看看运行结果~!成功删除

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锐昆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值