每年一度的家长会,老师们总要准备 PPT。尤其是小学和幼儿园,展示孩子的成长照片是必不可少的环节。如果照片不多还好,手动一张张插入,加上文件名说明也勉强可以接受。但如果照片数量庞大,例如几百张,而且要求按照文件名排序,并区分横版和竖版照片,手动操作简直是噩梦。更别说还要调整照片大小,保证美观,还要让 PPT 页面比例符合 16:9 的标准。本文将使用 Python 快速批量制作 16:9 PPT相册,解决这个棘手的问题,将文件名直接添加到幻灯片中,并根据照片方向进行排版。
底层原理:Python 操作 PPT 的奥秘
要用 Python 操作 PPT,我们需要用到 python-pptx 库。这个库是对 PowerPoint 文件格式的封装,我们可以通过它来创建、修改 PPT 文件。它允许我们添加幻灯片、插入图片、设置文本框、调整字体和颜色等等。其底层原理是解析 PowerPoint 文件的 XML 结构,然后通过 Python 代码来修改这些 XML 内容。对于图片的处理,python-pptx 也提供了便捷的接口,可以自动调整图片大小以适应幻灯片。
安装 python-pptx 库
首先,我们需要安装 python-pptx 库。打开终端,执行以下命令:
pip install python-pptx
确保你的 Python 环境已经正确配置,并且能够访问 pip。
代码解决方案:Python 脚本实现 PPT 批量生成
下面是一个完整的 Python 脚本,用于批量生成家长会 PPT。
from pptx import Presentation
from pptx.util import Inches
import os
# 配置参数
image_folder = 'photos' # 图片所在的文件夹
output_pptx = 'parent_meeting.pptx' # 输出的 PPT 文件名
slide_width = Inches(16) # 幻灯片宽度,16:9 比例
slide_height = Inches(9) # 幻灯片高度,16:9 比例
# 创建 Presentation 对象
prs = Presentation()
prs.slide_width = slide_width
prs.slide_height = slide_height
# 设置空白版式(非常重要,避免默认版式影响布局)
blank_slide_layout = prs.slide_layouts[6]
# 遍历图片文件夹
image_files = sorted([f for f in os.listdir(image_folder) if f.endswith(('.jpg', '.jpeg', '.png'))])
for image_file in image_files:
# 添加幻灯片
slide = prs.slides.add_slide(blank_slide_layout)
# 图片路径
image_path = os.path.join(image_folder, image_file)
# 获取图片尺寸
try:
from PIL import Image
img = Image.open(image_path)
width, height = img.size
except ImportError:
print("请先安装 Pillow 库:pip install Pillow")
exit()
# 根据图片方向调整布局
if width > height:
# 横版图片
left = Inches(1) # 左边距
top = Inches(1) # 上边距
pic_width = Inches(14) # 图片宽度
pic_height = Inches(7)
else:
# 竖版图片
left = Inches(4) # 左边距
top = Inches(1) # 上边距
pic_width = Inches(8) # 图片宽度
pic_height = Inches(7)
# 添加图片
try:
slide.shapes.add_picture(image_path, left, top, width=pic_width, height=pic_height)
except Exception as e:
print(f"Error adding picture {image_file}: {e}")
continue
# 添加文件名
text_box = slide.shapes.add_textbox(Inches(1), Inches(7.5), Inches(14), Inches(1))
text_frame = text_box.text_frame
text_frame.text = image_file
text_frame.auto_size = True # 自动调整文本框大小
text_frame.word_wrap = True # 允许文字换行
# 保存 PPT
prs.save(output_pptx)
print(f'PPT "{output_pptx}" 生成成功!')
代码解释:
- 导入库: 导入
python-pptx库和os库,用于操作 PPT 和文件系统。 - 配置参数: 设置图片文件夹、输出 PPT 文件名、幻灯片宽高。
- 创建 Presentation 对象: 创建 PPT 对象,并设置幻灯片宽高为 16:9。
- 设置空白版式: 使用空白版式,避免默认版式干扰布局。
- 遍历图片文件夹: 遍历指定文件夹下的所有图片文件,并按照文件名排序。
- 添加幻灯片: 为每张图片添加一张幻灯片。
- 图片尺寸判断: 使用 Pillow 库获取图片尺寸,判断是横版还是竖版。
- 添加图片: 根据图片方向,调整图片的位置和大小,并添加到幻灯片中。
- 添加文件名: 在幻灯片下方添加一个文本框,显示图片的文件名。
- 保存 PPT: 将 PPT 保存到指定的文件中。
实战避坑经验总结
- 确保安装 Pillow 库: 脚本中使用了 Pillow 库来获取图片尺寸,如果未安装,会报错。可以使用
pip install Pillow命令安装。 - 处理异常情况: 代码中使用了
try...except块来处理添加图片可能出现的异常,例如图片文件损坏等。这样可以保证脚本的健壮性。 - 调整图片布局: 可以根据实际情况调整图片的位置和大小,以及文件名文本框的位置和字体大小,以达到最佳的显示效果。
- 文件名排序:
sorted()函数默认按照文件名升序排序,如果需要按照其他方式排序,可以自定义排序规则。例如按修改时间排序等。 - 中文字体支持: 默认情况下,
python-pptx可能无法正确显示中文字符。可以在代码中指定中文字体,例如宋体、微软雅黑等。需要在添加文本框后,获取 text_frame 对象的 font 属性,然后设置 font.name 为中文字体名称。 - 宝塔面板部署: 如果需要在服务器上运行此脚本,可以使用宝塔面板进行部署。将代码上传到服务器,安装必要的 Python 库,然后配置一个计划任务,定时执行脚本。
- 注意并发连接数:如果图片数量非常大,生成 PPT 过程可能消耗大量内存,建议分批次处理,避免服务器因内存不足而崩溃。尤其在高并发环境下,要注意服务器的配置和优化,例如调整 Nginx 的并发连接数,优化数据库查询等。
扩展应用:其他场景下的 PPT 批量生成
除了家长会 PPT,这个脚本还可以用于批量生成其他类型的 PPT,例如产品展示 PPT、培训 PPT、会议 PPT 等。只需要修改脚本中的图片文件夹、输出 PPT 文件名,以及图片和文本的布局即可。
冠军资讯
半杯凉茶