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.jpg、002.jpg这种带序号的。- PNG带透明通道时,PDF格式本身不支持透明,直接save会报错或丢透明信息,所以先铺一层白底再paste上去。
save_all=True表示保存多页PDF,append_images=rest把剩余图片追加为后续页。resolution=150.0控制PDF里图片的DPI,150屏幕看足够,打印建议300。- 支持的扩展名在
extensions元组里,需要加WebP就自己补一个。
运行结果
把图片放进photos/目录,按001.jpg、002.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方案是"图片多大页面就多大"。

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