在我上一篇的需求中,有编写程序,截取屏幕指定区域,批量生成有序png图像的需求,为了便于阅读,最终需求是将所有有序序列的图像按照顺序,合成为一个pdf文件,最好能够顺便压缩一下清晰图。
本篇应用接上一篇的功能扩展,主要需求是,从当前目录下找出所有 PNG 格式的序列图片,并将它们合并生成一个 PDF 文件。从个人需求出发,本应用还是非常实用的,比如整理截图、图片序列等场景。毕竟商用软件能实现这个功能的软件也不少,使用起来有利有弊,而使用该程序,既能跨平台用,还灵活方便。以下是相应软件的简单对比整理。
本篇内容主要解决以下4点需求:
- 遍历当前目录,筛选出所有
.png后缀的文件; - 按文件名(数字序列)对 PNG 文件进行排序,保证生成 PDF 的顺序正确;
- 使用成熟的 Python 库(
PIL/Pillow)处理图片,使用Pillow的 PDF 导出功能生成最终 PDF; - 加入异常处理,确保程序健壮性。
完整代码
首先需要安装依赖库:
pip install pillow以下是可直接运行的代码:
import os from PIL import Image from pathlib import Path def pngs_to_pdf(output_pdf_name="output.pdf", sort_by_name=True): """ 将当前目录下的所有PNG图片合并为一个PDF文件 Args: output_pdf_name (str): 生成的PDF文件名,默认output.pdf sort_by_name (bool): 是否按文件名排序(保证序列图片顺序),默认True """ # 获取当前目录路径 current_dir = Path.cwd() # 筛选当前目录下所有PNG文件 png_files = [] for file in current_dir.iterdir(): # 只处理文件,且后缀为.png(忽略大小写) if file.is_file() and file.suffix.lower() == ".png": png_files.append(file) # 检查是否找到PNG文件 if not png_files: print("❌ 当前目录下未找到任何PNG图片文件!") return # 按文件名排序(保证序列图片顺序,如1.png、2.png、3.png) if sort_by_name: # 提取文件名(不含后缀)尝试转为数字排序,失败则按字符串排序 def sort_key(file_path): try: # 提取文件名(无后缀)并转为数字 return int(file_path.stem) except ValueError: # 非数字文件名按字符串排序 return file_path.name png_files.sort(key=sort_key) print(f"✅ 找到 {len(png_files)} 个PNG文件,开始生成PDF...") print(f"📄 文件列表:{[f.name for f in png_files]}") try: # 打开第一张图片作为PDF的基础 first_image = Image.open(png_files[0]) # 转换为RGB模式(PNG可能带透明通道,PDF不支持,需转换) if first_image.mode in ("RGBA", "P"): first_image = first_image.convert("RGB") # 准备其他图片 other_images = [] for png_file in png_files[1:]: img = Image.open(png_file) if img.mode in ("RGBA", "P"): img = img.convert("RGB") other_images.append(img) # 保存为PDF first_image.save( output_pdf_name, save_all=True, append_images=other_images, resolution=100.0, # PDF分辨率 quality=95 # 图片质量 ) print(f"🎉 PDF生成成功!文件保存为:{os.path.abspath(output_pdf_name)}") except Exception as e: print(f"❌ 生成PDF失败:{str(e)}") if __name__ == "__main__": # 调用函数,可自定义输出PDF名称 pngs_to_pdf(output_pdf_name="png_sequence.pdf")代码关键部分解释
- 文件筛选:使用
Path.cwd()获取当前目录,iterdir()遍历所有文件,通过suffix.lower() == ".png"筛选 PNG 文件(忽略大小写,如.PNG 也能识别); - 文件排序:自定义
sort_key函数,优先将文件名转为数字排序(适配 1.png、2.png 这类序列),非数字文件名按字符串排序; - 图片处理:PNG 图片可能包含透明通道(RGBA 模式),PDF 不支持透明通道,因此转换为 RGB 模式;
- PDF 生成:使用
PIL.Image.save()的save_all=True和append_images参数,将多张图片合并为一个 PDF; - 异常处理:捕获生成过程中的错误,友好提示用户。
使用说明
- 将代码保存为
png2pdf.py,放在包含 PNG 序列图片的目录下; - 打开终端 / 命令行,进入该目录,执行
python png2pdf.py; - 程序会自动找到所有 PNG 文件,按顺序生成名为
png_sequence.pdf的文件; - 若想自定义输出 PDF 名称,可修改
pngs_to_pdf(output_pdf_name="自定义名称.pdf")。
测试示例
假设当前目录有文件:xxx_001.png、xxx_003.png、xxx_002.png、test.png,运行程序后:
- 输出:
✅ 找到 4 个PNG文件,开始生成PDF... - 生成的 PDF 中图片顺序为:xxx_001.png → xxx_002.png → xxx_003.png → test.png
- 最终在当前目录生成
png_sequence.pdf。
总结
- 核心依赖是
Pillow库,需提前安装,程序仅处理当前目录下的 PNG 文件; - 自动处理 PNG 透明通道问题,保证 PDF 生成成功率;
- 支持数字序列文件名排序,适配常见的图片序列场景;
- 包含完善的错误提示,新手也能快速定位问题;
- 生成pdf与所有原png对比,压缩率较高,看对比:
所有png图容量为754M,合成pdf后,pdf文件为102M,压缩率较高: