文章目录
  1. 1 关于 tesseract-ocr
  2. 2 准备操作系统环境
    1. 2.1 Linux 环境
    2. 2.2 Windows 环境
  3. 3 准备字形数据
  4. 4 Java 工程中引用
    1. 4.1 工程源码(深入研究用)
    2. 4.2 pom.xml 中指定依赖
    3. 4.3 Java 代码中使用
  5. 5 生成的验证码图片出现乱码
    1. 5.1 添加字体
    2. 5.2 查看字体

实际应用中,为了保护重要接口,防止用户恶意攻击或穷举破解,在发送业务请求时生成图片验证码,要求人工识别并填写,一并提交给后台验证,以确保是人为请求。图形验证码开源库 Tess4J 生成的图片验证码还有拉伸、扭曲、干扰等功能,同时它还有识别简单图片中验证码的功能。本文总结了 Tess4J 的用法。

作者:王克锋
出处:https://kefeng.wang/2017/04/22/tess4j/
版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。

1 关于 tesseract-ocr

是个 OCR 开源项目,支持 Java。
https://github.com/tesseract-ocr/tesseract/wiki

2 准备操作系统环境

官方文档:Tess4J Usage

2.1 Linux 环境

1
2
3
4
sudo yum -y install tesseract ## 安装so和英文tessdata
sudo yum -y install tesseract-langpack-chi_sim.noarch ## 安装简体中文
sudo yum -y install tesseract-langpack-chi_tra.noarch ## 安装繁体中文
sudo ls -l /usr/share/tesseract/tessdata/*.traineddata ## tessdata 目录

2.2 Windows 环境

Windows 版本的 Tesseract 本机库是用 VS2013(或者VS2012/VS2015) 构建的,所以必须安装 Microsoft Visual C++ 20XX Redistributable。
已经在 WinXP/Win7/Win10 上验证通过:安装 Visual C++ Redistributable for VS2013 32 位版本。

如果没有正确安装,运行时会报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Exception in thread "main" java.lang.UnsatisfiedLinkError: 找不到指定的模块。
at com.sun.jna.Native.open(Native Method)
at com.sun.jna.Native.open(Native.java:1759)
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:260)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:398)
at com.sun.jna.Library$Handler.<init>(Library.java:147)
at com.sun.jna.Native.loadLibrary(Native.java:412)
at com.sun.jna.Native.loadLibrary(Native.java:391)
at net.sourceforge.tess4j.util.LoadLibs.getTessAPIInstance(LoadLibs.java:75)
at net.sourceforge.tess4j.TessAPI.<clinit>(TessAPI.java:42)
at net.sourceforge.tess4j.Tesseract.init(Tesseract.java:368)
at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:281)
at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:213)
at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:197)
at wang.kefeng.utils.VerifyCode.decode(VerifyCode.java:28)
at wang.kefeng.dasi.DasiUsers.doLogin(DasiUsers.java:84)
at wang.kefeng.dasi.DasiDumper.main(DasiDumper.java:423)

3 准备字形数据

选定一个本地目录(TESSDATA_PREFIX),用来存放字形数据文件;
进入:https://github.com/tesseract-ocr/tessdata
下载以下语言包文件,保存到 ${TESSDATA_PREFIX}/tessdata/eng.traineddata 目录下:

1
2
3
export TESSDATA_ENG=https://github.com/tesseract-ocr/tessdata/raw/master/eng.traineddata
sudo mkdir -p $CATALINA_HOME/lib/tessdata
sudo wget $TESSDATA_ENG -O $CATALINA_HOME/lib/tessdata/eng.traineddata

4 Java 工程中引用

4.1 工程源码(深入研究用)

https://github.com/tesseract-ocr/tesseract

4.2 pom.xml 中指定依赖

1
2
3
4
5
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>3.4.1</version>
</dependency>

4.3 Java 代码中使用

确保其中的 TESSDATA_PREFIX 设置正确;
指定验证码图片,即可直接输出识别结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class VerifyCode {
private static final Logger logger = LoggerFactory.getLogger(VerifyCode.class);
public static final String TESSDATA_PREFIX = System.getenv("CATALINA_HOME");

public static String decode(String imageFile) {
Tesseract instance = new Tesseract();
instance.setDatapath(TESSDATA_PREFIX);

try {
File file = new File(imageFile);
String result = instance.doOCR(file);
return result.trim();
} catch (TesseractException e) {
logger.warn(e.getMessage(), e);
}

return null;
}

public static void main(String[] args) {
String imageFile = "D:/test.png";
String text = VerifyCode.decode(imageFile);
logger.info(text);
}
}

5 生成的验证码图片出现乱码

这是因为引用了操作系统中不存在的字体。
http://openxtiger.iteye.com/blog/2265132

5.1 添加字体

1
2
3
4
5
6
7
8
9
sudo yum install -y fontconfig ## 安装 fc-cache
sudo mkdir /usr/share/fonts/windows
cd /usr/share/fonts/windows
## Windows 资源管理器打开文件夹 C:\Windows\Fonts 并拉入以下文件
## 英文字体: Calibri, Cambria, Consolas, Georgia, Verdana
## 中文字体: SimSun(宋体), KaiTi(楷体), LiSu(隶书), Microsoft YaHei(微软雅黑), STXinwei(华文新魏)
sudo chmod 644 *.ttf ## 所有用户可用
sudo fc-cache ## 建立缓存
## sudo reboot ## 重启生效(通常不必)

5.2 查看字体

1
2
fc-list ## 所有字体
fc-list :lang=zh ## 中文字体
文章目录
  1. 1 关于 tesseract-ocr
  2. 2 准备操作系统环境
    1. 2.1 Linux 环境
    2. 2.2 Windows 环境
  3. 3 准备字形数据
  4. 4 Java 工程中引用
    1. 4.1 工程源码(深入研究用)
    2. 4.2 pom.xml 中指定依赖
    3. 4.3 Java 代码中使用
  5. 5 生成的验证码图片出现乱码
    1. 5.1 添加字体
    2. 5.2 查看字体