본문 바로가기

Python/Default

Python PDF extract tool 정리

 언어의 한계상 대부분이 그렇듯 영어는 인식률이 높지만 한글은 아직 발전해야 할 부분이 많다.

 

1. OCR_SPACE

def ocr_space(filename, overlay=False, api_key='', language='eng'):
    payload = {'isOverlayRequired': overlay, 'apikey': api_key, 'language': language, }
    with open(filename, 'rb') as f:
        r = requests.post('https://api.ocr.space/parse/image', files={filename: f}, data=payload, )
    return r.content.decode()

 서비스는 웹에서 돌아가고 API를 통해 사용할 수 있다. 간단한 작업은 할 수 있지만 많은 양의 PDF를 처리하거나 큰 파일을 처리하려면 다른 친구를 알아보는 것이 좋다. 얘는 테이블 extract보다 ocr을 통한 문자 인식이기 때문에 아름답게 뽑긴 어렵다.

2. TABLUA

import tabula

def tabula_py(filename, options=''):
    df = tabula.convert_into(filename, "output.csv", output_format="csv")

 tabula-java가 원형이다. 여러 옵션을 통해 입출력 파일을 설정해 줄 수 있는데 특징 중 하나가 data frame으로 넘어온다는 점이다. 그냥 json으로 받을 경우 표 형식으로 다시 가공해주어야 한다는 단점이 있지만 얘는 그렇지 않다. 아직 국내에서는 많은 사람들이 사용하지 않는 듯 하다.

3. CAMELOT

import camelot

def camelot_py(filename, status):
    tables = camelot.read_pdf(filename, process_background=status)
    # return tables
    # df = tables[1].df
    # df.to_csv(filename+'.csv')
    camelot.plot(tables[0], kind='text')
    plt.show()

 가장 많이 사용하는 라이브러리다. 다양한 옵션을 가지고 있고 손쉽게 그래프로 그릴 수 있어서 시각화가 편하다. 

4. PDFplumber

import pdfplumber

def plum_daldal(filename):
    with pdfplumber.open(filename) as pdf:
        page = pdf.pages[0]
        print(page.extract_table())

 옵션도 무지 많고 지원하는 기능도 많은데 visual debugging이 되는 점이 장점이다. git의 공지를 읽어서 숙지하는 것이 좋아보인다.

https://github.com/jsvine/pdfplumber

5. PDFtables

 1번과 마찬가지로 API를 사용한다. 비슷한 느낌이므로 PASS


  그렇다면 여기서 드는 의문점이 있다. 라이브러리들은 어떻게 표를 구분해 내는 것일까? 이건 깜찍하게도 camelot이 알려주고 있다. 방법은 두 가지이다.

(1) Stream

 일반적인 표를 만들어보자.

컬럼1 컬럼2
내용1 내용1
내용2 내용2

 표는 일정한 공백을 가지고 있고 horizontal edge라고 부른다. 이 부분을 분석하며 열과 행을 찾아내는 것이다.

(2) Lattice

 위의 표를 다시 한 번 보자. 일정한 line을 가지고 있다. pdf를 이미지로 변환한 다음 수평, 수직 선분을 찾아내 이들 선분의 교차점을 찾아낸다. 이 좌표를 가지고 다시 표를 그리고 단어는 좌표에 따라 매핑시키는 것이다. lattice의 문제점은 은 선분을 찾아내지 못하면 표를 인식할 수 없다는 것이다.