通过自维护的敏感词库利用DFA技术和阿里云的第三方接口已经可以满足文本内容安全校验。
但是有些用户可能会发一些图片,在图片上加一些违规内容,阿里云的图片检测只能检测涉黄、暴恐涉政、违规、二维码等不良场景,他是无法校验文本是否违规的。其实使用阿里云的图片OCR识别是可以进行检测的,但是公司可能不希望承担这笔费用,想要节省开支。所以如果我们自己去校验的话,就需要利用OCR技术识别图片中的文字,然后将文字添加到需要文本内容检测的字段中,再利用DFA技术和阿里云的内容文本检测就可以判断用户发送的图片内容是否违规了。
OCR技术简介
OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程
常见的OCR技术:
- 百度OCR,这种是收费的
- Tesseract-OCR,这是Google维护的开源OCR引擎,支持Java,Python等语言调用
- Tess4J,封装了Tesseract-OCR ,支持Java调用,比谷歌的更实用一些
Tess4j的使用
- 引入依赖
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.1.1</version>
</dependency>
- 创建工具类,简单封装一下tess4j
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")//表示此类引用yml中的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;
}
}
- 如果工具类是在一个单独的模块中,没有启动类,需要利用springboot自动装配原理,在resources目录下创建META_INF包,创建spring.factories文件,在文件中添加以下内容,这样就可以让此类注册成为bean对象进行使用了:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.heima.audit.tess4j.Tess4jClient
- 在需要使用此工具类的微服务的yml配置中添加两个属性:
tess4j:
data-path: E:\workspace\tessdata # 表示tesseract的本地包路径
language: chi_sim # 表示检测图片中的中文
- @Autowired注入tess4jClient,将需要审核的图片转成BufferedImage类型,通过tess4jClient对象调用doOCR方法,传入图片,就可以将图片中设计的文本生成字符串返回给你了。
测试举例:
/**
* 测试文本内容审核
*/
@Test
public void testScanText() throws Exception {
byte[] bytes = fileStorageService.downLoadFile("http://192.168.200.130:9000/leadnews/2021/11/19/test.png");
//将图片的字节数组转换为butteredImage
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
BufferedImage imageFile = ImageIO.read(in);
//识别图片的文字
String result = tess4jClient.doOCR(imageFile);
System.out.println("图片文字识别结果 "+result);
}