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
https://pymupdf.readthedocs.io/en/latest/
'Python > PDF' 카테고리의 다른 글
[PDF] Merge PDF (0) | 2023.06.28 |
---|