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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:37:36