Python ocrmypdf脚本打包为单exe后报languages属性错误求助
问题根因
报错核心原因是打包exe时未将ocrmypdf依赖的tesseract语言包、内置校验插件、Ghostscript运行资源打包进单文件。ocrmypdf启动时会自动探测运行环境的语言配置,PyCharm中运行时可以直接读取系统Python环境的全局依赖,探测正常;打包为单文件exe后运行在临时隔离环境,探测不到对应配置返回None,访问languages属性时直接抛出异常。
修复步骤
1. 前置依赖校验
先确认本地环境所有依赖安装完整,避免后续打包缺文件:
- 安装Tesseract OCR引擎,安装时勾选需要识别的语言包(英文默认必选,识别中文需额外勾选简体中文语言包),记录安装目录
- 安装Ghostscript,ocrmypdf和camelot处理PDF流都依赖该组件
- 安装Python侧依赖包,执行命令:
pip install ocrmypdf camelot-py[cv] openpyxl pyinstaller
2. 调整业务代码
补全路径适配逻辑、显式指定OCR参数避免自动探测失败,同时增加文件选择判空,修改后完整代码如下:
import os import sys import ocrmypdf import camelot from tkinter import Tk from tkinter.filedialog import askopenfilename # PyInstaller单文件打包路径适配 def resource_path(relative_path): if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, relative_path) return os.path.join(os.path.abspath("."), relative_path) if __name__ == '__main__': Tk().withdraw() filename = askopenfilename(filetypes=[("PDF文件", "*.pdf")]) if not filename: sys.exit(0) print(f"选中处理文件:{filename}") # 把Tesseract、Ghostscript路径加入环境变量,避免运行时找不到命令 tesseract_path = resource_path('tesseract') gs_path = resource_path('ghostscript') os.environ['PATH'] = f"{tesseract_path};{gs_path};{os.environ['PATH']}" # 显式传入OCR参数,禁止自动探测 ocrmypdf.ocr( input_file=filename, output_file='output.pdf', deskew=True, language='eng+chi_sim', # 按需调整语言,英文填eng,简体中文填chi_sim use_threads=True, progress_bar=False ) # OCR完成后提取表格 tables = camelot.read_pdf('output.pdf', pages="1-end", flavor='stream') print(f"识别到表格总数:{tables.n}") tables.export(f"{filename}_表格导出结果.xlsx", f='excel')
3. 执行打包命令
禁止直接使用默认pyinstaller -F xxx.py命令打包,需手动指定要收集的依赖和附加的二进制文件,Windows环境打包命令参考:
pyinstaller -F -w OCR_Menu.py ^ --add-data "C:\Program Files\Tesseract-OCR;tesseract" ^ --add-data "C:\Program Files\gs\gs10.03.0\bin;ghostscript" ^ --collect-all ocrmypdf ^ --collect-all camelot ^ --collect-all pdfminer ^ --hidden-import PIL._tkinter_finder
注意:替换命令里的Tesseract、Ghostscript路径为你本地的实际安装目录;如果是macOS/Linux环境打包,把路径分隔符
;换成:,命令换行符^换成\即可。
常见问题排查
- 打包后exe体积过大是正常现象,因为内置了Tesseract和Ghostscript组件,仅识别英文的话可以删除Tesseract目录下
tessdata文件夹里不需要的语言包(保留eng.traineddata即可),能减少30%左右体积 - 如果启动后提示权限错误,把exe放到非系统盘的用户目录下运行即可,不要放在Program Files等需要管理员权限的目录
- 表格识别错位可以调整camelot的
flavor参数为lattice(适合有明确边框线的表格),或者调整edge_tol、row_tol等精度参数
内容的提问来源于stack exchange,提问作者battledj
相关产品推荐
相关产品推荐

