图形验证码开源库 Tess4J 的使用
实际应用中,为了保护重要接口,防止用户恶意攻击或穷举破解,在发送业务请求时生成图片验证码,要求人工识别并填写,一并提交给后台验证,以确保是人为请求。图形验证码开源库 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 | sudo yum -y install tesseract ## 安装so和英文tessdata |
2.2 Windows 环境
Windows 版本的 Tesseract 本机库是用 VS2013(或者VS2012/VS2015) 构建的,所以必须安装 Microsoft Visual C++ 20XX Redistributable。
已经在 WinXP/Win7/Win10 上验证通过:安装 Visual C++ Redistributable for VS2013
32 位版本。
- Visual C++ Redistributable for VS2012:vcredist_x86.exe
- Visual C++ Redistributable for VS2013:vcredist_x86.exe
- Visual C++ Redistributable for VS2015:vc_redist.x86.exe
如果没有正确安装,运行时会报错:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Exception 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
目录下:
- eng.traineddata:阿拉伯数字和英文字符;
- chi_sim.traineddata:简体中文;
- chi_tra.traineddata:繁体中文。
1 | export TESSDATA_ENG=https://github.com/tesseract-ocr/tessdata/raw/master/eng.traineddata |
4 Java 工程中引用
4.1 工程源码(深入研究用)
https://github.com/tesseract-ocr/tesseract
4.2 pom.xml 中指定依赖
1 | <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
25public 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 | sudo yum install -y fontconfig ## 安装 fc-cache |
5.2 查看字体
1 | fc-list ## 所有字体 |