批量将当前文件夹下的PPT生成图片并合并成长图

比较简单的功能 ,简单粗暴的直接将当前文件夹下PPT文件按每一页生成图片,再将生成的图片合并成一张长图。
工具下载地址:

https://wwzm.lanzouj.com/ityK20zl3qhi

新增优化功能:根据文件名生成对应的文件夹并增加

一个批次只处理10文件

防止内存溢出保证程序的稳定性。

下载地址 :

https://wwzm.lanzouj.com/ibAeg0zld8kd

批量将当前文件夹下的PPT生成图片并合并成长图

原代码:

# -*- 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()
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 共46条

请登录后发表评论