파이썬 pdf 파일 읽기, 어떤 패키지를 사용해야 하는가?

2019. 10. 14. 06:30

파이썬이 많이 활용되는 분야 중의 하나는 업무자동화이다. 화면캡쳐, 키보드/마우스 자동화 등 유용한 패키지들이 많기 때문에 다양한 작업들을 해 볼 수 있다. 특히 업무에 많이 사용하는 오피스와 연동할 수 있는 패키지들은 굉장히 유용하다. 업무와 관련해서 많이 사용하는 pdf파일도 파이썬에 컨트롤 할 수 있다. 다만 pdf파일을 읽을 수 있는 모듈이 다수가 있다는 것이다.

오늘은 파이썬에서 pdf파일 읽기가 가능한 모듈과 각각의 특징(?)들에 대해서 알아보도록 하겠다.


파이썬_pdf



필자가 테스트를 해 본 패키지는 총 4개이다. 그 중에 2개는 pdf파일을 텍스트로만 변경할 수 있는 패키지이다. PyPDF2와 pdftotext인데 pdftotext사용을 추천한다. 왜냐하면 PyPDF2는 필자가 사용한 파일에서 띄워쓰기 날라갔기 때문이다.

나머지 2개는 HTML로도 읽을 수 있는 패키지이다. pdf파일에 있는 표는 텍스트로 읽을 경우 표의 형태가 날아간다. pdftotree와 pdfminer인데 필자가 사용한 파일에서는 둘 다 작동하지 않았다. pdf파일에 따라서 작동유무가 갈리지 않을까 추측해본다.


그럼 하나씩 알아보도록 하자.



1. PyPDF2


바이트 스트림으로 파일을 열어서, PDF의 파일 정보와 텍스트를 가져올 수 있는 모듈이다. 사용하기는 어렵지 않았으나, 필자가 사용한 PDF파일에는 띄우쓰기가 날아가는 현상이 발생했다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
import PyPDF2
 
file = open("./mlb_predict.pdf"'rb')
fileReader = PyPDF2.PdfFileReader(file)
 
fileReader.pageMode()
 
# 문서의 정보를 읽어드린다
fileReader.documentInfo
 
# 전체 페이지수를 출력한다
print(fileReader.numPages)
 
# 첫 번째 페이지 정보를 가져온다
pageObj = fileReader.getPage(0)
 
# 페이지 정보의 텍스트를 가져온다
text = pageObj.extractText()
 
cs



2. pdftotext


PDF문서의 텍스트만 필요하다고 하면 이 패키지를 사용하면 된다. 사용방법도 간단하고 띄우쓰기도 없어지지 않았다. 파이썬의 open함수를 이용해서 바이트 스트림으로 파일을 열고, pdftotext 객체를 만든 후에 사용하면 된다.


아래와 같이 단 3줄이면 PDF파일을 읽을 수 있다. 텍스트는 페이지 별로 리스트 자료형으로 저장된다.


1
2
3
4
5
6
 
import pdftotext
 
file = open("./mlb_predict.pdf"'rb')
fileReader = pdftotext.PDF(file)
 
cs


페이지 수를 알고 싶으면, len함수를 이용하면 된다. fileReader변수에는 리스트 자료형이 들어가 있다.


1
print("총 페이지수는 {}입니다.".format(len(fileReader)))
cs


특정 페이지의 텍스트를 추출하고 싶다면, 리스트 인덱싱을 하면 된다. 아래와 같이 입력하면 첫페이지의 텍스트를 확인할 수 있다.

1
fileReader[0]
cs

띄워쓰기 뿐만 아니라 개행문자(\n)도 그대로 변환되어 필자는 이 모듈을 사용했다.



스트림



3. pdftotree


pdf파일을 파이썬에서 읽어오면 표의 형태가 날아간다. 표의 텍스트만 불러오고 표는 날아가기 때문에 좀 아쉬운 면이 있다. pdftotree는 pdf문서에 텍스트, 그림, 표를 추출해서 문서의 구조를 유지하여 html로 만들어주는 모듈이다. 다만, 필자의 문서로 테스트했을 때는 잘 작동하지 않았다. pip install pdftotree로 설치하고, 아래와 같이 사용하면 된다.


PDF파일에서 표를 추출하는 방법은 머신러닝 모델을 활용하는 듯 하다. 모델을 학습시킬 수 있는 extract_tables라는 모듈도 있다. 자세한 내용이 궁금하다면 아래 pdftotree 깃허브 페이지를 참조하도록 하자.
( 참조: https://github.com/HazyResearch/pdftotree )


1
2
3
4
5
 
import pdftotree 
 
pdftotree.parse(pdf_file, html_path = None , model_type = None , model_path = None , favor_figures = True , visualize = False )
 
cs



4. pdfminer


pdf문서를 text나 html로 변경해주는 모듈이다. 표를 살리려면 html로 변경해야 하기 때문에, 관련 모듈을 좀 찾아봤다. 아쉬운 건 필자가 가지고 있는 PDF파일에는 동작하지 않는다는 것이었다. 위의 모듈들보다는 사용방법이 조금 까다롭다. 어딘가에서 가져온 소스였는데 잘 기억이 나지 않는다. HTMLConverter와 XMLConverter가 있어 읽어오기만 하면 표도 가져올 수 있을 듯 하다.


pdfminer에 대한 더 자세한 내용이 궁금하다면 아래 깃허브 페이지를 참조하도록 하자.
( 참조: https://github.com/euske/pdfminer )


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import HTMLConverter
# from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
 
path = "./mlb_predict.pdf"
 
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
 
= open('./out.html''wb')
device = HTMLConverter(rsrcmgr, f, codec=codec, laparams=laparams)
 
fp = open(path, 'rb')
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0 #is for all
caching = True
pagenos=set()
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
   interpreter.process_page(page)
fp.close()
device.close()
str = retstr.getvalue()
retstr.close()
f.close()
 
cs



오늘은 이렇게 파이썬 pdf파일 읽기, 어떤 패키지를 사용해야 하는지에 대해서 알아보았다. 텍스트만 추출하고 싶다면 pdftotext를 사용하면 되겠다 .하지만 이미지나 표 등의 다른 구성요소들까지 추출하고 싶다면 pdfminer를 사용해야 한다. 다만, 사용방법이 조금 까다롭다. converter 함수에 입력변수들이 다양해 잘 사용하려면 공부가 좀 필요할 듯 하다.


파이썬을 직접 활용하는 것만큼 효과적인 공부는 없다. 그래서 파이썬을 활용해서 할 수 있는 일들을 정리해보았다. 자세한 내용은 아래 포스팅을 참조해보자.
( 참조: 파이썬 활용, 파이썬 프로젝트로 할 수 있는 일들을 알아보자! )


오픈API를 사용하면 다양한 재미있는 일들을 해 볼 수 있다. 파이썬을 활용한 오픈API 사용이 궁금하다면 아래 글을 참조해보자.

(참조: 오픈API를 활용한 사례는 어떤 것들이 있을까?)


댓글()
  1. 달율밤 2021.03.15 15:33 댓글주소  수정/삭제  댓글쓰기

    감사합니다