使用Python从扫描版PDF页面提取图片遇问题求助
问题原因
扫描版PDF本质上是纸质文档扫描后生成的图像集合,每页PDF对应的就是一张完整的扫描图像,而非包含独立子图片的结构化文档。所以你用page.get_images()提取到的自然就是整页的图像,这是正常现象。
解决方案:从整页扫描图中提取子图片
如果要从整页扫描图里抠出其中的子图片,需要通过图像识别技术检测图片区域,这里用OpenCV实现轮廓检测和区域提取:
首先安装依赖:
pip install fitz pillow opencv-python numpy
代码示例:
import fitz import cv2 import numpy as np from PIL import Image import io import os def extract_subimages_from_scanned_pdf(pdf_path, output_dir): os.makedirs(output_dir, exist_ok=True) pdf_file = fitz.open(pdf_path) for page_idx in range(len(pdf_file)): page = pdf_file[page_idx] # 提取整页扫描图 pix = page.get_pixmap() img_bytes = pix.tobytes("png") img = Image.open(io.BytesIO(img_bytes)) # 转为OpenCV格式 cv_img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) # 预处理:灰度化、二值化 gray = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV) # 检测轮廓 contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) subimg_count = 0 for cnt in contours: # 过滤太小的轮廓(避免噪声) area = cv2.contourArea(cnt) if area < 5000: continue # 获取轮廓的外接矩形 x, y, w, h = cv2.boundingRect(cnt) # 提取子图片 sub_img = cv_img[y:y+h, x:x+w] # 保存子图片 output_path = f"{output_dir}/page_{page_idx}_subimg_{subimg_count}.png" cv2.imwrite(output_path, sub_img) subimg_count += 1 print(f"页面{page_idx}提取完成,共得到{subimg_count}张子图片") # 使用示例 extract_subimages_from_scanned_pdf("你的扫描版PDF路径.pdf", "提取结果目录")
注意事项
- 代码通过二值化和轮廓检测识别页面中的深色区域(通常图片的边框或内容会和背景形成对比),过滤小噪声后提取外接矩形区域作为子图片。
- 如果你的扫描图背景或图片样式特殊,可以调整
threshold的阈值(当前为240)或轮廓面积过滤值(当前为5000)来优化提取效果。
内容的提问来源于stack exchange,提问作者Durga S
相关产品推荐
相关产品推荐

