如何从含文本、图片、扫描页的PDF中提取内容,修改PyPDF2代码识别图片文字
PDF文本提取(含图片/扫描页OCR)修改方案
前置准备
- 安装Tesseract OCR引擎:Windows用户直接下载官方安装包安装,若未将其加入系统环境变量,需要在代码中手动指定执行文件路径
- 安装依赖库:
pip install pymupdf pytesseract pillow
说明:我们替换原有PyPDF2库为PyMuPDF(导入名为fitz),它对PDF页面资源的解析能力更强,可稳定识别页面中的图片资源、适配扫描版PDF的识别需求。
修改后完整代码
import os import fitz import pytesseract from PIL import Image import io # 若Tesseract未加入环境变量,取消下方注释并修改为你的实际安装路径 # pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" lst_all_text = [] # 替换为你的PDF文件根目录 pdf_root_path = r"C:/MY PATH" for foldername, subfolders, files in os.walk(pdf_root_path): for file in files: # 仅处理PDF后缀的文件 if not file.lower().endswith(".pdf"): continue file_path = os.path.join(foldername, file) text = "" try: # 打开PDF文件 with fitz.open(file_path) as pdf_doc: # 逐页处理 for page in pdf_doc: # 第一步:提取页面原生可复制文本 page_text = page.get_text() text += page_text # 第二步:检查页面是否包含图片 image_list = page.get_images(full=True) if image_list: # 遍历所有图片做OCR识别 for img_index, img in enumerate(image_list): xref = img[0] # 提取图片原始字节数据 base_image = pdf_doc.extract_image(xref) image_bytes = base_image["image"] # 转为PIL可处理的图像对象 img_obj = Image.open(io.BytesIO(image_bytes)) # 过滤尺寸过小的图标类图片,可根据需求调整阈值 if img_obj.width < 100 or img_obj.height < 100: continue # OCR识别图片文字,默认识别简体中文+英文,可修改lang参数 ocr_text = pytesseract.image_to_string(img_obj, lang="chi_sim+eng") text += f"\n[图片{img_index+1}识别文本]\n{ocr_text}\n" except Exception as e: print(f"处理文件{file_path}失败:{e}") continue lst_all_text.append(text)
逻辑说明
- 会自动跳过非PDF格式的文件,避免遍历到其他文件报错
- 优先提取PDF原生可复制文本,效率更高
- 检测到页面存在图片时,自动调用OCR识别图片内文字,自动适配扫描版PDF(整页为单张图片的场景)
- 增加了小尺寸图片过滤逻辑,避免页眉页脚小图标、装饰性图片的无效识别干扰结果
- 增加了异常捕获逻辑,单个文件损坏不会中断整体遍历任务
内容的提问来源于stack exchange,提问作者Tahi
相关产品推荐
相关产品推荐

