Skip to content

Instantly share code, notes, and snippets.

@migusdn
Last active July 14, 2023 19:55
Show Gist options
  • Save migusdn/4866566dc6706361a98a65337ce99d7e to your computer and use it in GitHub Desktop.
Save migusdn/4866566dc6706361a98a65337ce99d7e to your computer and use it in GitHub Desktop.
PDF OCR using Google Vision API

Google Vision API 를 이용한 JAVA 기반 OCR 프로그램

1. 프로그램 구동 환경 및 사용언어

사용언어

JAVA

구동환경

OS      : Windows, Linux
Require : JDK or JRE version 1.8

2. 사용한 기술

Google Cloud Vision API(Document OCR), Apache PDFBOX, Apache POI, JAVA, Maven ...

3. 흐름도

 전체적인 프로그램의 흐름도 입니다. 사용자가 PDF Document를 입력하면 프로그램이 이를 처리한후 사용자가 원하는 Format으로 출력해 줍니다.

제목 없는 다이어그램-5

4. 주요 기능

 프로그램을 구성하는 주요 기술에 대한 설명 입니다.

PDF File 전처리

OCR을 요청하기 위해 PDF속의 데이터를 요청 가능한 형태로 전처리 하는 과정입니다.

 아래 예시의 getPDFDtoList는 제공된 PDF에서 이미지와 텍스트를 추출해내는 Method 입니다. 해당 Method는 Apache PDFbox를 이용하여 각 페이지의 이미지와 텍스트를 DTO형태로 묶고, 이를 List 자료형으로 반환해 줍니다.

//preprocessing Example
public ArrayList<PDFDto> getPDFDtoList() throws IOException {
    log.info("Image And Text Extraction Start.");
    PDPageTree pages = pdDocument.getPages();
    int PDSize = pages.getCount();
    for (int i = 1; i < PDSize + 1; i++) {
        PDFDto dto = new PDFDto();
        BufferedImage bufferedImage = null;
        PDResources pdResources = pages.get(i - 1).getResources();
        //image extraction start
        for (COSName c : pdResources.getXObjectNames()) {
            PDXObject o = null;
            try {
                o = pdResources.getXObject(c);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (o instanceof org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) {
            try {
                if(((PDImageXObject) o).getHeight()<300)
                    continue;
                bufferedImage = ((PDImageXObject) o).getImage();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //init PDFDto
    dto.setPage(i);
    dto.setTextContent(getTextFromPage(i));
    dto.setImage(bufferedImage);
    pdfDtoArrayList.add(dto);
}
    log.info("Extraction Finish.");
    pdDocument.close();
    return pdfDaoArrayList;
}

키워드 좌표 기반 파싱

OCR Result 값을 요구사항에 맞는 문서로 파싱하기 위해 Keyword 좌표 기반으로 Section을 구분하고 이를 통해 각 섹션마다 미리 정의된 문서 양식에 맞게 정보를 추출해냅니다. 아래 이미지는 문서의 대략적인 형태 예시입니다.

제목 없는 다이어그램 drawio-3

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment