(1)편에 이어 이번에는 spring.java 프로젝트에서 적용시켜보려고 한다.
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);
}
[request 형식]
https://cloud.google.com/vision/docs/reference/rest/v1/AnnotateImageRequest#Image
-> 사이트 보면 content, source로 사진을 request 하는 것을 볼 수 있다.
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 vision에서 제공하는 OCR api를 연결할 수 있다 !!
주의할점만 조심하면 편하게 연결이 가능한 것 같다.