Google cloud vision OCR API 적용하기(2)

devguri·2024년 1월 24일
0

(1)편에 이어 이번에는 spring.java 프로젝트에서 적용시켜보려고 한다.

환경변수

  • (1)편에서 받은 환경변수를 꼭 설정해줘야한다.
    GOOGLE_APPLICATION_CREDENTIALS -> 값으로 json 파일 경로를 입력한다.

OcrController


public ResponseEntity<MessageResponse> checkAndVerifyOcrData(@RequestHeader Long userId, @RequestPart MultipartFile image) throws IOException {
        if (image.isEmpty()) {
            throw new IllegalArgumentException("Image cannot be empty");
        }
        byte[] bytes = image.getBytes();
        var responseDto = healthService.checkAndVerifyOcrData(ByteString.copyFrom(bytes), userId);
}
  • @RequestPart MultipartFile image -> 이미지를 multipart form data로 받아올것이다
  • 그리고 content로 전달하기 위해 이미지를 바이트 코드로 바꾸는 작업을 진행했다.

[request 형식]
https://cloud.google.com/vision/docs/reference/rest/v1/AnnotateImageRequest#Image

-> 사이트 보면 content, source로 사진을 request 하는 것을 볼 수 있다.

OcrWebClient

  • 해당 데이터를 google에서 제공해주는 api로 요청한다.
public List<OcrDataResponseDto> uploadImage(ByteString bytes){
        List<AnnotateImageRequest> requests;
        requests = makeRequestBuilder(bytes);

        try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {
            BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);
            List<AnnotateImageResponse> responses = response.getResponsesList();

            for (AnnotateImageResponse res : responses) {
                if (res.hasError()) {
                    System.out.format("Error: %s%n", res.getError().getMessage());
                    return null;
                }

                return makeResponseBuilder(res.getFullTextAnnotation().getPages(0));
            }
        } catch (Exception exception) {
            throw new RuntimeException(exception);
        }
        return null;
    }

makeRequestBuilder

public List<AnnotateImageRequest> makeRequestBuilder(ByteString bytes) {
        List<AnnotateImageRequest> requests = new ArrayList<>();
        Image image = Image.newBuilder().setContent(bytes).build();
        Feature feature = Feature.newBuilder().setType(Feature.Type.DOCUMENT_TEXT_DETECTION).build();
        AnnotateImageRequest request = AnnotateImageRequest.newBuilder()
                .addFeatures(feature)
                .setImage(image)
                .build();
        requests.add(request);

        return requests;
    }
    

-> request 타입을 만들어줘야한다.

makeResposneBiulder

public List<OcrDataResponseDto> makeResponseBuilder(Page page) {
        List<OcrDataResponseDto> responseDtoList = new ArrayList<>();
        page.getBlocksList().forEach(block -> {
            block.getParagraphsList().forEach(paragraph -> {
                List<OcrDataVertexVo> vertices = paragraph.getBoundingBox().getVerticesList().stream()
                        .map(OcrDataVertexVo::of)
                        .toList();

                String text = paragraph.getWordsList().stream()
                        .map(word -> word.getSymbolsList().stream()
                                .map(Symbol::getText)
                                .collect(Collectors.joining()))
                        .collect(Collectors.joining());

                responseDtoList.add(OcrDataResponseDto.of(text, vertices));

            });
        });

        return responseDtoList;
    }
    
  • 해당 결과에 대해 원하는 형식으로 response를 만들어준다.

  • ImageAnnotatorClient.create()로 google cloud와 연결해준다

[주의할점 !!!]

  • 환경변수 위치 제대로 체크 !!!! (연결 안 하면 google cloud랑 연결안됨)
    현재 환경에서 google cloud 연결을 위해 필요함 !!!
  • 카카오 api나 애플에서 api 연결시에 webClient로 직접 연결했었기 때문에, 여기서도 그렇게 하려고 했는데 구글은 gradle에서 import 받아오면 자체적인 코드로 연결이 가능한 것 같다 (매우 편함)
  • response dto도 파싱하지 않고 구글에서 제공하는 dto에 그대로 넣으면 된다.
  • 거기서 원하는 데이터 쓰면됨

이런식으로 google cloud vision에서 제공하는 OCR api를 연결할 수 있다 !!
주의할점만 조심하면 편하게 연결이 가능한 것 같다.

profile
Always live diligently

0개의 댓글

관련 채용 정보