Spring Boot应用程序里集成Tess4J来实现OCR(光学字符识别),以识别出本地和远程图片中的文字
一、添加依赖
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.5.4</version>
</dependency>
二、添加Tessdata语言库
github:https://gitcode.com/tesseract-ocr/tessdata/tree/main
百度云盘下:https://pan.baidu.com/s/1uuSTBNo3byJib4f8eRSIFw 密码:8v8u
三、创建OCR服务类
@Service
public class OcrService{
/**
负责执行对本地文件的OCR任务
*/
public String recognizeText(File imageFile)throws TesseractException{
Tesseract tesseract = new Tesseract();
//设定训练文件的位置(如果是标准英文识别,此步可省略)
tesseract.setDatapath("你的tessdata各语言集合包地址");
tesseract.setLanguage("chi_sim");
return tesseract.doOCR(imageFile);
}
/**
则先将远程图片下载到本地,然后再执行OCR
*/
public String recognizeTextFromUrl(String imageUrl)throws Exception{
URL url = new URL(imageUrl);
InputStream in = url.openStream();
Files.copy(in, Paths.get("downloaded.jpg"), StandardCopyOption.REPLACE_EXISTING);
File imageFile = new File("downloaded.jpg");
return recognizeText(imageFile);
}
}
四、建立REST控制器
@RestController
@RequestMapping("/api/ocr")
public class OcrController{
private final OcrService ocrService;
// 使用构造器注入OcrService
public OcrController(OcrService ocrService) {
this.ocrService = ocrService;
}
//处理用户上传的本地图片
@PostMapping("/upload")
public ResponseEntity<String> uploadImage(@RequestParam("file") MultipartFile file){
try{
File convFile = new File(System.getProperty("java.io.tmpdir")+"/"+file.getOriginalFilename());
file.transferTo(convFile);
String result = ocrService.recognizeText(convFile);
return ResponseEntity.ok(result);
}catch(Exception e){
e.printStackTrace();
return ResponseEntity.badRequest().body("识别发生错误:" + e.getMessage());
}
}
//处理给定URL的远程图片
@GetMapping("/recognize-url")
public ResponseEntity<String> recognizeFromUrl(@RequestParam("imageUrl") String imageUrl) {
try {
String result = ocrService.recognizeTextFromUrl(imageUrl);
return ResponseEntity.ok(result);
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.badRequest().body("从URL识别发生错误:" + e.getMessage());
}
}
}
五、测试
本地测试:
远程测试:
根据实际情况调整配置,例如在多语言环境中设置正确的语言包等。