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

