简介:一套将Tesseract OCR引擎安装文件与中文简体语言包整合到一起的开发资料,面向需要在人工智能或Python这类编程项目中实现文字识别功能的开发者,能够解决安装配置繁琐、缺少中文识别数据等常见问题,适用于图片文字提取、文档扫描识别等通用场景。压缩包内含722个文件,总大小约33.78MB,主体由274个C++头文件和271个C++源文件构成,便于有二次开发需求的读者查看底层实现与调用流程;同时附带traineddata中文模型、多个训练与构建辅助文件、Shell脚本、示例图片及说明文档,既支持开箱即用地直接识别,也保留了自定义训练和参数调整的扩展空间。包内还提供了多个OCR核心工具的手册页面及演示样例,能帮助使用者理解命令行参数、输出格式与识别流程,遇到问题时可快速对照排查。目前已有3941人学习,适合刚接触OCR的初学者,也适合希望快速在项目中落地中文识别并继续深挖的开发者。
1. 拿到 tesseract-ocr安装包和中文语言包.rar,真正难的不是安装而是让中文被识别
网上搜“tesseract-ocr安装包和中文语言包.rar”的人,多半不是来研究 OCR 原理的,而是手里有一批中文截图、扫描件或单据图片,想用 Tesseract 批量把文字提取出来。这类 rar 的常见构成是 Tesseract 主程序安装包加一个 chi_sim.traineddata 中文语言包,目的就是解决一个痛点:官方主程序默认只带英文语言包,中文识别需要单独找训练数据,而很多环境下这个下载过程经常失败或不稳定。于是有人把主程序和中文语言包打成一个离线安装包流传,拿到就能装。这个包能解决“装不上”和“没中文”两层问题,但装完后还有个更隐蔽的坑:语言包虽然装进了系统,Tesseract 却未必会认它。这篇文章不聊算法,只讲把这个包从解压到跑通、再到能用脚本批量输出的完整落地路径,适合做自动化采集、档案数字化和数据处理的一线工程人员照做。
2. 拆包先看文件:主程序、语言包和 tessdata 目录各归其位
拿到 tesseract-ocr安装包和中文语言包.rar,第一件事不是急着双击安装,而是先解压看清楚里面有什么。Tesseract 在 Windows 上不是单一文件,它由主程序、训练数据和运行库三部分组成,而中文语言包是否有效,取决于它最终有没有被放到 tessdata 目录下。很多人装完发现“中文用不了”,就是因为跳过了这个目录检查步骤,让训练数据放错了位置。
2.1 安装包里到底有哪几类文件,各自管什么
先把解压后的文件分类看明白。通常这类安装包内会有以下几类内容,虽然名字可能略有出入,但角色是固定的:
Tesseract-OCR-setup-xxx.exe # 主程序安装包,Windows 下以 exe 形式存在 chi_sim.traineddata # 简体中文语言数据,必须放进 tessdata 目录 chi_sim_vert.traineddata # 中文竖排语言数据,处理竖版书刊时用 tessdata_fast/ # 快速识别版数据目录,识别速度优先 tessdata_best/ # 高精度版数据目录,准确率优先 readme.txt # 打包者写的说明,先看这个这里最容易混淆的是traineddata和安装包的关系。主程序 exe 负责执行识别,而chi_sim.traineddata是一份训练好的语言模型文件,里面包含了汉字字形、字符集和语言规则。Tesseract 每次启动时都按语言名去找对应的.traineddata文件,找不到就报错,找到但版本不匹配就会乱码,这是后续排查的主线。
如果你拿到的 rar 里只有主程序和chi_sim.traineddata,没有tessdata_fast之类的目录,也不用担心,那只是打包者做了精简。老版本 Tesseract 只有一套 tessdata,后来 4.0 之后才分出 fast 和 best 两个系列,工程上默认用 fast 就够,追求准确率才换 best。先确认包内文件归属,再进入安装环节,能省掉后面大量排查时间。
2.2 安装主程序时两个必须盯住的选项:语言数据目录与 PATH
执行主程序安装包时,安装向导里有几个选项容易看漏。大多数流传的安装包是基于 Windows 版 Tesseract 打包的,安装界面是标准的向导式,其中两个地方必须留意。
第一是语言数据组件勾选。新版安装器会提供一个语言多选列表,列出几十种语言,默认你直接勾掉中文也未必装得上,因为中文训练数据在官方安装器里并不随主程序分发。这正是你需要这个 rar 的原因:语言包通常是单独散装的,主程序装完后手动补进 tessdata,而不是靠安装器勾选。你在安装界面如果看到了Additional language data或多选语言列表,看一眼有没有简体中文,有就勾上,没有就记住之后要手动放语言包。
第二是 PATH 环境变量。安装到第三步时,界面会有一个Add Tesseract to your system PATH的复选框,强烈建议勾上。勾选后系统才能在任意命令行窗口直接调用tesseract命令;如果没勾,命令行运行会提示“不是内部或外部命令”,虽然可以通过指定完整路径使用,但后续接入 Python 和做批处理时都会多一层额外配置,属于典型的不给自己留余地。装完后目录默认在C:\Program Files\Tesseract-OCR,不建议改到带空格的深层路径之外的地方,保持默认更省心。
2.3 用 TESSDATA_PREFIX 把中文语言包指给 Tesseract
主程序装完,语言包还只是躺在解压目录里的一个静态文件,接下来要把它放进 tessdata 目录。常见做法是在文件管理器里直接打开C:\Program Files\Tesseract-OCR\tessdata,把chi_sim.traineddata复制进去;用命令行操作也一样,关键是目录不能错。
# 假设主程序装在默认路径,把简体中文语言包复制进 tessdata 目录 copy chi_sim.traineddata "C:\Program Files\Tesseract-OCR\tessdata\chi_sim.traineddata" # 如果 rar 里带竖排版中文语言包,一并复制 copy chi_sim_vert.traineddata "C:\Program Files\Tesseract-OCR\tessdata\chi_sim_vert.traineddata" # 设置 TESSDATA_PREFIX 环境变量,指向 tessdata 的上一级目录 setx TESSDATA_PREFIX "C:\Program Files\Tesseract-OCR"复制命令的逻辑是把语言数据文件放进 Tesseract 默认扫描的数据目录,这一步解决了“文件在但找不到”的问题。setx则是把数据根目录写进用户环境变量,注意这里写的一定是tessdata的上一级目录,也就是 Tesseract 的安装根目录,而不是tessdata本身。如果你把TESSDATA_PREFIX设成C:\Program Files\Tesseract-OCR\tessdata,Tesseract 反而会在该目录下继续找下一层 tessdata,导致加载失败,这个细节我从见过不少人在这翻车。
命令都执行完之后,需要新开一个命令行窗口让环境变量生效,然后连续跑两条验证命令:
# 查看版本,确认主程序正常 tesseract --version # 列出当前可用的语言包,看 chi_sim 是否出现 tesseract --list-langs这里的--list-langs是判断中文语言包是否被系统认到的关键命令。输出列表里有chi_sim,说明语言包已经进入了 Tesseract 的搜索路径,可以进入下一步实际识别测试;输出里没有chi_sim,则说明 tessdata 目录或者TESSDATA_PREFIX配置有问题,回头检查上一节的三条命令是否都执行成功。
3. tesseract 命令行跑通中文识别:最小命令与输出参数
很多文章在讲 Tesseract 时一上来就贴一堆命令参数,但没讲清每个参数解决什么问题。这一章从一条最小命令开始,把中文识别跑通,再逐步解释输出格式和语言参数的选择逻辑。一旦你理解了命令的组成部分,后续调参只是改参数值的问题,而不是翻文档大海捞针。
3.1 第一条识别命令:tesseract 图片路径 stdout -l chi_sim
准备工作做完后,找一张带中文的截图或扫描件,执行下面这条命令:
# 用简体中文语言包识别一张图片,结果直接打印到控制台 tesseract sample.png stdout -l chi_sim --psm 3 --oem 3拆开看各部分作用:sample.png是输入图片路径,stdout表示把识别结果输出到标准输出,也就是直接在命令行窗口显示,不改动任何文件;-l chi_sim指定使用简体中文语言包,这是本场景最核心的参数,漏掉它 Tesseract 会用默认的英语识别中文图片,输出一堆意义不明的字母;--psm 3表示使用自动页面分割,适用于大多数普通页面;--oem 3表示使用默认的 OCR 引擎模式,兼容性最好。
参数顺序上,stdout位置如果换成result,Tesseract 就会在当前目录生成一个result.txt文件。对于第一次测试,建议用stdout直接看输出,避免生成一堆临时文件还要手动清理。如果图片清晰、文字方向正常,命令执行后控制台会打印出识别到的中文文本;如果出现报错,按第 4 章的排查流程处理。
3.2 输出格式与四种 PSM 模式怎么选
识别结果不只是能显示在控制台,Tesseract 支持把结果写成多种格式文件,工程上最常用的是txt、tsv和pdf三种。其中tsv格式对后续做质量筛选特别有价值,因为它逐行输出了每个单词的位置框和置信度分数:
# 识别结果为带置信度和坐标的 TSV 文件,方便程序化处理 tesseract scan.png result -l chi_sim --psm 6 tsv # 识别结果直接输出为可检索的 PDF 文件 tesseract scan.png result -l chi_sim --psm 3 pdf第一条命令会生成result.tsv,内容包含每行文本的字符内容、包围盒坐标和置信度。置信度是识别引擎对当前结果的把握程度,通常 0 到 100,分数越高越可信,用它做自动化过滤可以在后续省下大量人工校对。第二条命令会把识别文字层嵌入 PDF,适合做扫描件归档。
--psm参数决定 Tesseract 如何把页面分成文本块,这参数选错会直接影响识别质量。实际工作中我一般按场景这么选:普通文档截图用--psm 3,它自动检测页面布局;单个文字块的正方形截图用--psm 6,它假设整张图是一段统一文本,识别率很稳;单行长文字用--psm 7;复杂排版、表格、多栏页面用--psm 3通常最好,--psm 6在这种场景下反而会因为忽略布局而把不同栏目混在一起。
3.3 中英文混合识别时同一张图的两个语言参数
中文和英文混排的图片在实际业务中占比很大,比如带英文姓名的合同扫描件、双语产品标签、包含快递单号的物流回单。Tesseract 的语言参数支持同时加载多个语言包,用加号连接即可:
# 同时使用简体中文和英语两个语言包,识别双语图片 tesseract bilingual.png stdout -l chi_sim+eng --psm 3这条命令的关键在于语言标识的写法:chi_sim是简体中文,eng是英语,中间用加号连接,表示两个语言包同时参与识别。执行时 Tesseract 会分别加载两种语言模型,在同一张图里自动区分中英字符,比单用chi_sim识别英文姓名准确很多。
chi_sim只处理中文,遇到英文时可能出现字母漏识别或识别成中文形近字;反过来单用eng处理中文则完全不可用,因为英语模型里没有中文字符集。所以混合内容图片一定要显式写成-l chi_sim+eng,不要偷懒省掉eng。另外,如果你的图片是竖排中文,要把语言标识换成chi_sim_vert,这个特殊语言包在官方的通用训练数据里没有,需要单独下载,这也是很多 rar 包会附带chi_sim_vert.traineddata的原因。
4. 中文识别失败排查:常见报错、乱码与识别率边界
这一章是真正让新手和熟手拉开差距的地方。Tesseract 的安装和单命令识别都简单,但真实场景里你会遇到各种玄学问题:明明语言包复制过去了却还是报错,明明识别命令没报错但结果是乱码,甚至安装过程中直接被系统拦截。下面按最常见的几类问题逐个列出,每一条都按现象、原因、解决三步说明。
4.1 报错“Failed loading language 'chi_sim'”且--list-langs看不到中文
现象是执行识别命令时,控制台提示无法加载chi_sim语言,用tesseract --list-langs查不到中文包。这类问题基本可以锁定在语言包没有被主程序找到。
原因分两种:一是.traineddata文件根本没有放进tessdata目录,只是躺在解压文件夹里;二是文件放进去了,但是TESSDATA_PREFIX环境变量没设置或指向错误,导致 Tesseract 在错误路径找数据文件。
解决上先确认文件位置,C:\Program Files\Tesseract-OCR\tessdata\下必须有chi_sim.traineddata;再确认环境变量,TESSDATA_PREFIX应该指向C:\Program Files\Tesseract-OCR,而不是tessdata子目录本身。改完环境变量后重新打开命令行窗口,再跑--list-langs,把这两步做完,这类报错的 90% 都能解决。剩下 10% 是安装包用了精简版注册表,这种情况我一般建议直接重启一次系统,让环境变量彻底刷进进程环境。
4.2 语言列表里有 chi_sim,识别结果却全是乱码
--list-langs能列出chi_sim,说明语言包已经被识别到了,但实际输出是一堆符号或英文字母,这是另一个高频坑。
原因通常是语言包与主程序版本不匹配。Tesseract 4.x 和 5.x 需要对应版本系列的.traineddata,如果你从网上某个教程里下载了老旧的 Tesseract 3.x 语言包放进新版程序里,加载时不会报错明显错误,但识别结果会完全不可读。另外,有些流传的语言包本身是损坏的半文件,下载后解压没有校验过程,也会出现加载成功但识别乱码。
解决方法是确认主程序和语言包同源。你拿到的这个tesseract-ocr安装包和中文语言包.rar如果是打包者自己整理的一体包,通常主程序和语言包版本是配套的,乱码概率较低;如果是你在两个渠道分别下载后拼凑的,那就要检查tesseract --version输出的版本号,去对应渠道重新下载匹配的chi_sim.traineddata。
4.3 安装到最后一步闪退,提示缺少 vcruntime140.dll
在部分精简版 Windows 或未安装过开发环境的机器上,运行 Tesseract 安装包时会弹出缺少vcruntime140.dll的错误,安装进程直接回滚。这是因为 Tesseract 的 Windows 发行版依赖微软 Visual C++ 运行库,运行库里包含了这个 DLL,而目标机器未预装它。
不要直接去下载一个vcruntime140.dll然后复制到 system32 目录,这种做法经常引发系统级 DLL 冲突,属于给自己找更大的麻烦。正确做法是安装微软官方 Visual C++ Redistributable 运行库包,也就是常说的 VC++ 运行库,装完后再重新执行 Tesseract 主程序安装包。安装运行库时注意选择与系统位数一致的版本,64 位系统就装 x64 版。这个坑本身不难解决,但很多人会卡在“文件明明是完整 rar 包,为什么安装会失败”的经验判断上,忽略运行库依赖,值得单独列出来提示一句。
4.4 中文字体小图识别出来是空的:预处理是后悔药
现象很常见:识别命令正常执行,控制台没有报错,但输出的文本为空,或者只有零星几个字。这类问题通常不是 Tesseract 坏了,而是输入图片质量不达标。
Tesseract 对低分辨率、低对比度的图片特别敏感,中文笔画结构复杂,一个 12 号文字的截图如果分辨率只有几十乘几十像素,识别引擎无法从中提取特征,就会输出空白。原因还包括扫描件光照不均、背景带网格线、文字颜色与背景色接近等。解决思路是先做图片预处理,而不是反复调整 Tesseract 参数。
常用做法是把图片在画图工具或自动化脚本中放大两倍,转成灰度图,再做二值化处理。第 5 章有完整的预处理代码,这一章先说结论:遇到空输出时,先用看图工具把原图放大两倍另存为 PNG 再识别一次,这操作能解决一大半问题。如果放大后依然空输出,再检查图片是否反色,比如白字红底,这类图需要先取反色再送识别引擎,否则中文模型基本认不出来。
4.5 繁体与竖排文本用错语言标识,方向直接翻车
处理繁体或竖排书刊时,如果仍然用默认的-l chi_sim,识别结果会惨不忍睹。chi_sim模型针对简体横排文本训练,对繁体字率敏感,而竖排文字如果缺少竖排方向信息,Tesseract 会在字符排序上出错,输出成一团乱序的字符串。
解决上繁体文档使用-l chi_tra,注意这是繁体语言包,需要额外下载chi_tra.traineddata。竖排文本使用-l chi_sim_vert,它内置了竖排文字的行序和列序逻辑,配合--psm 5或--psm 6使用效果比较稳定。如果你的 rar 包里没带这两个文件,后续用到时去官方语言数据渠道补齐即可,这部分属于按需扩展,不影响主程序运行。
5. pytesseract 接入与批处理:让安装包变成能交付的 OCR 工具
命令行跑通只是第一步,实际工程里很少有人一条一条敲命令去识别图片。通常的做法是把 Tesseract 嵌入 Python 脚本,用 pytesseract 这个封装库调用本地安装的 tesseract.exe,再配合 Pillow 做图像预处理,最后批量产出文本或结构化数据。这样处理几十张、几百张图片时,才具备可交付性。
5.1 pytesseract 连接本地 tesseract-ocr 的最短三行
先安装 Python 依赖,再写调用代码。pytesseract 本身不含识别引擎,它只是把命令行工具的输入输出封装成 Python 接口,真正干活的还是你刚装好的 Tesseract 主程序。
# 安装 pytesseract 和 pillow 图像处理库 pip install pytesseract pillow安装完写一个最小调用示例:
# ocr_min.py import pytesseract from PIL import Image # 指向本地 tesseract.exe 的完整路径,Windows 上必须显式指定 pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" # 打开图片并调用中文识别 text = pytesseract.image_to_string(Image.open("sample.png"), lang="chi_sim", config="--psm 3 --oem 3") print(text)这段代码里最关键的一行是tesseract_cmd的路径指定。即使你安装时勾选了 PATH,在 Python 进程内仍有可能因为环境变量刷新不及时而找不到命令,显式写绝对路径可以彻底消灭这种不确定性。image_to_string的第一个参数可以直接传 PIL 图像对象,避免每次识别前都要先写临时文件。返回值是识别出的字符串,后续可以直接写入数据库或文件。
5.2 用 Pillow 先放大二值化再喂给识别引擎
第 4 章提到图片预处理是识别率的后悔药,这里给出具体代码。Pillow 能做灰度化、缩放、二值化和反色操作,哪个操作需要启用取决于原图问题:
# preprocess.py from PIL import Image def preprocess_for_ocr(path: str) -> Image.Image: img = Image.open(path).convert("L") # 转灰度图 scale = 2 if img.width < 800 else 1 # 小图放大,大图不动 img = img.resize((img.width * scale, img.height * scale), Image.LANCZOS) # 高质量缩放 # 二值化:小于阈值的像素变黑,其余变白 threshold = 140 img = img.point(lambda x: 0 if x < threshold else 255) return img这段预处理代码对低分辨率截图效果最明显。convert("L")把彩色图转成灰度,消除颜色干扰,中文识别主要依赖字形灰度特征,彩色信息反而会增大计算量。缩放用LANCZOS重采样,比普通NEAREST更能保留笔画边界。二值化的threshold是调节点,背景偏白时取 140 到 160 之间比较稳;若扫描件偏暗,可以降到 100 到 120,以保留深色笔画。如果遇到白字红底这类反色图,在灰度化之后加一行img = img.point(lambda x: 255 - x),把深浅对调后再送识别。
5.3 批量跑一个文件夹:脚本与置信度筛选
批量识别是自动化落地的基本形态,下面给一个可直接改路径投入使用的骨架脚本。这个脚本遍历指定目录下的所有图片,逐张调用 Tesseract 识别,把结果写入同名文本文件,同时记录置信度:
# batch_ocr.py import os import csv import pytesseract from PIL import Image pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" src_dir = r"D:\scans" out_dir = r"D:\ocr_output" os.makedirs(out_dir, exist_ok=True) images = [f for f in os.listdir(src_dir) if f.lower().endswith((".png", ".jpg", ".jpeg", ".bmp"))] with open(os.path.join(out_dir, "confidences.csv"), "w", newline="", encoding="utf-8-sig") as cf: writer = csv.writer(cf) writer.writerow(["filename", "text", "min_conf"]) for name in images: img = Image.open(os.path.join(src_dir, name)) result = pytesseract.image_to_string( img, lang="chi_sim", config="--psm 6 --oem 3") out_name = os.path.splitext(name)[0] + ".txt" with open(os.path.join(out_dir, out_name), "w", encoding="utf-8") as f: f.write(result) data = pytesseract.image_to_data( img, lang="chi_sim", output_type=pytesseract.Output.DICT, config="--psm 6 --oem 3") confs = [int(c) for c in data["conf"] if c != "-1"] min_conf = min(confs) if confs else 0 writer.writerow([name, result[:50], min_conf]) print(f"done: {name}")脚本有两个值得注意的设计。一是image_to_data返回的conf列表里,-1表示该区域为空白或非文本,过滤掉后再取最小值,得到整张图最不可靠的置信度。二是 CSV 编码指定为utf-8-sig,这样用 Excel 直接打开 CSV 时中文文件名和文本内容不会乱码,这个细节容易忽略。--psm 6在这里假设每个文件都是一段独立文本块,如果你的图片是复杂的多区块页面,改成--psm 3更稳妥。跑完一批图后,CSV 里min_conf低于 40 的文件就是需要人工复核的黑匣子,直接批量丢进重新识别流程,而不是全部手工处理。
6. 用置信度过滤给中文识别结果兜底
识别完成不等于数据可用,Tesseract 输出的文本必须经过一层置信度质检,否则 OCR 的错误字符会悄悄混进业务数据,清洗成本比识别成本高得多。最后的进阶操作是,不只看最终文本,而是用 TSV 格式拿到每个字符的位置和置信度,再设定一个过滤阈值,把不自信的区域单独抽出来处理。
# quality_check.py import pytesseract from PIL import Image pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" img = Image.open("sample.png") data = pytesseract.image_to_data( img, lang="chi_sim", output_type=pytesseract.Output.DICT, config="--psm 6 --oem 3") lines = {} for i, conf in enumerate(data["conf"]): if conf == "-1": continue conf = int(conf) if conf >= 60: # 只有置信度 >= 60 的文本才被认为可靠 key = data["line_num"][i] lines.setdefault(key, []).append(data["text"][i]) for line_num in sorted(lines): print(f"[{line_num}] {''.join(lines[line_num])}")阈值 60 是一个可调的起始值。合同级文档我通常提到 80,全信度高但会漏掉一部分倾斜字;日志和流水账号类数据用 60,保证尽可能多的文本被提取。把每个整行的文本拼接时要注意字符之间有空格,text字段里包含了 Tesseract 输出词间空格,行拼接时可先做一次strip()再合并。我现在的习惯是 OCR 输出和原始图片永远一起归档,不留只有文本没有图的历史包袱,省得几个月后数据对不上时没有后悔药。哪种图片用什么参数组合,也要顺手记在一个参数表里,换人接手时不用重新踩一遍坑。希望帮到你。
本文还有配套的精品资源,点击获取