最近因为某些需求需要将PPT转换为图片并合并成预览图,于是第一时间就想到了用python解决问题,过程中参考了一位老哥写的文章,链接如下。
Python行家:用Python实现ppt转化图片(附带长图合并功能)zhuanlan.zhihu.com功能的实现很简单 ,分两步,第一步:将PPT转换为图片格式;第二步:将图片合并生成预览图。
PPT转换为图片:
老哥使用了win32com库来操作com组件,笔者使用comtypes库以实现同样功能。
pip3 install comtypes -i https:// pypi.tuna.tsinghua.edu.cn /simple
主要代码如下:
def ppt2png(filePath,picture_path):
fileNames = glob.glob(picture_path + r'*')
for fileName in fileNames:
os.remove(fileName)
powerpoint = comtypes.client.CreateObject("kwpp.Application") #使用wps的接口
ppt = powerpoint.Presentations.Open(filePath)
# 另存为
ppt.SaveAs(picture_path + '.jpg', 17)
# 退出
ppt.Close()
powerpoint.Quit()
图片合并生成预览图:
使用PIL库,由于PIL仅支持至2.7版本,3.X以上版本需使用pillow。
pip3 install pillow -i https:// pypi.tuna.tsinghua.edu.cn /simple
上面老哥的代码是把所有图片合并成一列,这样会显得图很长,我要的是按3列进行合并,实现起来也很简单,一个取模运算和一个向下取整运算解决问题,于是在他的代码上进行了一下修改:
def generate_long_image(picture_path,preview_name):
last_dir = os.path.dirname(picture_path) # 上一级文件目录
ppl = os.listdir(picture_path)
ppl.sort(key=lambda x: int(x.replace("幻灯片","").split('.')[0]))
print(ppl)
ims = [Image.open(os.path.join(picture_path, fn)) for fn in ppl if fn.endswith('.jpg')]
width, height = ims[0].size # 取第一个图片尺寸
long_canvas = Image.new(ims[0].mode, (width*3, height * math.ceil(len(ims)/3))) # 创建3倍宽,n/3高的白图片
for i, image in enumerate(ims):
j = i%3
k = math.floor(i/3)
long_canvas.paste(image, (j * width, k * height))
long_canvas.save(os.path.join(last_dir, preview_name+'.png')) # 保存长图
最终的效果: