python处理批量有序png图片生成pdf文件

📅 2026/7/25 21:16:42 👁️ 阅读次数 📝 编程学习
python处理批量有序png图片生成pdf文件

在我上一篇的需求中,有编写程序,截取屏幕指定区域,批量生成有序png图像的需求,为了便于阅读,最终需求是将所有有序序列的图像按照顺序,合成为一个pdf文件,最好能够顺便压缩一下清晰图。

本篇应用接上一篇的功能扩展,主要需求是,从当前目录下找出所有 PNG 格式的序列图片,并将它们合并生成一个 PDF 文件。从个人需求出发,本应用还是非常实用的,比如整理截图、图片序列等场景。毕竟商用软件能实现这个功能的软件也不少,使用起来有利有弊,而使用该程序,既能跨平台用,还灵活方便。以下是相应软件的简单对比整理。

本篇内容主要解决以下4点需求:

  1. 遍历当前目录,筛选出所有.png后缀的文件;
  2. 按文件名(数字序列)对 PNG 文件进行排序,保证生成 PDF 的顺序正确;
  3. 使用成熟的 Python 库(PIL/Pillow)处理图片,使用Pillow的 PDF 导出功能生成最终 PDF;
  4. 加入异常处理,确保程序健壮性。

完整代码

首先需要安装依赖库:

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")

代码关键部分解释

  1. 文件筛选:使用Path.cwd()获取当前目录,iterdir()遍历所有文件,通过suffix.lower() == ".png"筛选 PNG 文件(忽略大小写,如.PNG 也能识别);
  2. 文件排序:自定义sort_key函数,优先将文件名转为数字排序(适配 1.png、2.png 这类序列),非数字文件名按字符串排序;
  3. 图片处理:PNG 图片可能包含透明通道(RGBA 模式),PDF 不支持透明通道,因此转换为 RGB 模式;
  4. PDF 生成:使用PIL.Image.save()save_all=Trueappend_images参数,将多张图片合并为一个 PDF;
  5. 异常处理:捕获生成过程中的错误,友好提示用户。

使用说明

  1. 将代码保存为png2pdf.py,放在包含 PNG 序列图片的目录下;
  2. 打开终端 / 命令行,进入该目录,执行python png2pdf.py
  3. 程序会自动找到所有 PNG 文件,按顺序生成名为png_sequence.pdf的文件;
  4. 若想自定义输出 PDF 名称,可修改pngs_to_pdf(output_pdf_name="自定义名称.pdf")

测试示例

假设当前目录有文件:xxx_001.png、xxx_003.png、xxx_002.pngtest.png,运行程序后:

  • 输出:✅ 找到 4 个PNG文件,开始生成PDF...
  • 生成的 PDF 中图片顺序为:xxx_001.png → xxx_002.png → xxx_003.png → test.png
  • 最终在当前目录生成png_sequence.pdf

总结

  1. 核心依赖是Pillow库,需提前安装,程序仅处理当前目录下的 PNG 文件;
  2. 自动处理 PNG 透明通道问题,保证 PDF 生成成功率;
  3. 支持数字序列文件名排序,适配常见的图片序列场景;
  4. 包含完善的错误提示,新手也能快速定位问题;
  5. 生成pdf与所有原png对比,压缩率较高,看对比:

所有png图容量为754M,合成pdf后,pdf文件为102M,压缩率较高: