背景
Web项目需要将ppt转换成图片,以便使用浏览器预览。另外宣传时需要长图,可以将ppt快速转换成一张图。
依赖
- ppt转换成图片需要使用到win32com,安装方法: pip install pypiwin32
- 图片拼接成一张图需要使用到PIL(Python Image Library——python的第三方图像处理库)的Image。安装方法:pip install pillow
效果
PPT有3页,生成的图片如下:
自动拼接成一张图:
完整代码
# -*- coding: UTF-8 -*-
import os
import shutil
import win32com
import win32com.client
# from win32com.client import constants
from PIL import Image
# wc = win32com.client.constants
def output_file(ppt_path):
"""
判断文件是否存在并生成图片保存目录
:param ppt_path: ppt文件路径
:return: 文件保存目录
"""
output_path = ""
if os.path.exists(ppt_path):
file_path, full_name = os.path.split(ppt_path) # 将文件路径拆分成路径和文件名(带后缀)
fname, ext = os.path.splitext(full_name)
output_path = os.path.join(file_path, 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_path) # 判断文件是否存在
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)
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):
long_canvas.paste(Image.open(image), box=(0, i * height))
long_canvas.save(os.path.join(last_dir, 'long-image.png')) # 保存长图
if __name__ == '__main__':
# # ppt_path = "test_template.pptx"
cur_path = os.getcwd()
print(cur_path)
ppt_path = os.path.join(cur_path, "test.ppt") # 需要使用绝对路径,否则会报错
long_sign = "y"
ppt2png(ppt_path, long_sign)
ppSaveAsJPG = 17
其他值的含义参见: