场景需求
妹子找我说目录下有一堆的PPT文件,格式有ppt,pptx,大概几千上万个的,里面有个烦人的Logo ,而且位置不一样,需要删除,更换成指定的Logo图片,人工去搞麻烦死了。
技术分析
格式不统一是比较麻烦,目前掌握的python-pptx 只能操作pptx文件,找妹子说能否统一升级到pptx,答说是没问题,那就稍微好办一点了,遍历目录,利用 win32com 来进行格式转换,再用python-pptx 操作删除指定的图片logo,百度,bing 网上搜了一下,只有添加shape文本元素的案例,并没有找到删除操作的例子,更别说替换图片了。
经过查看官方API文档(python-pptx — python-pptx 0.6.21 documentation)和不断尝试摸索,终于实现了 删除旧替换图片的功能。
实现要点
第一、遍历目录ppt2pptx格式转换
import win32com.client
app = win32com.client.Dispatch('PowerPoint.Application')
app.Visible = True
app.DisplayAlerts = False
ppt = app.Presentations.Open("课件工坊-长征组歌.ppt")
..遍历目录逻辑代码自行补充吧,转换格式核心用到win32com,另外电脑要安装能处理PPT的软件,如Powerpoint
第二、提取样本图片指纹
import hashlib
imageFile = open("课件工坊Logo.png", "rb")
imgBlob = imageFile.read()
md5finger = hashlib.md5(imgBlob).hexdigest()
print(md5finger)
旧ppt文件另存出来的需要替换的logo
第三、查找并删除,同样位置插入新图片
def replace_pic4shapes(filename, newpic, oldpic):
# 把旧样本图片Logo,获取指纹
imageFile = open(oldpic, "rb")
imgBlob = imageFile.read()
md5finger = hashlib.md5(imgBlob).hexdigest()
prs = Presentation(filename)
for slide in list(prs.slides)[0:]:
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)
pass
prs.save("课件工坊-长征组歌新文件.pptx")
后记,可以补充加入:如果原来logo旋转了,可以加入对插入图片的旋转的功能