글쓴이 보관물: litcoder

한글 텍스트 추출을 위한 Python PDF module

이 내용은 2020년 3월에 작성된 것으로 참조하는 시점에 따라 변경된 사항들이 있을 수도 있습니다.

PyPDF2

PyPDF2는 PDF file의 metadata 정보를 가져오거나 페이지 단위로 나누거나 합치는 등의 여러가지 편리한 기능들을 제공한다. 하지만 한글을 제대로 추출하지 못하는 문제가 있어서(한글 뿐 아니라 CJK 모두 라고 함) 목적에는 적합하지 않았다.

PDFMiner

한글 처리는 문제 없다. 그런데 페이지 단위로 나누어서 처리하는 것을 따로 지원하지 않아서 원하는 페이지에 접근하려면 순차적으로 처음부터 해당 페이지를 찾아가는 trick을 사용해야 하는데, 이 코드로 순차적 접근을 하면 시간 복잡도가 O(N^2)가 되어 파일의 크기가 조금만 커도 성능이 매우 떨어진다.

# PDFminer random access trick.
for pageNumber, page in enumerate(PDFPage.get_pages(fileobject)):
  # 요청된 페이지를 발견하면 텍스트 추출
  if pageNumber is reqPage: 
    interpreter.process_page(page)
    text = retstr.getvalue()

Tika

많은 곳에서 쓰이는 꽤나 유명한 프로젝트인데 Python module로도 proting 되어 있다(tika-python). 한글 추출에는 문제가 없고, 이 모듈 자체에서는 페이지 단위의 텍스트 추출을 지원하지 않으나, 그대신 PDF를 XML로 추출한 다음에 BeautifulSoupe로 <div page=””> 태그를 찾아 페이지 단위로 접근하는 신박한 트릭이 있다(StackOverflow). 나는 BeautifulSoup의 paser로 lxml을 사용했다.

주의. 명시적으로 표시 되지는 않지만 JRE(Java Runtime Environment)에 의존하므로 동작시 오류가 발생하면 JRE가 제대로 설치 되어 있고 접근 가능한지 확인해 볼 것. Ubuntu 18.04 default-jre package (OpenJDK 11)로 동작 확인.

$ java --version
openjdk 11.0.6 2020-01-14
OpenJDK Runtime Environment (build 11.0.6+10-post-Ubuntu-1ubuntu118.04.1)
OpenJDK 64-Bit Server VM (build 11.0.6+10-post-Ubuntu-1ubuntu118.04.1, mixed mode, sharing)

결론

PDF 문서 자체에 대한 합치기/나누기/정보 가져오기 등은 PyPDF2가 무척 편하다. 한글 텍스트 추출을 위해서는 Tika, 페이지 단위 접근이 필요하다면 Tika + BS를 고려해 볼 만하다. PDFMiner는 뭐랄까.. 쫌 별로..