图形验证码开源库 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 环境

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 位版本。

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

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 目录下:
- eng.traineddata:阿拉伯数字和英文字符;
- chi_sim.traineddata:简体中文;
- chi_tra.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

4 Java 工程中引用

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

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

4.2 pom.xml 中指定依赖

<dependency>
    <groupId>net.sourceforge.tess4j</groupId>
    <artifactId>tess4j</artifactId>
    <version>3.4.1</version>
</dependency>

4.3 Java 代码中使用

确保其中的 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);
    }
}

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

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

5.1 添加字体

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 查看字体

fc-list ## 所有字体
fc-list :lang=zh ## 中文字体

猜你喜欢

转载自blog.csdn.net/kefengwang/article/details/81165646