Language/Python

[Python] PDF 텍스트 추출

nowkoes 2023. 10. 31. 14:23

PDF 텍스트 추출

개요

 대학교에서 하는 수업들은 대게 PDF로 진행한다. 그래서 해당 내용을 정리할 때 PDF에 있는 텍스트 내용을 추출하면 편한 경우가 많다. 구글에 PDF 텍스트 추출을 검색하면 다양한 플랫폼이 나오지만, 직접 커스터마이징을 하고 싶어 파이썬으로 구현해 보았다.


본문

PyPDF2

출처: pypi.org

 

 파이썬에서는 Python으로 작성된 PDF 파일을 다루기 위한 라이브러리다. 이 라이브러리를 사용하면 PDF 파일을 읽고, 쓰고, 분할하는 등 다양한 작업을 수행할 수 있다. 이번 시간에는 파일을 읽는 것이 목적이므로 관련 함수인 PdfReader에 대해 알아보자.

 

출처: pypi.org

 

 일반적으로 PdfReader는 페이지 수 얻기, 개별 페이지 접근 등 다양한 읽기가 가능하다. 아래는 그 예제이므로 참고하자.

 

# PDF 파일 읽기
with open("example.pdf", "rb") as file:
    reader = PyPDF2.PdfReader(file) 

# 페이지 수 얻기
num_pages = len(reader.pages)

# 개별 페이지 접근
page = reader.pages[0]  # 첫 번째 페이지를 가져옴

# 페이지에서 텍스트 추출
text = page.extract_text()

# 문서 정보 접근
title = reader.info["Title"]
author = reader.info["Author"]

# 암호화된 PDF 파일 읽기
reader = PyPDF2.PdfReader(file)
if reader.isEncrypted:
    reader.decrypt("password")

구현

import PyPDF2
import os

 해당 프로그램은 PDF 파일에서 텍스트를 추출하여 텍스트 파일에 저장하는 기행을 수행한다. 따라서 PDF 파일에서 텍스트를 추출하는 데 사용하는 PyPDF2, 파일 및 디렉터리 관련 작업을 수행하하는 데 사용되는 os를 임포트 해준다.

 

def extract_text_from_pdf(pdf_path, txt_path, start_page=None, end_page=None):
    with open(pdf_path, 'rb') as file:
        reader = PyPDF2.PdfReader(file)
        text = ""

        if not start_page:
            start_page = 0

        else:
            start_page -= 1  
        
        if not end_page or end_page > len(reader.pages):
            end_page = len(reader.pages)
        
        for page_num in range(start_page, end_page):
            text += reader.pages[page_num].extract_text()

    with open(txt_path, 'w', encoding='utf-8') as txt_file:
        txt_file.write(text)

 PDF 파일 경로, 텍스트 파일 경로, 시작 페이지, 종료 페이지를 매개 변수로 받아, 해당 페이지 범위의 텍스트를 추출하고 텍스트 파일에 저장하는 함수다. 이 함수 내에서 PyPDF2의 PdfReader를 사용하여 PDF 파일을 읽고, 지정된 페이지의 범위의 텍스트를 추출한 후 텍스트 파일에 저장한다. 이때 페이지 인덱스는 0부터 시작하므로 1을 빼줘야 한다.

 

def list_pdf_files_in_directory(directory):
    return [f for f in os.listdir(directory) if f.endswith('.pdf')]

 주어진 디렉터리에서 .pdf 확장자를 가진 파일 목록을 반환하는 함수다.

 

if __name__ == "__main__":
    directory = input("pdf 파일 경로를 입력하세요: ")
    pdf_files = list_pdf_files_in_directory(directory)
    
    for idx, pdf_file in enumerate(pdf_files, 1):
        print(f"{idx}. {pdf_file}")
    
    selection = int(input("이 중에 원하시는 파일의 번호를 골라주세요: "))
    pdf_path = os.path.join(directory, pdf_files[selection - 1])

    page_range = input("원하는 페이지 수를 -를 사용하여 입력해주세요. 만약 전체 페이지를 원하시면 ALL을 입력해주세요: ")
    
    if page_range != "ALL":
        start_page, end_page = map(int, page_range.split('-'))
    
    else:
        start_page, end_page = None, None
    
    txt_directory = input("txt 파일 경로를 입력해주세요: ")
    txt_filename = input("파일 이름을 확장자를 포함하여 입력해주세요: ")
    txt_path = os.path.join(txt_directory, txt_filename)
    
    extract_text_from_pdf(pdf_path, txt_path, start_page, end_page)

 사용자로부터 PDF 파일이 위치한 디렉터리를 입력받고, 해당 디렉터리에서 PDF 파일 목록을 가져와 출력한다. 그리고 원하는 PDF 파일의 번호를 입력하면, 텍스트를 추출할 페이지 범위를 입력받는다. 그 후 텍스트 파일의 저장 경로와 파일 이름을 입력받으면, 지정된 페이지 범위의 텍스트를 추출하고 텍스트 파일에 저장한다.

 

총합본

더보기
import PyPDF2
import os

def extract_text_from_pdf(pdf_path, txt_path, start_page=None, end_page=None):
    with open(pdf_path, 'rb') as file:
        reader = PyPDF2.PdfReader(file)
        text = ""

        if not start_page:
            start_page = 0

        else:
            start_page -= 1  
        
        if not end_page or end_page > len(reader.pages):
            end_page = len(reader.pages)
        
        for page_num in range(start_page, end_page):
            text += reader.pages[page_num].extract_text()

    with open(txt_path, 'w', encoding='utf-8') as txt_file:
        txt_file.write(text)

def list_pdf_files_in_directory(directory):
    return [f for f in os.listdir(directory) if f.endswith('.pdf')]

if __name__ == "__main__":
    directory = input("pdf 파일 경로를 입력하세요: ")
    pdf_files = list_pdf_files_in_directory(directory)
    
    for idx, pdf_file in enumerate(pdf_files, 1):
        print(f"{idx}. {pdf_file}")
    
    selection = int(input("이 중에 원하시는 파일의 번호를 골라주세요: "))
    pdf_path = os.path.join(directory, pdf_files[selection - 1])

    page_range = input("원하는 페이지 수를 -를 사용하여 입력해주세요. 만약 전체 페이지를 원하시면 ALL을 입력해주세요: ")
    
    if page_range != "ALL":
        start_page, end_page = map(int, page_range.split('-'))
    
    else:
        start_page, end_page = None, None
    
    txt_directory = input("txt 파일 경로를 입력해주세요: ")
    txt_filename = input("파일 이름을 확장자를 포함하여 입력해주세요: ")
    txt_path = os.path.join(txt_directory, txt_filename)
    
    extract_text_from_pdf(pdf_path, txt_path, start_page, end_page)

요약 및 파일

extract_text_from_pdf.py
0.00MB

 

PyPDF2
1. 정의: 파이썬에서 PDF를 다루기 위한 라이브러리
2. PdfReader
 a. 정의: PyPDF2 내의 클래스로, PDF 파일을 읽는 데 사용
 b. 기능: 페이지 수 조회, 개별 페이지 접근, 텍스트 추출 등

 

반응형

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

[파이썬] 반응형 GUI  (0) 2024.09.23
[파이썬] tkinter (2) - PDF 페이지 추출 프로그램  (0) 2024.06.29
[파이썬] tkinter (1)  (0) 2024.06.24
[Python] matplotlib(1)  (0) 2023.09.12
[Python] 클립 보드 with Python  (0) 2023.07.29