使用img2pdf合并文件夹图片为多页PDF仅保留最后一张的问题
问题说明
使用img2pdf遍历主目录下的子文件夹,将每个子文件夹内的JPEG合并为同名多页PDF时,最终生成的PDF仅包含最后一张图片,已确认所有图片都进入循环流程,原代码如下:
from pathlib import Path import os import img2pdf main_dir = Path(Path.cwd(),'MAIN') for subfolder in main_dir.iterdir(): if subfolder.is_file(): continue for filename in subfolder.iterdir(): #pdf as foldername pdf_name = os.path.basename(subfolder) #write image-file to pdf file with open(pdf_name+".pdf", "wb") as f: f.write(img2pdf.convert(str(filename)))
逻辑错误点
- 缩进错误:Python对缩进层级敏感,原代码中
if subfolder.is_file()判断、内层遍历文件的for循环缩进层级完全混乱,会导致内层遍历逻辑无法按预期执行。 - 文件覆盖写入:你把打开PDF文件的逻辑放在了单张图片的遍历循环内部,每次循环都会用
wb(覆盖写入)模式重新创建/清空同名PDF文件,写入当前单张图片的内容,前序图片写入的内容会被下一次循环直接覆盖,最终文件只会保留最后一次循环写入的最后一张图片。 - 接口使用错误:
img2pdf.convert()本身支持传入图片路径列表,一次性生成包含所有图片的多页PDF,不需要逐张调用写入。
修正后代码
from pathlib import Path import img2pdf main_dir = Path(Path.cwd(), 'MAIN') # 定义支持的图片格式后缀 VALID_IMAGE_SUFFIX = (".jpg", ".jpeg") for subfolder in main_dir.iterdir(): # 跳过非目录项 if not subfolder.is_dir(): continue # 收集当前子文件夹下所有有效图片路径 image_paths = [] for file in subfolder.iterdir(): if file.is_file() and file.suffix.lower() in VALID_IMAGE_SUFFIX: image_paths.append(str(file)) # 目录下无有效图片则跳过生成 if not image_paths: continue # 一次性写入所有图片生成多页PDF pdf_path = f"{subfolder.name}.pdf" with open(pdf_path, "wb") as f: f.write(img2pdf.convert(image_paths))
修正说明
- 统一调整代码缩进,保证目录遍历、文件遍历的层级逻辑正确
- 将PDF文件的打开写入操作移到子文件夹的文件遍历逻辑外层,每个子文件夹仅执行一次PDF写入,从根源避免内容被覆盖
- 提前收集子文件夹内所有JPEG图片的路径,作为列表传入
img2pdf.convert(),直接生成符合要求的多页PDF - 新增图片格式校验,避免非图片文件传入导致程序报错
- 直接使用Path对象的
name属性获取子文件夹名称,无需额外调用os模块方法,写法更简洁
内容的提问来源于stack exchange,提问作者keepitsimple
相关产品推荐
相关产品推荐

