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

목차

    2019. 10. 14. 06:30

    파이썬에서 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
    띄워쓰기 뿐만 아니라 개행문자(\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 함수에 입력 변수들이 다양해 잘 사용하려면 공부가 좀 필요합니다. 마지막으로 코드를 파일로 첨부하였습니다.

     

    pdf-to-python.py
    0.00MB