Python은 다양한 기능과 용도를 가진 방대한 라이브러리와 확장 모듈을 제공하는 것으로 잘 알려져 있습니다. PDF 파일을 다룰 때는 PyPDF2 툴킷을 활용할 수 있으며, 이 라이브러리는 PDF 처리, 텍스트 추출, 여러 페이지 병합, PDF 암호화 등 다양한 작업을 지원합니다. PDF처럼 파일 스트림을 관리하고 조작하는 데 매우 유용한 패키지입니다.
이번 글에서는 PyPDF2를 이용해, 사용자가 로컬 디렉터리에서 PDF 파일을 선택하고 열면 해당 내용을 화면에 출력하는 Tkinter 애플리케이션을 만들어 보겠습니다.
애플리케이션 제작 순서
- 명령 셸에서
pip install PyPDF2를 입력해 필요한 패키지를 설치합니다. 설치가 끝나면 노트북에서 import PyPDF2로 라이브러리를 불러옵니다. - filedialog를 임포트하여, 로컬 디렉터리에서 파일을 선택할 수 있는 대화상자를 만듭니다.
- Text 위젯을 생성하고, 열기(Open), 지우기(Clear), 종료(Quit) 같은 메뉴를 추가합니다.
- 각 메뉴에 대응하는 함수를 정의합니다.
- 파일을 여는 함수를 정의합니다. 이 함수 안에서 먼저
PdfFileReader(file)로 파일을 읽은 뒤, 페이지를 추출합니다. - 추출한 내용을 텍스트 상자(Text Box)에 삽입합니다.
- 종료(Quit) 메뉴용 함수를 정의합니다.
전체 예제 코드
# 필요한 라이브러리 임포트
import PyPDF2
from tkinter import *
from tkinter import filedialog
# tkinter 프레임 인스턴스 생성
win = Tk()
# 창 크기 설정
win.geometry("750x450")
# 텍스트 상자 생성
text = Text(win, width=80, height=30)
text.pack(pady=20)
# 텍스트를 지우는 함수 정의
def clear_text():
text.delete(1.0, END)
# PDF 파일을 여는 함수 정의
def open_pdf():
file = filedialog.askopenfilename(
title="Select a PDF",
filetype=(("PDF Files", "*.pdf"), ("All Files", "*.*"))
)
if file:
# PDF 파일 열기
pdf_file = PyPDF2.PdfFileReader(file)
# 읽을 페이지 선택
page = pdf_file.getPage(0)
# 페이지의 내용 추출
content = page.extractText()
# 텍스트 상자에 내용 추가
text.insert(1.0, content)
# 창을 종료하는 함수 정의
def quit_app():
win.destroy()
# 메뉴 생성
my_menu = Menu(win)
win.config(menu=my_menu)
# 메뉴에 드롭다운 항목 추가
file_menu = Menu(my_menu, tearoff=False)
my_menu.add_cascade(label="File", menu=file_menu)
file_menu.add_command(label="Open", command=open_pdf)
file_menu.add_command(label="Clear", command=clear_text)
file_menu.add_command(label="Quit", command=quit_app)
win.mainloop()실행 결과
위 코드를 실행하면 파일 열기, 내용 지우기, 애플리케이션 종료 기능을 갖춘 완성된 Tkinter 애플리케이션이 화면에 나타납니다.

애플리케이션 좌측 상단의 "File" 메뉴를 클릭한 뒤 새 PDF 파일을 열면, 해당 문서의 내용이 텍스트 상자에 표시됩니다.

참고: 최신 PyPDF2 버전 사용 시
PyPDF2 3.x 버전부터는 API가 일부 변경되었습니다. 위 코드의 PdfFileReader, getPage(), extractText()는 구버전(1.x~2.x) 기준이며, 최신 버전에서는 각각 PdfReader, reader.pages[0], page.extract_text() 형태로 사용해야 합니다. 설치된 버전에 맞게 코드를 조정하시기 바랍니다.