在Jupyter中使用img2table识别PDF表格时遭遇Tesseract相关OSError的解决请求
在Jupyter中使用img2table识别PDF表格时遭遇Tesseract相关OSError的解决请求
我来帮你分析下问题所在,然后给出不用修改系统PATH的解决方案:
问题根源
你已经给pytesseract指定了Tesseract的路径,但img2table的TesseractOCR类并不会读取pytesseract的配置——它默认会直接在系统PATH中查找tesseract命令,所以即使你本地装了Tesseract,它还是找不到。另外你的代码里还有一个逻辑小问题:在循环处理单页图片时,你又用整个PDF路径初始化了TableImage,这会导致每次循环都重复处理整个PDF,而不是当前页的内容。
不用修改PATH的解决方案
我们可以直接给img2table的TesseractOCR指定Tesseract的执行路径,同时修正循环中的图片处理逻辑:
指定Tesseract路径给
TesseractOCR
在初始化TesseractOCR时,通过cmd参数传入你的Tesseract完整路径,这样它就不需要依赖系统PATH了。修正
TableImage的初始化逻辑
在循环中,应该用当前处理的单页图片(而不是原PDF路径)来创建TableImage实例,这样才会处理当前页的表格。
修正后的完整代码片段
import pytesseract as ps import cv2 from pandas import DataFrame as df import numpy as np from PIL import Image from pdf2image import convert_from_path from img2table.ocr import TesseractOCR from img2table.document import Image as TableImage # 定义Tesseract的完整路径 tesseract_path = r'C:\Program Files\Tesseract-OCR\tesseract.exe' ps.pytesseract.tesseract_cmd = tesseract_path pdf_path = 'file.pdf' pages = convert_from_path(pdf_path, poppler_path=r'C:\poppler-24.08.0\Library\bin') for i, page_image in enumerate(pages, start=1): print(f"\n--- Страница {i} ---") # 图片预处理 img = np.array(page_image) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) pil_img = Image.fromarray(thresh) # 用当前页的图片初始化TableImage,而不是整个PDF stamp_img = TableImage(pil_img, detect_rotation=True) # 给TesseractOCR传入cmd参数指定路径 stamp = stamp_img.extract_tables(ocr=TesseractOCR(lang="rus", cmd=tesseract_path)) # 识别当前页文本 text = ps.image_to_string(pil_img, lang='rus') print(text.strip()) # 输出表格内容 for table in stamp: print(table.df)
额外检查点
- 确保你的Tesseract已经安装了俄语语言包(
rus.traineddata),它应该在C:\Program Files\Tesseract-OCR\tessdata目录下,如果没有的话可以从Tesseract官方语言包仓库下载。 - 确认
poppler的路径是正确的,你当前的设置看起来没问题,但如果遇到PDF转图片的问题可以再核对一下。
内容来源于stack exchange
相关产品推荐
相关产品推荐

