软件介绍
这个软件就是将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("按回车键退出...")