Python PDF旋转页面方向 批量转正教程
用Python+PyPDF2把PDF所有页面统一旋转90/180/270度,或只旋转指定页,处理扫描时拍歪、方向颠倒的PDF。
场景痛点
用手机扫描APP拍出来的PDF经常方向不对:横拍变竖版、扫描件倒着放、合同某一页被旋转了90度。手动在阅读器里一页页旋转再另存,几十页要操作半天。用Python脚本一键把所有页面统一旋转到正确方向,或只旋转指定页,秒级完成。
用到的库
pip install PyPDF2
完整代码
# -*- coding: utf-8 -*-
"""
旋转 PDF 页面
"""
from PyPDF2 import PdfReader, PdfWriter
def rotate_all(src_path: str, out_path: str, angle: int) -> None:
"""
把整本 PDF 所有页都旋转 angle 度
:param angle: 必须是 90 的倍数:90 / 180 / 270
"""
if angle % 90 != 0:
raise ValueError("旋转角度必须是 90 的倍数")
reader = PdfReader(src_path)
writer = PdfWriter()
for page in reader.pages:
# rotate_page 会在原页基础上叠加旋转
page.rotate_page(angle)
writer.add_page(page)
with open(out_path, "wb") as f:
writer.write(f)
print(f"已整本旋转 {angle}° -> {out_path}")
def rotate_specific_pages(src_path: str, out_path: str,
angle: int, page_numbers: list) -> None:
"""
只旋转指定页(1 基页码),其他页保持原方向
"""
reader = PdfReader(src_path)
writer = PdfWriter()
total = len(reader.pages)
for idx, page in enumerate(reader.pages, start=1):
if idx in page_numbers:
page.rotate_page(angle)
writer.add_page(page)
with open(out_path, "wb") as f:
writer.write(f)
print(f"已旋转第 {page_numbers} 页 {angle}° -> {out_path}")
if __name__ == "__main__":
# 整本旋转 90 度(顺时针)
rotate_all("扫描件.pdf", "扫描件_转正.pdf", 90)
# 只把第 1、3、5 页旋转 180 度(倒过来的页转正)
# rotate_specific_pages("scan.pdf", "scan_fix.pdf", 180, [1, 3, 5])
代码讲解
page.rotate_page(angle)是 PyPDF2 提供的方法,直接在页面对象上叠加旋转。- 角度必须是 90 的倍数(90/180/270),传 45 这种任意角度会报错,这是PDF规范限制。
- 旋转方向:PyPDF2 默认是顺时针;想逆时针 90 度就传 270。
rotate_all对所有页统一旋转;rotate_specific_pages只在你给的页码列表上调用rotate_page,其他页原样写入。- 旋转是在页面
/Rotate属性上叠加,不重新渲染内容,所以速度快、文件大小不变。
运行结果
生成 扫描件_转正.pdf,打开后所有页面都按你指定的角度旋转到位。用阅读器翻页确认方向正确即可。
注意事项
- PyPDF2 3.x 之后方法名从
rotateClockwise改为rotate_page,老版本代码要升级。 - 如果某页已经有
/Rotate属性,再次rotate_page(90)是累加,不是覆盖,注意别转多了。 - 旋转后文字层、书签、链接仍然保留,不会变图片。
- 想"永久旋转"而不是只加
/Rotate标记,需要用 PyMuPDF(fitz)做渲染级旋转,本方案属于标准做法。

更新时间:2026-09-14 21:33:30