我的知识记录

Python多张图片合成PDF:Pillow一键打包教程

用Python的Pillow把一个文件夹里的JPG/PNG按顺序合并成一个PDF,自动处理图片方向、RGB模式转换,适合把拍照、截图、扫描件打包成文档。

场景痛点

拍了一堆合同照片、产品截图、手绘草图,要发给客户或者归档,一张张发太乱,压成压缩包对方还要解压。手动用Word插图另存PDF,每张图还要调大小、旋转方向,几十张图搞半天。用Pillow把图片按文件名排序,一键拼成一个多页PDF,自动处理透明通道和方向。

用到的库

pip install pillow

完整代码

# -*- coding: utf-8 -*-
"""
把一个文件夹里的图片按文件名顺序合并成一个 PDF。
"""
from pathlib import Path
from PIL import Image


def images_to_pdf(image_dir: str,
output_pdf: str,
extensions=("jpg", "jpeg", "png", "bmp", "tiff")):
src = Path(image_dir)
# 收集所有图片,按文件名排序,保证合成顺序正确
image_files = sorted(
[p for p in src.iterdir() if p.suffix.lower().lstrip(".") in extensions]
)

if not image_files:
print("目录下没有找到图片")
return

images = []
for img_path in image_files:
im = Image.open(img_path)
# PNG 有透明通道,PDF 不支持透明,统一转成 RGB,白底
if im.mode in ("RGBA", "P", "LA"):
background = Image.new("RGB", im.size, (255, 255, 255))
if im.mode == "P":
im = im.convert("RGBA")
background.paste(im, mask=im.split()[-1] if im.mode in ("RGBA", "LA") else None)
im = background
elif im.mode != "RGB":
im = im.convert("RGB")
images.append(im)
print(f"加载:{img_path.name}")

# 第一张图作为首页,其余 append 到后面
first, rest = images[0], images[1:]
first.save(
output_pdf,
"PDF",
save_all=True,
append_images=rest,
resolution=150.0,
)
print(f"PDF 已生成:{output_pdf},共 {len(images)} 页")


if __name__ == "__main__":
images_to_pdf(
image_dir="photos",
output_pdf="merged.pdf",
)

代码讲解

  • sorted([...]) 按文件名排序是关键,否则图片顺序乱了PDF页序就乱。建议文件命名用001.jpg002.jpg这种带序号的。
  • PNG带透明通道时,PDF格式本身不支持透明,直接save会报错或丢透明信息,所以先铺一层白底再paste上去。
  • save_all=True 表示保存多页PDF,append_images=rest 把剩余图片追加为后续页。
  • resolution=150.0 控制PDF里图片的DPI,150屏幕看足够,打印建议300。
  • 支持的扩展名在extensions元组里,需要加WebP就自己补一个。

运行结果

把图片放进photos/目录,按001.jpg002.jpg……命名,跑完生成merged.pdf,打开后每张图占一页,顺序和文件名一致。

注意事项

  • 文件名排序用字符串排序,2.jpg会排在10.jpg后面,所以一定要用001.jpg这种补零命名。
  • 横拍竖拍的图片方向由EXIF决定,手机拍的照片可能需要先ImageOps.exif_transpose(im)修正方向,否则合成后是歪的。
  • 图片特别大时(比如4000×3000),生成的PDF会很大,可以先im.thumbnail((2000, 2000))压一下。
  • 想精确控制每页尺寸(比如统一A4),用reportlab或PyMuPDF更合适,Pillow方案是"图片多大页面就多大"。

Python多张图片合成PDF:Pillow一键打包教程

标签:

更新时间:2026-09-14 21:36:59

上一篇:Python在PDF指定位置插入文字:盖章签字位

下一篇:Python HTML网页转PDF:WeasyPrint保留CSS样式