引入包:
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>tesseract-platform</artifactId>
<version>4.0.0-rc2-1.4.3</version>
<!-- <version>3.04.01-1.3</version> -->
</dependency>
<!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j -->
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.3.0</version>
<!-- <version>3.2.1</version> -->
</dependency>
代码:
ITesseract instance = new Tesseract();
// instance.setOcrEngineMode(TessOcrEngineMode.OEM_TESSERACT_LSTM_COMBINED);
instance.setDatapath(datapath);
instance.setLanguage(lanaguage);
try {
String result = instance.doOCR(file).replaceAll("“|_", " ").replaceAll("ˇ", " ").replaceAll("\n+", "|")
.replaceAll(" ", "");
String[] s1 = result.split("\\|");
//String payDate = null;// 支付时间
String tradeNum = null;// 订单单号
String merNum = null;// 商户单号
if (result.indexOf(TRADE_NUM_NAME) >= 0) {
// 微信订单
for (int i = 0; i < s1.length; i++) {
String s = s1[i];
if (s.indexOf(TRADE_NUM_NAME) >= 0) {
tradeNum = s.substring(TRADE_NUM_NAME.length());
if (s1[i + 1].indexOf(MER_NUM_NAME) < 0) {
tradeNum += s1[i + 1];
}
} else if (s.indexOf(MER_NUM_NAME) >= 0) {
merNum = s.substring(TRADE_NUM_NAME.length());
}
}
} else if (result.indexOf(ALI_TRADE_NUM_NAME) >= 0) {
//支付宝订单
for (int i = 0; i < s1.length; i++) {
String s = s1[i];
if (s.startsWith(ALI_TRADE_NUM_NAME)) {
tradeNum = s.substring(ALI_TRADE_NUM_NAME.length());
/* if (s1[i + 1].indexOf(ALI_MER_NUM_NAME) < 0) {
java.util.regex.Pattern pattern=java.util.regex.Pattern.compile("[0-9]*");
java.util.regex.Matcher match=pattern.matcher(s1[i + 1]);
if(match.matches()) {
tradeNum += s1[i + 1];
}
} */
}else if (s.indexOf(ALI_MER_NUM_NAME) >= 0) {
if(i+1<s1.length) {
merNum = s1[i+1];
}
}
}
if(merNum == null) {
merNum = s1[s1.length-1];
}
}
if (tradeNum == null) {
return null;
}
//map.put(PAY_DATE, payDate);
map.put(TRADE_NUM, tradeNum);
map.put(MER_NUM, merNum == null ? "" : merNum);
return map;
} catch (TesseractException e) {
e.printStackTrace();
}
return null;
环境搭建:
Tess4J是Tesseract的Java JNA wrapper。本文介绍了在CentOS 7 操作系统中使用Tess4J的步骤及注意事项。
Tesseract
Tesseract 是一个著名的开源OCR引擎,支持100多种语言,可以开箱即用。还可以通过训练方式支持更多语言。Tesseract诞生于1984年,来自HP公司,2005年开源。自2006年起,由谷歌接手开发。截止目前,最新的稳定版本是2017年6月1日发布的3.05.01。还有一只比较活跃的基于LSTM(长短期记忆网络,是一种时间递归神经网络)的4.0版本,还在研发中,最新释放的是2018年6月26日的4.0.0-beta.3。Tesseract由C++开发。
站点:
https://github.com/tesseract-ocr/tesseract
Leptonica
Tesseract作为OCR引擎,避免不了使用图像处理。Tesseract使用的图像处理主要由leptonica提供。Leptonica 包含众多图像处理和图像分析相关的功能。
Java JNA Wrapper
JNA 是 Java Native Access的缩写,顾名思义,是一个实现Java调用操作系统Native应用的库。提起Java本地调用,大家自然联想的JNI,但JNI使用过程十分复杂,会让人望而生畏。JNA则采取更加自然的方式,为Java应用提供调用本地应用的支持。
站点:
https://github.com/java-native-access/jna
Tess4J
Tess4J通过Java JNA Wrapper,提供了Java的Tesseract API,同时还提供了Windows 32bit和64bit的Tesseract的DLL以及一些样例图像。通过Tess4J,可以在Windows下非常便利的通过Java使用Tesseract。对于Linux、MAC等其他操作系统,则需要自行构建Tesseract才可以使用Tess4J。
也就是说,原生的Tess4J并不是跨平台的,仅仅是对Windows开箱即用的。
ess4J:4.0.2
Tesseract:4.0.0-beta.1
Leptonica:1.76.0
JDK:1.8 Update 102 64bit
运行环境:CentOS 7 (内核:3.10.0-862.3.3.el7.x86_64)64bit
GCC:4.8.5
Clang:3.4
开发环境:Windows 10 64bit
为何这样选?
这里的坑是,不能根据自己的喜好,使用新版本。我使用过Tesseract 4.0.0-beta.3,但运行JVM会报出Fatal Error最后自行退出,看报出的错误来判断,大概是Tesseract中某些函数签名变化,Tess4J中签名与之不匹配所致。
构建Tesseract
1 修改yum的Repo
可能是我所在的环境网络非常差,yum默认会使用mirror,但绝大部分mirror连接不上,会导致下载过程在大量无效的mirror尝试中进行,非常浪费时间。
因此,我关闭了yum的fast mirror插件(/etc/yum/pluginconf.d),另外修改了CentOS-Base.repo。
2 安装必备包
yum -y update
yum -y install libstdc++ autoconf automake libtool autoconf-archive pkg-config gcc gcc-c++ make libjpeg-devel libpng-devel libtiff-devel zlib-devel
yum group install -y “Development Tools”
注意:autoconf-archive 是官方说明中都没有提到的必备组件。
3 下载源码
Leptonica
http://www.leptonica.com/source/leptonica-1.76.0.tar.gz
Tesseract
https://codeload.github.com/tesseract-ocr/tesseract/tar.gz/4.0.0-beta.1
安装:
cd leptonica-1.76.0
./autobuild
./configure
make -j
make install
tar -zxvf 4.0.0-beta.1.tar.gz
cd tesseract-4.0.0-beta.1/
./autogen.sh
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig LIBLEPT_HEADERSDIR=/usr/local/include ./configure –with-extra-includes=/usr/local/include –with-extra-libraries=/usr/local/lib
LDFLAGS=”-L/usr/local/lib” CFLAGS=”-I/usr/local/include” make -j
make install
ldconfig
确认安装
经过漫长的编译过程,Tesseract已经安装完毕。
执行如下指令:
tesseract -v
获取so库
在/usr/local/lib中,可以找到Tess4J需要的依赖库libtesseract.so。可见libtesseract.so实际指向libtesseract.so.4.0.0。liblept.so是leptonica的库,Tesseract也需要调用。
但这种方式修改了Tess4J公开发布的JAR包,日后升级会有麻烦,因此,不建议这样操作。
2 将linux-x86-64放到Java工程的classpath根目录。这样在运行时,Tess4J就可以找到库了。我的Java工程采用的Gradle构建,因此将这些文件放到了src/main/resources下。
linux-x86-64目录中包含的文件,是从Linux系统中/usr/local/lib拷贝而来,去掉了一些链接文件,具体如下
在Tess4J设置Tesseract数据目录tessdata
Tesseract运行时是需要加载语言的训练数据的,按照约定,这些训练数据需要放在tessdata下。但Tess4J 4.0.2对Windows和Linux两类操作系统目录处理方式是不一致的。
初始化Tesseract的代码,setDatapath就是用来设置tessdata目录的。
或者使用 cp /usr/local/lib* /usr/lib