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

PyMuPDF中rotation值含义 如何提取方向正确的PDF页面与图片

1. PyMuPDF页面rotation属性的含义

该属性是PDF官方标准中页面/Rotate字段的直接映射,代表PDF阅读器渲染页面时,需要将原始页面内容顺时针旋转的角度,取值仅为0、90、180、270四个值。
PDF的存储逻辑和显示逻辑相互独立,对应观察到的差异如下:

  • Adobe Reader显示的方向正常的页面,是阅读器自动读取rotation=270参数后,将原始存储的内容顺时针旋转270度呈现的效果
  • 直接读取的原始页面内容、嵌入图片资源均为未经过旋转校正的原始存储状态,方向与rotation对应的未校正状态一致
  • 调用get_pixmap()方法时,PyMuPDF默认和Adobe Reader逻辑一致,自动应用rotation参数做渲染校正,因此输出的像素图方向和阅读器显示效果匹配。
2. 提取方向正确的页面与嵌入图片的操作方法

页面提取

直接使用默认参数调用page.get_pixmap()即可,方法默认自动应用页面旋转参数,输出效果与PDF阅读器显示完全一致,无需额外调整。
若需获取未校正的原始方向像素图,可传入参数关闭自动旋转逻辑:

# 获取未应用rotation校正的原始方向像素图
raw_pix = page.get_pixmap(rotate=0)

嵌入图片提取

直接调用doc.extract_image()获取的是PDF内存储的原始图片二进制,不会应用页面旋转、图片自身变换参数,会出现方向错误,可根据场景选择以下两种方案:

方案1:快速校正原始提取图片

若确认图片无独立变换参数,仅受页面级旋转影响,提取原始图片后根据rotation值做反向旋转即可,需传入*expand=True*参数避免旋转后内容被裁切:

import fitz
from PIL import Image
from io import BytesIO

doc = fitz.open("target_file.pdf")
page = doc[0]
img_list = page.get_images()
# 提取第一张嵌入的原始图片
raw_img_data = doc.extract_image(img_list[0][0])
raw_img = Image.open(BytesIO(raw_img_data["image"]))
# 方向校正:360减去页面rotation值,得到PIL库所需的逆时针旋转角度
correct_img = raw_img.rotate(360 - page.rotation, expand=True)

方案2:获取与页面显示完全一致的图片(通用稳妥方案)

部分PDF中的嵌入图片自带独立的旋转、裁切、缩放变换矩阵,仅靠页面rotation值校正会出现偏差。该场景下最稳妥的实现方式是先将整页渲染为方向正确的pixmap,再根据图片在页面上的显示坐标裁切对应区域,输出效果与阅读器看到的内容完全一致:

import fitz
from PIL import Image
from io import BytesIO

doc = fitz.open("target_file.pdf")
page = doc[0]
# 渲染方向正确的整页像素图
page_pix = page.get_pixmap()
page_img = Image.open(BytesIO(page_pix.tobytes()))
# 遍历页面所有图片的显示位置信息
for img_info in page.get_image_info(xrefs=True):
    # 获取图片在页面上的显示边界坐标
    x0, y0, x1, y1 = img_info["bbox"]
    # 从整页渲染图中裁切对应区域,即为方向正确的图片
    correct_crop_img = page_img.crop((x0, y0, x1, y1))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.19 16:15:46