파이썬 pdf 파일 읽기, 어떤 패키지를 사용해야 하는가?
목차
파이썬에서 pdf파일을 다루는 방법이 있습니다. 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 |
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()
f = 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 함수에 입력 변수들이 다양해 잘 사용하려면 공부가 좀 필요합니다. 마지막으로 코드를 파일로 첨부하였습니다.
'Python > 파이썬 배우기' 카테고리의 다른 글
파이썬 활용, 파이썬 프로젝트로 할 수 있는 일들을 알아보자! (10) | 2019.11.20 |
---|---|
파이썬 책 추천, 파이썬에 참 좋은 파이참(pycharm)! (50) | 2019.11.03 |
파이썬 사이킷런(sklearn) 패키지에서 ROC곡선 쉽게 그리는 방법! (2) | 2019.10.23 |
파이썬 데이터 시각화, plotly 다중 그래프 그리기 (0) | 2019.10.18 |
파이썬 날짜와 시간 계산이 어렵다면? 애로우(arrow) 라이브러리를 써보자! (0) | 2019.08.22 |
파이썬 테서렉트(tesseract) 설치 및 사용후기! (2) | 2019.08.15 |
파이참(pycharm)에서 라이브러리 쉽게 설치하는 방법! (0) | 2019.08.04 |
파이썬에서 ggplot2(지지플랏) 사용하기 (2) | 2019.07.14 |