使用PyMuPDF提取PDF中图片位置失败,请求技术协助
解决PyMuPDF提取PDF图片位置与尺寸的问题
你的核心问题在于获取图片位置时的方法有误,主要是误用了图片名称而非xref来定位,且部分API调用参数不正确。以下是修正后的完整方案:
关键问题分析
get_page_images返回的图片项中,第0位的xref是唯一标识图片的关键,而非第7位的名称(名称可能重复或不唯一)get_image_bbox方法直接传入xref即可返回图片在页面上的准确边界框,无需通过名称查找- PyMuPDF的页面坐标原点在左下角,x轴向右递增,y轴向上递增,注意与常规图片左上角原点坐标的区别
修正后的完整代码
将图片提取与位置获取整合,避免重复打开PDF文件,提升效率:
import fitz from PIL import Image from io import BytesIO import os def extract_images_with_position(_input_pdf_file_name, _output_folder): pdf_doc = fitz.open(_input_pdf_file_name) image_info_list = [] # 存储每张图片的完整信息:页码、位置、尺寸、保存路径 for page_idx, page in enumerate(pdf_doc): # 获取当前页的所有图片(full=True返回完整元信息) page_images = page.get_images(full=True) for img_idx, img_item in enumerate(page_images): xref = img_item[0] # 获取图片原始像素尺寸 original_width = img_item[2] original_height = img_item[3] # 获取图片在页面上的实际显示边界框:(x_min, y_min, x_max, y_max) # transform=True自动处理页面旋转、缩放等变换 img_rect = page.get_image_bbox(xref, transform=True) if not img_rect: continue # 跳过无法定位的特殊图片 # 提取图片并保存 base_image = pdf_doc.extract_image(xref) image_bytes = base_image["image"] image = Image.open(BytesIO(image_bytes)) # 生成带页码的文件名,避免不同页面图片重名 output_path = f"{_output_folder}/page_{page_idx+1:03d}_img_{img_idx+1:04d}.png" image.save(output_path) # 整理图片信息:原点坐标、显示尺寸、原始尺寸等 image_info = { "page_number": page_idx + 1, "origin": (round(img_rect.x0, 2), round(img_rect.y0, 2)), "display_size": (round(img_rect.width, 2), round(img_rect.height, 2)), "original_size": (original_width, original_height), "save_path": output_path } image_info_list.append(image_info) pdf_doc.close() return image_info_list # 调用示例 if __name__ == "__main__": pdf_path = "your_input.pdf" output_dir = "extracted_images" os.makedirs(output_dir, exist_ok=True) images_info = extract_images_with_position(pdf_path, output_dir) # 打印提取结果 for info in images_info: print(f"页码: {info['page_number']}, 原点坐标: {info['origin']}, 显示尺寸: {info['display_size']}, 原始尺寸: {info['original_size']}")
代码说明
page.get_image_bbox(xref, transform=True):自动适配页面的旋转、缩放等变换,返回图片在页面上的真实显示位置img_rect.x0和img_rect.y0对应图片的左下角原点坐标,img_rect.width/height是图片在PDF页面上的显示尺寸(可能与原始像素尺寸不同)img_item[2]/img_item[3]是图片的原始像素尺寸,用于对比查看PDF中是否对图片做了缩放处理- 若图片在页面中被多次引用,可使用
page.get_image_rects(xref)获取该图片的所有显示位置
内容的提问来源于stack exchange,提问作者Toyo
相关产品推荐
相关产品推荐

