Tesseract:从命令行到网页 OCR 图文识别实践

2026-09-23 79 浏览 0 评论 0 字

一、Tesseract 是什么

Tesseract 是谷歌开源的 OCR(光学字符识别,Optical Character Recognition)引擎,由 HP 实验室最初研发、后由 Google 维护。它能把图片中的文字识别为可编辑的文本,支持 100 多种语言,包括简体中文和英文。它能识别常见的 JPG、PNG、WEBP 等格式图片,是目前应用最广的免费开源 OCR 方案之一。

本文通过 myblog 项目里的一个「图文识别」小工具,讲解它是如何把 Tesseract 的命令行能力封装成一整套 网页端识别流程 的。

二、识别是如何工作的

Tesseract 本身是一个命令行程序,本项目通过 Node.js 的 child_process.execFile 调用它:

execFile(
  'tesseract',
  [image, 'stdout', '-l', 'chi_sim+eng', '--psm', '6', 'tsv'],
  { maxBuffer: 1024 * 1024 * 50 },
  ...
)

参数解读:

  • image :待识别的图片路径
  • stdout :直接输出到标准输出,而不是写入文件
  • -l chi_sim+eng :同时加载简体中文 + 英文两种语言包
  • --psm 6 :把整张图当作一个统一的文本块处理,适用于大多数文档截图
  • tsv :输出 TSV 格式的详细结果 - 每个被识别的「词」都会带坐标、宽高和置信度

返回的 TSV 再用 csv-parser 解析成结构化数据,每条记录包含:

text       识别的文字
x / y      词在图片中的左上角坐标
width/height  宽高
conf       置信度(只有 conf >= 0 的词才会被收录)

有了这些坐标数据,前端才能真正实现「识别框叠加在图片上」的联动效果。

三、安装与使用

1. 安装 Tesseract

本项目是通过系统命令调用 Tesseract,所以 服务器上必须先安装它及其语言包 :

  • macOS : brew install tesseract tesseract-lang
  • Ubuntu/Debian : apt-get install tesseract-ocr tesseract-ocr-chi-sim
  • Windows :下载发行版安装并加入 PATH

确认安装成功: tesseract --version 。

2. 页面使用流程

页面上分为三步卡片式布局( 1. 图片输入 → 2. 图片预览 → 3. 识别结果 ):

  1. 选择识别模式 :通用文本 / 表格识别
  2. 输入图片 :本地上传,或粘贴图片链接
  3. 点击「开始识别」 ,稍候即可查看:
  • 图片预览 区会展示原图,并在识别出的文字处叠加 红色识别框 ;鼠标悬停某段文字时,对应的识别框会高亮为蓝色。
  • 识别结果 区按段落展示文字,每段带序号, 点击即可复制该段 ,还支持「复制全部」「下载 TXT」。
  • 表格模式则输出表格并支持「复制 Markdown」「下载 CSV」。

3. 前端调用后端

前后端通过接口 /api/v1/tesseract 通信。controller 在 tesseract.js 里根据 mode 参数分发:

const data = await (mode === 'table'
  ? this.ctx.service.tesseract.table(filepath)
  : this.ctx.service.tesseract.index(filepath));
  • mode = text → 通用文本识别
  • mode = table → 表格识别

最终返回 { code, data, success, mode } ,前端拿到 data 渲染结果。

四、识别表格的原理

表格识别复用了相同的基础识别,但额外对「词」的坐标做了 启发式聚类 ,把文字重新拼回行列网格:

  1. 按 x 坐标聚合成列 :位置相近的词归到同一列。
  2. 按 y 坐标聚合成行 :纵向距离相近的词归到同一行。
  3. 为每个词定位行列 :填入对应的格子。
  4. 每个格子内的词按 x 排序拼接成单元格文本(中英混合拼接时有针对性的空格处理)。
  5. 输出:
  • cells :二维数组网格
  • markdown :拼好的 Markdown 表格(自动在第二行加 --- 分隔线)
  • rows / cols :行列数

这种方案 无需安装额外的表格识别模型 ,特别适合 有清晰边框、排版规整 的表格图片。

五、文本分段的细节

通用文本识别后,还做了一层「从词 → 行 → 段落」的归并:

  • 词合并成行 : mergeLines 按 y 坐标把同一水平线上的词归为一行,并按 x 排序拼接文字。
  • 行合并成段落 : mergeParagraphs 根据行间垂直间距和左对齐程度,判断哪些连续的行属于同一个段落,间隔过大或缩进明显变化时另起一段。
  • 中英拼接空格规则 :两个相邻单词都是字母/数字时自动加空格,中文则不加,避免「中文和英文粘连」。

每个段落都带 bbox (边界框)坐标,这正是前端画识别框的数据来源。

六、注意事项

  1. 依赖前置安装 :本项目靠系统 tesseract 命令工作,部署时必须保证命令和 简体中文语言包 chi_sim 可用,否则中文识别会失败。
  2. 图片质量很关键 :清晰、对比度高、文字行尽量水平的图片效果最好;模糊、倾斜、光照不均会明显降低识别率。
  3. --psm 6 的适用场景 :适合整块文本;如果图片是单行文字、多页文档或带复杂结构,可能需要换用其他 PSM 模式。
  4. 表格要求 :启发式聚类依赖坐标, 适合规整、有边框 的表格;复杂合并单元格、无边框、歪斜的表格效果会打折扣。
  5. 低置信度过滤 : conf >= 0 的阈值会滤掉识别置信度过低的残句,减少噪声但对低质量图片可能丢字。
  6. 大文件限制 :命令设置了 maxBuffer (50MB),超大或超长图片要注意内存占用与超时。
  7. 性能 :识别是同步阻塞进程,图片较大时耗时较长,页面也提供了「识别中…」的加载提示与按钮禁用。

七、小结

Tesseract 的单机文字识别能力 + 坐标级结构化输出,配合简单的坐标聚类,就组合出了一套「通用文本 + 表格」的完整 OCR 工具。坐标信息让它不只是返回文字,还能在前端与原图做 可视化联动比对 ,这比单纯给出一段文本要实用得多。


在线测试地址: https://www.wenjiangs.com/tool/tesseract ​


发布评论

发布评论前请先 登录。
0 评论
点赞
收藏

评论列表 0

暂无评论