本帖最后由 qzwsa 于 2023-6-20 16:32 编辑
比较简单的功能 ,简单粗暴的直接将当前文件夹下PPT文件按每一页生成图片,再将生成的图片合并成一张长图。
工具下载地址:https://wwzm.lanzouj.com/ityK20zl3qhi
新增优化功能:根据文件名生成对应的文件夹并增加一个批次只处理10文件防止内存溢出保证程序的稳定性。
下载地址 :https://wwzm.lanzouj.com/ibAeg0zld8kd
原代码:
[Python] 纯文本查看 复制代码 # -*- coding: utf-8 -*-
"""
Created on Tue Jun 20 12:53:25 2023
@author: 吾爱-qzwsa
"""
import os
import win32com.client
from PIL import Image
print("本工具20230620发布于吾爱。qzwsa")
def ppt_to_images():
# 判断当前文件夹是否有 PPT 文件
ppt_files = [file_name for file_name in os.listdir() if file_name.endswith(".ppt") or file_name.endswith(".pptx")]
if len(ppt_files) == 0:
print("没有找到 PPT 文件!")
return []
# 启动 PowerPoint 应用程序
app = win32com.client.Dispatch("PowerPoint.Application")
# 存储处理结果的字典
result = {
"ppt_count": 0,
"image_count": 0,
"merged_count": 0
}
# 遍历当前文件夹下的所有 PPT 文件
for file_name in ppt_files:
# 更新 ppt_count
result["ppt_count"] += 1
# 显示当前处理的 PPT 文件名
print(f"正在处理第 {result['ppt_count']} 个 PPT 文件:{file_name}...")
# 打开 PPT 文件
presentation = app.Presentations.Open(os.path.abspath(file_name))
# 存储当前 PPT 文件的所有图片的列表
image_list = []
# 遍历每一页幻灯片
for i, slide in enumerate(presentation.Slides):
# 设置图片输出路径和文件名
image_path = f"{os.path.splitext(file_name)[0]}_{i+1}.jpg"
image_path = os.path.join(os.getcwd(), image_path)
# 另存为图片
slide.Export(image_path, "JPG")
result["image_count"] += 1
# 将图片打开,添加到列表
image = Image.open(image_path)
image_list.append(image)
# 关闭 PPT 文件
presentation.Close()
# 如果当前 PPT 文件没有图片,则不合并图片
if len(image_list) == 0:
continue
# 合并当前 PPT 文件的所有图片
width, height = image_list[0].size
height *= len(image_list)
merged_image = Image.new("RGB", (width, height))
for i, image in enumerate(image_list):
merged_image.paste(image, (0, i * height // len(image_list)))
# 获取当前 PPT 文件名,用于作为合并后大图的文件名的一部分
ppt_name = os.path.splitext(file_name)[0]
merged_image_path = os.path.join(os.getcwd(), f"{ppt_name}-合并图.jpg")
merged_image.save(merged_image_path)
result["merged_count"] += 1
# 关闭 PowerPoint 应用程序
app.Quit()
# 如果没有处理任何 PPT 文件,则返回空列表
if result["ppt_count"] == 0:
return []
# 输出处理结果
print(f"已处理 {result['ppt_count']} 个 PPT,共生成 {result['image_count']} 张图片,合并了 {result['merged_count']} 张大图。")
return [f"{os.path.splitext(file_name)[0]}-合并图.jpg" for file_name in ppt_files if len([slide for slide in win32com.client.Dispatch("PowerPoint.Application").Presentations.Open(os.path.abspath(file_name)).Slides]) > 0]
if __name__ == "__main__":
ppt_to_images()
|