赞
踩
实际应用中,为了保护重要接口,防止用户恶意攻击或穷举破解,在发送业务请求时生成图片验证码,要求人工识别并填写,一并提交给后台验证,以确保是人为请求。图形验证码开源库 Tess4J 生成的图片验证码还有拉伸、扭曲、干扰等功能,同时它还有识别简单图片中验证码的功能。本文总结了 Tess4J 的用法。
作者:王克锋
出处:https://kefeng.wang/2017/04/22/tess4j/
版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。
是个 OCR 开源项目,支持 Java。
https://github.com/tesseract-ocr/tesseract/wiki
官方文档:Tess4J Usage
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 目录
Windows 版本的 Tesseract 本机库是用 VS2013(或者VS2012/VS2015) 构建的,所以必须安装 Microsoft Visual C++ 20XX Redistributable。
已经在 WinXP/Win7/Win10 上验证通过:安装 Visual C++ Redistributable for VS2013
32 位版本。
如果没有正确安装,运行时会报错:
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)
选定一个本地目录(TESSDATA_PREFIX
),用来存放字形数据文件;
进入:https://github.com/tesseract-ocr/tessdata
下载以下语言包文件,保存到 ${TESSDATA_PREFIX}/tessdata/eng.traineddata
目录下:
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
https://github.com/tesseract-ocr/tesseract
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>3.4.1</version>
</dependency>
确保其中的 TESSDATA_PREFIX
设置正确;
指定验证码图片,即可直接输出识别结果。
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);
}
}
这是因为引用了操作系统中不存在的字体。
http://openxtiger.iteye.com/blog/2265132
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 ## 重启生效(通常不必)
fc-list ## 所有字体
fc-list :lang=zh ## 中文字体
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。