不知道小伙伴们有没有用PPT做过海报,然后需要将PPT导出成图片,在画图工具里再拼接成长图,如果PPT的页数很多,需要耗费一些时间,以下脚本可以自动将PPT拼接成一个长图。
1、参数1输入绝对路径,参数2输出带后缀的文件名称。
2、生成的长图会直接生成在和ppt所在的同级目录。
3、同时会生成一个和ppt名称一样的目录,用于存放每页ppt的图片。
PS:需要注意的是,PPT每页里的内容需要按设计铺满整页PPT,脚本不会自动识别裁剪哦~
****文章最后我放了一个拼接的海报效果图****
# -*- coding: UTF-8 -*-
# Auther: youren.S
import os
import shutil
import win32com
import win32com.client
# from win32com.client import constants
from PIL import Image
ppt_dir = input(r"输入PPT所在目录的绝对路径:")
ppt_file = input(r"输入PPT文件名称,含后缀(如ppt&pptx):")
ppt_name1,ppt_name2 = ppt_file.split(".")
file_ext = os.path.splitext(ppt_file)[1]
# 判断文件后缀
if file_ext == ".ppt" or file_ext == ".pptx":
print("="*60)
else:
print("请检查文件后缀是否正确。")
ppt_dirfile = ppt_dir + '/' + ppt_file
print(ppt_dirfile)
# wc = win32com.client.constants
def output_file(ppt_path):
"""
判断文件是否存在并生成图片保存目录
:param ppt_path: ppt文件路径
:return: 文件保存目录
"""
output_path = ""
if os.path.exists(ppt_path):
fname, ext = os.path.splitext(ppt_file)
output_path = os.path.join(ppt_dir, fname)
if os.path.isdir(output_path):
shutil.rmtree(output_path)
os.mkdir(output_path)
return output_path
def ppt2png(ppt_path, long_sign: str):
"""
ppt 转 png 方法
:param ppt_path: ppt 文件的绝对路径
:param long_sign: 是否需要转为生成长图的标识
:return:
"""
if os.path.exists(ppt_path):
output_path = output_file(ppt_dirfile) # 判断文件是否存在
ppt_app = win32com.client.Dispatch('PowerPoint.Application')
# 设置为0表示后台运行,不显示,1则显示
ppt_app.Visible = 1
ppt = ppt_app.Presentations.Open(ppt_path) # 打开 ppt
ppSaveAsJPG = 17
ppt.SaveAs(output_path, ppSaveAsJPG) # 17表示 ppt 转为图片
ppt_app.Quit() # 关闭资源,退出
if 'Y' == long_sign.upper():
generate_long_image(output_path) # 合并生成长图
else:
raise Exception('请检查文件是否存在!\n')
def generate_long_image(output_path):
"""
将ppt的各个页面拼接成长图
:param output_path:
:return:
"""
picture_path = output_path
last_dir = os.path.dirname(picture_path) # 上一级文件目录
# 获取图片列表
# ims = [Image.open(os.path.join(picture_path, fn)) for fn in os.listdir(picture_path) if fn.endswith('.jpg')]
ims = []
for fn in os.listdir(picture_path):
if fn.lower().endswith('.jpg'):
ims.append(os.path.join(picture_path, fn))
# print(ims)
# 将获取到ppt的页面进行排序
ims_sort = sorted(ims, key=lambda jpg: len(jpg))
# print(ims_sort)
width, height = Image.open(ims[0]).size # 取第一个图片尺寸
long_canvas = Image.new(Image.open(ims[0]).mode, (width, height * len(ims))) # 创建同宽,n倍高的空白图片
# 拼接图片
for i, image in enumerate(ims_sort):
long_canvas.paste(Image.open(image), box=(0, i * height))
long_canvas.save(os.path.join(last_dir, ppt_name1+'.png')) # 保存长图
if __name__ == '__main__':
# # ppt_path = "test_template.pptx"
cur_path = os.getcwd()
print(cur_path)
ppt_path = os.path.join(cur_path, ppt_dirfile) # 需要使用绝对路径,否则会报错
long_sign = "y"
ppt2png(ppt_path, long_sign)
效果图如下: