使用Python提取扫描PDF图片或直接执行OCR方案咨询
两种Python方案解决扫描版PDF的OCR问题
嘿,刚好碰到过类似的需求,给你整理两种实用的Python方案,不管是先提图片再OCR,还是直接处理PDF都能搞定:
方案一:先提取PDF中的图片,再逐图OCR
扫描版PDF本质就是每页一张图片,用**PyMuPDF(fitz)**可以轻松提取每页的图像,步骤很清晰:
步骤1:安装依赖库
pip install pymupdf pytesseract pillow
注意:还要确保你已经安装了Tesseract OCR引擎,Windows用户需要手动下载并配置环境变量,或者在代码里指定引擎路径
步骤2:提取图片并执行OCR的代码示例
import fitz # PyMuPDF import pytesseract from PIL import Image import os # 配置Tesseract路径(如果没加到环境变量的话) # pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # 创建保存图片的目录 output_img_dir = "pdf_images" os.makedirs(output_img_dir, exist_ok=True) # 打开PDF文件 pdf_path = "your_scanned_pdf.pdf" doc = fitz.open(pdf_path) # 遍历每页提取图片并OCR full_text = "" for page_num in range(len(doc)): page = doc.load_page(page_num) image_list = page.get_images(full=True) # 扫描版PDF每页通常只有一张图,所以取第一个即可 if image_list: xref = image_list[0][0] base_image = doc.extract_image(xref) image_bytes = base_image["image"] image_ext = base_image["ext"] # 保存图片到目录 img_path = os.path.join(output_img_dir, f"page_{page_num+1}.{image_ext}") with open(img_path, "wb") as f: f.write(image_bytes) # 对图片执行OCR img = Image.open(img_path) page_text = pytesseract.image_to_string(img, lang="chi_sim") # 中文用chi_sim,英文留空或用eng full_text += f"--- 第{page_num+1}页 ---\n{page_text}\n" # 保存OCR结果 with open("ocr_result.txt", "w", encoding="utf-8") as f: f.write(full_text) print("OCR完成,结果已保存到ocr_result.txt")
方案二:直接对扫描PDF执行OCR(无需手动保存图片)
如果不想单独保存图片,可以用pdf2image把PDF直接转换成PIL图像对象,再喂给pytesseract,更高效:
步骤1:安装依赖库
pip install pdf2image pytesseract pillow
额外依赖:pdf2image需要poppler工具,Windows用户要下载poppler并配置路径;Linux用sudo apt-get install poppler-utils;Mac用brew install poppler
步骤2:直接处理PDF的代码示例
import pytesseract from pdf2image import convert_from_path import os # 配置Tesseract和poppler路径(按需设置) # pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # poppler_path = r'C:\poppler-23.08.0\Library\bin' # Windows下的poppler路径 pdf_path = "your_scanned_pdf.pdf" # 把PDF转换成图像列表 pages = convert_from_path( pdf_path, # poppler_path=poppler_path, # Windows用户需要加这个参数 dpi=300 # 提高dpi可以提升OCR准确率 ) full_text = "" for idx, page_img in enumerate(pages, start=1): # 直接对图像执行OCR page_text = pytesseract.image_to_string(page_img, lang="chi_sim") full_text += f"--- 第{idx}页 ---\n{page_text}\n" # 保存结果 with open("direct_ocr_result.txt", "w", encoding="utf-8") as f: f.write(full_text) print("直接OCR完成,结果已保存")
额外小提示
- 如果需要更高的OCR准确率,可以在处理图片前做一些预处理(比如灰度化、降噪),用PIL或者OpenCV都能实现
- 对于多语言混合的PDF,在
image_to_string的lang参数里可以指定多个语言,比如lang="chi_sim+eng"
内容的提问来源于stack exchange,提问作者Haroon S.




