PDF 텍스트 추출
개요
대학교에서 하는 수업들은 대게 PDF로 진행한다. 그래서 해당 내용을 정리할 때 PDF에 있는 텍스트 내용을 추출하면 편한 경우가 많다. 구글에 PDF 텍스트 추출을 검색하면 다양한 플랫폼이 나오지만, 직접 커스터마이징을 하고 싶어 파이썬으로 구현해 보았다.
본문
PyPDF2
파이썬에서는 Python으로 작성된 PDF 파일을 다루기 위한 라이브러리다. 이 라이브러리를 사용하면 PDF 파일을 읽고, 쓰고, 분할하는 등 다양한 작업을 수행할 수 있다. 이번 시간에는 파일을 읽는 것이 목적이므로 관련 함수인 PdfReader에 대해 알아보자.
일반적으로 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)
요약 및 파일
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 |