본문 바로가기
Python/PDF

[PDF] Text 추출하기: PyPDF2 vs. PyMuPDF

by ds31x 2023. 6. 28.
version : PyPDF 2.11.1 (from Mamba), PyMuPDF 1.22.5 (from pip)

 

여러 pdf처리 library가 있지만, 그나마 제일 많이 써본 터라 PyPDF2를 선호한다.

추출 정확도는 PyMuPDF보다 좀  떨어지는 거 같지만, 익숙함이 주는 편의성을 무시 못한다.

현재 최신 version은 3.11.1 이지만, 내가 사용하는 mamba에서는 2.11.1로 설치가 이루어짐. 

 

우선 다음과 같은 2개의 페이지를 가진 pdf에서 텍스트를 추출해봤다.

위 그림은 90도로 font들이 돌아가있는 첫번째 페이지이고,

위 그림은 일반적인 orientation으로 기재된 두번째 페이지를 보여줌.

 

이를 다음과 같이 각 페이지 별로 orientation에 맞게 추출을 해봤다.

 

사용된 code snipet은 다음과 같음.

import PyPDF2 as pd
import os

def to_plain_text(a):
    r = a.replace('\n','')
    return r

def main():
    # file_name = 'BIOS_and_CMOS.pdf'
    file_name = 'oriented_test.pdf'
    
    # script파일과 같은 경로에 있는 것을 가정.
    current_path = os.path.dirname(__file__)
    print('current dir:', current_path)

    fstr = os.path.join(current_path, file_name)
    reader = pd.PdfReader(fstr)
    
    # 전체 page 수를 출력.
    print('# of pages:',reader.numPages)
    
    # orientation 각도들.
    ori = [0, 90, 180, 270]
    
    # 페이지마다 텍스트 추출. (orientation에 맞추어.)
    for idx, page in enumerate(reader.pages):
        # page = reader.pages[idx]

        for a in ori: 
            print(f'------------\npage: {idx}, oriented: {a}\n')
            txt = page.extract_text(a)
            print(to_plain_text(txt))

#===============================================
            
if __name__ == "__main__":
    main()

결과는 다음과 같음.

current dir: /home/dsaint31/lectures/intro_python/pdf
# of pages: 2
------------
page: 0, oriented: 0

.   .     .
------------
page: 0, oriented: 90

테스트입니다테스트입니다한글테스트
------------
page: 0, oriented: 180


------------
page: 0, oriented: 270


------------
page: 1, oriented: 0

여기 원래대로임 . 
------------
page: 1, oriented: 90


------------
page: 1, oriented: 180


------------
page: 1, oriented: 270

폰트를 90도로 회전시킨 페이지에서 각각의 마침표는 0도로 생각하고 분리된 것을 볼 수 있음.

 

같은 페이지를 PyMuPDF로 처리하는 코드는 다음과 같음.

(orientation처리 없이 그대로 추출함)

import fitz 
import os

def to_plain_text(a):
    r = a.replace('\n','')
    return r

file_name = 'BIOS_and_CMOS.pdf'
file_name = 'oriented_test.pdf'

current_path = os.path.dirname(__file__)
print('current dir:', current_path)

fstr = os.path.join(current_path, file_name)
doc = fitz.open(fstr)
print('# of pages:',len(doc))

for idx, page in enumerate(doc):
    
    print(f'------------\npage: {idx}\n')
    txt = page.get_text()
    print(to_plain_text(txt))

결과는 다음과 같음.

current dir: /home/dsaint31/lectures/intro_python/pdf
# of pages: 2
------------
page: 0

테스트입니다.   테스트입니다.    한글 테스트.
------------
page: 1

여기 원래대로임.

 

두 라이브러리 모두 간단한 text 추출엔 큰 문제가 없다. 물론 복잡한 layout의 pdf에선 꽤 고생을 각오해야한다. ==;;

 

 

References

https://pypdf2.readthedocs.io/en/3.0.0/user/extract-text.html

 

Extract Text from a PDF — PyPDF2 documentation

Extract Text from a PDF Edit on GitHub © Copyright 2006 - 2008, Mathieu Fenniak. Revision 3214dde1. Built with Sphinx using a theme provided by Read the Docs.

pypdf2.readthedocs.io

https://pymupdf.readthedocs.io/en/latest/

 

PyMuPDF 1.22.5 documentation

Next Features Comparison

pymupdf.readthedocs.io

 

'Python > PDF' 카테고리의 다른 글

[PDF] Merge PDF  (0) 2023.06.28