我的知识记录

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)做渲染级旋转,本方案属于标准做法。

Python PDF旋转页面方向 批量转正教程

标签:

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

上一篇:Python扫描件批量生成PDF:按文件名排序合并

下一篇:Python reportlab生成简单PDF:三行代码出一份合同