You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 19:54:23