Java Category/Spring

구글 클라우드 비전 OCR API 스프링 부트에서 사용

ReBugs 2024. 3. 22.

구글 클라우드 비전 플랫폼 설정

API 및 서비스

구글 클라우드 의 콘솔 창으로 들어가면 왼쪽 상단의 버튼을 눌러 API 및 서비스 - 사용자 인증 정보로 들어간다.

 

 

사용자 인증 정보 창에서 사용자 인증 정보 만들기 버튼을 누른다.

 

 

 

API 키 를 추가한다.

 

 

API 활성화

이후 API 및 서비스 - 사용 설정된 API 및 서비스 버튼을 클릭한다.

 

 

Clould Vision API 를 사용 버튼을 누른다.

 

IAM 및 관리자

IAM 및 관리자 - 서비스 계정 버튼 클릭

 

 

아래의 정보들을 입력한다.

 

 

아래의 부분은 선택사항이다. 실험 결과 이 부분을 일부 누락해도 OCR API를 사용하는데 지장이 없었다.

 

 

만든 계정의 키 관리 버튼을 누른다.

 

새 키 만들기를 누른 뒤, JSON 파일을 다운로드 받는다.

스프링 부트 설정

환경변수 추가

 

스프링 부트 프로젝트에서 Edit - Configurations... 버튼을 누른다.

 

Modify Options 를 누르고 Environment variables 를 눌러 환경 변수를 추가해준다.

 

환경변수에 아래와 같이 입력한다.

핵심은 다운로드 받은 JSON 파일의 경로를 입력하는 것이다.

GOOGLE_APPLICATION_CREDENTIALS=JSON 파일의 경로(상대 경로도 가능)

 

 

 

스프링 부트 의존성 추가

build.gradle

dependencies {
	// Google Cloud Vision API 클라이언트 라이브러리
	implementation 'com.google.cloud:google-cloud-vision:3.34.0'
    
    ...
}

 

컨트롤러와 서비스 코드

서비스 코드

import com.google.cloud.vision.v1.AnnotateImageRequest;
import com.google.cloud.vision.v1.AnnotateImageResponse;
import com.google.cloud.vision.v1.BatchAnnotateImagesResponse;
import com.google.cloud.vision.v1.Feature;
import com.google.cloud.vision.v1.Image;
import com.google.cloud.vision.v1.ImageAnnotatorClient;
import com.google.protobuf.ByteString;
import org.springframework.stereotype.Service;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

@Service
public class VisionService {

    public String extractTextFromImageUrl(String imageUrl) throws Exception {
        URL url = new URL(imageUrl);
        ByteString imgBytes;
        try (InputStream in = url.openStream()) {
            imgBytes = ByteString.readFrom(in);
        }

        Image img = Image.newBuilder().setContent(imgBytes).build();
        Feature feat = Feature.newBuilder().setType(Feature.Type.TEXT_DETECTION).build();
        AnnotateImageRequest request = AnnotateImageRequest.newBuilder()
                .addFeatures(feat)
                .setImage(img)
                .build();
        List<AnnotateImageRequest> requests = new ArrayList<>();
        requests.add(request);

        try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {
            BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);
            StringBuilder stringBuilder = new StringBuilder();
            for (AnnotateImageResponse res : response.getResponsesList()) {
                if (res.hasError()) {
                    System.out.printf("Error: %s\n", res.getError().getMessage());
                    return "Error detected";
                }
                stringBuilder.append(res.getFullTextAnnotation().getText());
            }
            return stringBuilder.toString();
        }
    }
}

 

컨트롤러 코드

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OCRController {

    @Autowired
    private VisionService visionService;

    @GetMapping("/extract-text")
    public String extractText(@RequestParam("imageUrl") String imageUrl) {
        try {
            return visionService.extractTextFromImageUrl(imageUrl);
        } catch (Exception e) {
            //e.printStackTrace();
            return "Failed to extract text: " + e.getMessage();
        }
    }
}

 

 

포스트맨으로 테스트

위에서 작성된 코드는 포스트맨으로 아래와 같이 GET 요청으로 테스트를 할 수 있다.

http://localhost:8080/extract-text?imageUrl=웹상의 이미지 URL 경로

 

위 사진의 원본 경로는 https://gaussian37.github.io/assets/img/vision/etc/gcp/gcp.PNG 이다.

따라서 포스트맨으로 아래와 같이 입력한다.

 

그러면 응답으로 아래와 같은 결과가 반환된다.

 

참고 : https://bkyungkeem.tistory.com/40

댓글