Sử dụng Tesseract tạo server OCR với Spring boot

Sử dụng Tesseract tạo server OCR với Spring boot




1. Tesseract là gì?



Tesseract là một OCR (Optical Character Recognition) engine hàng đầu hiện nay. Công cụ này được phân phối với bản quyền mã nguồn mở Apache 2.0. Nó hỗ trợ nhận diện kí tự trên các tập tin hình ảnh và xuất ra dưới dạng kí tự thuần, html, pdf, tsv, invisible-text-only pdf. Người dùng có thể sử dụng trực tiếp hoặc lập trình viên có thể sử dụng các chức năng thông qua API.

Tesseract được phát triển bởi Hewlett-Packard Laboratories Bristol tại Hewleett-Packard Co, Greeley Colorado từ 1985 đến 1994. Sau đó, nó được cập nhật một số thay đổi nhỏ và tạm ngưng phát triển từ sau 1998. Đến năm 2005, Tesseract được phân bố dưới dạng mã nguồn mở bởi HP và được phát triển bởi Google từ năm 2006.

Hiện tại, Tesseract đã phát triển đến version 3.0x và có thể hoạt động trên 3 hệ điều hành phổ biến là Window, Mac và Linux. Công cụ này hỗ trợ nhận diện kí tự của hơn 100 ngôn ngữ khác nhau, bao gồm cả tiếng Việt. Không những thế, chúng ta có thể huấn luyện chương trình dùng Tesseract để có thể nhận diện một ngôn ngữ nào đó.



2. Cài đặt và chuẩn bị cho project (trên môi trường Linux)



a> Maven Dependency


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

b> Tải dữ liệu tessdata từ Github


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


c> Cài đặt Tesseract cho Linux bằng câu lệnh:


sudo apt-get install tesseract-ocr



Kiểm tra version


tesseract -v




3. Tạo project



Bước 1: tạo project Spring Boot cơ bản

Bước 2: Đổi tên thư mục dữ liệu tessdata-master mà bạn download từ git về thành tessdata và copy vào trong project

Bước 3: Thêm Dependency vào trong project

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

Cấu trúc project

Class DemoOrcServerApplication

import net.sourceforge.tess4j.Tesseract;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
 
@SpringBootApplication
public class DemoOrcServerApplication {
 
   public static void main(String[] args) {
       SpringApplication.run(DemoOrcServerApplication.class, args);
   }
 
   @Bean
   Tesseract getTesseract(){
       Tesseract tesseract = new Tesseract();
       tesseract.setDatapath("./tessdata");
       return tesseract;
   }
 
}


Class OcrController

import com.example.demoorcserver.dto.OcrResult;
import com.example.demoorcserver.services.OcrService;
import net.sourceforge.tess4j.TesseractException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
 
import java.io.IOException;
 
@RestController
@RequestMapping("/ocr")
public class OcrController {
   @Autowired
   private OcrService ocrService;
 
   @PostMapping("/upload")
   public ResponseEntity<OcrResult> upload(@RequestParam("file") MultipartFile file) throws IOException, TesseractException {
       return ResponseEntity.ok(ocrService.ocr(file));
   }
}


Class OcrResult


import lombok.Data;
 
@Data
public class OcrResult {
   private String result;
}


Class OcrService


import com.example.demoorcserver.dto.OcrResult;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
 
@Service
public class OcrService {
   @Autowired
   private Tesseract tesseract;
 
   public OcrResult ocr(MultipartFile file) throws IOException, TesseractException {
       File convFile = convert(file);
       String text = tesseract.doOCR(convFile);
       OcrResult ocrResult = new OcrResult();
       ocrResult.setResult(text);
       return ocrResult;
   }
 
   public static File convert(MultipartFile file) throws IOException {
       File convFile = new File(file.getOriginalFilename());
       convFile.createNewFile();
       FileOutputStream fos = new FileOutputStream(convFile);
       fos.write(file.getBytes());
       fos.close();
       return convFile;
   }
}


4. Kiểm tra kết quả



Input của chúng ta là tấm ảnh



Dùng postman để kiểm tra:



Như vậy chương trình của chúng ta đã hoạt động tốt.



Bài hướng dẫn của mình đến đây là kết thúc. Cám ơn các bạn đã xem!