PPT转图片拼贴工具 v3.0

软件介绍

这个软件就是将PPT文件转换为图片并且拼接起来。

这个代码支持导入单个文件也支持导入文件夹

但是目前还没有解决可视化界面问题。

效果展示

软件源码

python 复制代码
import os
import re
import win32com.client
from PIL import Image
from typing import List, Union

def convert_ppt_to_png(ppt_path: str, output_folder: str) -> None:
    """将单个PPT文件转换为PNG图片"""
    try:
        ppt_app = win32com.client.Dispatch("PowerPoint.Application")
    except Exception as e:
        raise RuntimeError(f"无法启动 PowerPoint 应用程序: {e}")
    
    if not os.path.exists(ppt_path):
        raise FileNotFoundError(f"PPT 文件不存在: {ppt_path}")
    
    presentation = ppt_app.Presentations.Open(ppt_path, WithWindow=False)
    presentation.SaveAs(output_folder, 18)  # 18 代表 PNG 格式
    presentation.Close()
    ppt_app.Quit()

def create_collage(input_folder: str, output_folder: str, ppt_name: str, 
                   row_size: int = 3, col_gap: int = 10, row_gap: int = 10) -> None:
    """从PNG图片创建拼贴画"""
    # 获取所有幻灯片图片
    files = os.listdir(input_folder)
    slide_files = [f for f in files if re.match(r"幻灯片\d+\.png", f, re.IGNORECASE)]
    
    if not slide_files:
        raise RuntimeError(f"未找到幻灯片图片文件")
    
    # 按幻灯片序号排序
    slide_files.sort(key=lambda x: int(re.search(r'\d+', x).group()))
    
    # 打开所有图片
    try:
        images = [Image.open(os.path.join(input_folder, f)) for f in slide_files]
    except Exception as e:
        raise RuntimeError(f"加载图片时出错: {e}")
    
    if not images:
        raise RuntimeError("没有可处理的图片")
    
    width, height = images[0].size
    
    # 第一行放大显示封面
    first_img = images[0].resize(
        (width * row_size + col_gap * (row_size - 1), 
         height * row_size + int(col_gap * (row_size - 1) * height / width)), 
        Image.LANCZOS
    )
    
    remaining_images = images[1:]
    
    # 计算画布尺寸
    rows = (len(remaining_images) + row_size - 1) // row_size
    canvas_width = first_img.width
    canvas_height = first_img.height + rows * (height + row_gap)
    
    # 创建拼贴画布
    collage_image = Image.new("RGB", (canvas_width, canvas_height), (255, 255, 255))
    
    # 粘贴封面
    collage_image.paste(first_img, (0, 0))
    
    # 粘贴剩余幻灯片
    for i, img in enumerate(remaining_images):
        row = i // row_size
        col = i % row_size
        x = col * (width + col_gap)
        y = first_img.height + row * (height + row_gap)
        collage_image.paste(img, (x, y))
    
    # 保存拼贴画
    collage_path = os.path.join(output_folder, f"{ppt_name}.png")
    collage_image.save(collage_path)
    
    # 删除临时PNG文件
    for f in slide_files:
        os.remove(os.path.join(input_folder, f))

def process_ppt_item(item_path: str, output_folder: str, 
                    row_size: int = 3, col_gap: int = 10, row_gap: int = 10) -> None:
    """处理单个PPT文件或文件夹"""
    if os.path.isfile(item_path):
        # 处理单个PPT文件
        if item_path.lower().endswith(('.ppt', '.pptx')):
            ppt_filename = os.path.basename(item_path)
            ppt_name = os.path.splitext(ppt_filename)[0]
            
            # 转换PPT为PNG
            convert_ppt_to_png(item_path, output_folder)
            
            # 创建拼贴画
            create_collage(output_folder, output_folder, ppt_name, row_size, col_gap, row_gap)
            
            print(f"✓ 处理完成: {ppt_name}.png")
        else:
            print(f"⚠️ 跳过非PPT文件: {os.path.basename(item_path)}")
    elif os.path.isdir(item_path):
        # 处理文件夹
        print(f"处理文件夹: {item_path}")
        for filename in os.listdir(item_path):
            file_path = os.path.join(item_path, filename)
            if file_path.lower().endswith(('.ppt', '.pptx')):
                process_ppt_item(file_path, output_folder, row_size, col_gap, row_gap)
    else:
        print(f"⚠️ 路径不存在或无法访问: {item_path}")

if __name__ == "__main__":
    # 用户配置区域
    input_path = r'D:\Desktop\文件存储\1'  # 可以是文件或文件夹路径
    output_folder = r'D:\Desktop\文件存储\1'  # 输出文件夹路径
    row_size = 3  # 每行图片数量
    col_gap = 10  # 列间距(像素)
    row_gap = 10  # 行间距(像素)
    
    # 确保输出文件夹存在
    os.makedirs(output_folder, exist_ok=True)
    
    print("开始处理PPT文件...")
    process_ppt_item(input_path, output_folder, row_size, col_gap, row_gap)
    
    print("\n全部处理完成!")
    input("按回车键退出...")    

源码下载

https://pan.quark.cn/s/100eea4e778f

相关推荐
猪在黑魔纹里5 小时前
解决VSCode无法高亮、解析numpy中的部分接口(如pi、deg2rad)
ide·vscode·python·numpy
爱笑的眼睛115 小时前
文本分类的范式演进:从统计概率到语言模型提示工程
java·人工智能·python·ai
星川皆无恙5 小时前
基于知识图谱+深度学习的大数据NLP医疗知识问答可视化系统(全网最详细讲解及源码/建议收藏)
大数据·人工智能·python·深度学习·自然语言处理·知识图谱
Tipriest_6 小时前
旋转矩阵,齐次变换矩阵,欧拉角,四元数等相互转换的常用代码C++ Python
c++·python·矩阵
周杰伦_Jay6 小时前
【Go/Python/Java】基础语法+核心特性对比
java·python·golang
小鹿学程序6 小时前
jdk配置完之后java -version还是默认的jdk版本如何更改
java·开发语言·python
Pyeako6 小时前
Python数据可视化--matplotlib库
python·matplotlib·数据可视化·画图·pylab
m0_704887896 小时前
Day 35
python·深度学习·机器学习
华研前沿标杆游学6 小时前
参观深圳比亚迪总部,探索科技,感受中国“智”造魅力
python
爱打代码的小林6 小时前
python基础(逻辑回归例题)
开发语言·python·逻辑回归