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

Python批量处理目录PDF横版转竖版 解决页面重复生成问题

问题原因

页面重复生成是嵌套循环导致的逻辑错误:

  • 外层已经写了for page in reader.pages,会按PDF总页数逐次进入循环体
  • 循环体内部又嵌套了一层for pagenum in range(numofpages),每次外层循环触发时,都会把整份PDF的所有页面遍历一遍、添加到writer对象中

如果PDF总共有N页,外层会执行N次,每次内层添加N页,最终输出的文件就会有N*N页,也就是你看到的重复N次的异常。

另外代码里还有几个隐性问题:

  • numrotated变量定义在内层循环外、外层循环内,每次外层循环都会重置计数,统计旋转页数的逻辑完全失效
  • 直接拼接字符串做文件路径在不同系统下容易出斜杠兼容问题
  • 你用的numPages、getPage是PyPDF2旧版本接口,新版本中已经标记废弃
修复后代码
import os
from os import listdir
from PyPDF2 import PdfReader, PdfWriter

input_dir = r"C:\Users\.......directory....\\"
output_dir = r"C:\Users\.......directory....\\"

for x in listdir(input_dir):
    if not x.endswith(".pdf"):
        continue
        
    reader = PdfReader(os.path.join(input_dir, x))
    writer = PdfWriter()
    numrotated = 0
    # 只保留一层页面遍历即可
    for pagenum in range(len(reader.pages)):
        page = reader.pages[pagenum]
        mb = page.mediabox
        # 判断是否为未旋转的横向页面:宽度大于高度
        if (mb.upper_right[0] > mb.upper_right[1]) and (page.get('/Rotate') is None):
            page.rotate_counter_clockwise(90)
            numrotated += 1
        writer.add_page(page)
    
    # 输出目录不存在则自动创建
    os.makedirs(output_dir, exist_ok=True)
    with open(os.path.join(output_dir, x), "wb") as pdf_out:
        writer.write(pdf_out)
    print(f"处理完成文件:{x},共旋转{numrotated}个横向页面")

注:如果你用的是非常旧的PyPDF2版本,把mediabox改回mediaBox、upper_right改回upperRight、rotate_counter_clockwise改回rotateCounterClockwise、add_page改回addPage即可,核心修复逻辑是删掉多余的外层for page in reader.pages循环。

内容的提问来源于stack exchange,提问作者nmnprt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 08:12:31