You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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_stringlang参数里可以指定多个语言,比如lang="chi_sim+eng"

内容的提问来源于stack exchange,提问作者Haroon S.

火山引擎 最新活动