- 什么是OCR?
OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程.
2. Tess4J
2.1 简介
Tesseract-OCR ,Google维护的开源OCR引擎,支持Java,Python等语言调用。而Tess4J 封装了Tesseract-OCR ,支持Java调用
Tesseract-OCR特点:
-
Tesseract支持UTF-8编码格式,并且可以“开箱即用”地识别100多种语言。
-
Tesseract支持多种输出格式:纯文本,hOCR (HTML),PDF等
-
官方建议,为了获得更好的OCR结果,最好提供给高质量的图像。
-
Tesseract进行识别其他语言的训练
具体的训练方式,请参考官方提供的文档: https://tesseract-ocr.github.io/tessdoc/
2.2 使用
依赖
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.1.1</version>
</dependency>
字体库
https://pan.baidu.com/s/1NP4D1UXRoQX1VwmH-cLxNw?pwd=6666 提取码:6666
这里使用的中文类库chi_sim.traineddata
测试
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import java.io.File;
public class Application {
public static void main(String[] args) {
try {
//获取本地图片
File file = new File("D:\\测试\\测试.png");
//创建Tesseract对象
ITesseract tesseract = new Tesseract();
//设置字体库路径 (你的chi_sim.traineddata放的个文件夹
tesseract.setDatapath("D:\\Tess4J\\tessdata");
//中文识别 chi_sim.traineddata的前缀
tesseract.setLanguage("chi_sim");
//执行ocr识别
String result = tesseract.doOCR(file);
//替换回车和tal键 使结果为一行
result = result.replaceAll("\\r|\\n","-").replaceAll(" ","");
System.out.println("识别的结果为:"+result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试结果
2.3 封装工具类
配置文件
tess4j:
data-path: D:\Tess4J\tessdata
language: chi_sim
工具类
import lombok.Getter;
import lombok.Setter;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.awt.image.BufferedImage;
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "tess4j")
public class Tess4jClient {
private String dataPath;
private String language;
public String doOCR(BufferedImage image) throws TesseractException {
//创建Tesseract对象
ITesseract tesseract = new Tesseract();
//设置字体库路径
tesseract.setDatapath(dataPath);
//中文识别
tesseract.setLanguage(language);
//执行ocr识别
String result = tesseract.doOCR(image);
//替换回车和tal键 使结果为一行
result = result.replaceAll("\\r|\\n", "-").replaceAll(" ", "");
return result;
}
}