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
相关产品推荐
相关产品推荐

