어느날 PDF를 이미지로 변환하는 간단한 프로그램이 있으면 좋겠다 생각했습니다.
Adobe acrobat pro를 사용하고 있는데 괜히 무거워서, 그냥 가볍게 툭 변환하고 싶다는 욕구가 차올랐죠.
그래서 그냥 한번 만들어 보기로 했습니다.
그 과정과 방법을 상세히 기록하고 공유드리오니,
여러분도 만들어보세요.
실용에만 집중해서 UI는 허접하지만 잘 작동한다구요.
이 프로젝트를 통해 얻을 수 있는 것
여러분들이 초보 혹은 중수라면, 이 튜토리얼을 통해 의외로 많은 것들을 배우고 느끼실 수 있으실 겁니다.
- 파이썬으로 실용적인 exe 실행 파일을 만드는 전체 과정
- 다양한 라이브러리 활용 기술 (tkinter, pdf2image, pyinstaller)
- 개발 환경 설정 및 관리 노하우
- 프로그램 배포 과정 이해
- 실무에 바로 적용 가능한 스킬
개발 환경
- Python 3.12
- Windows
- 가상 환경 (venv)
활용 라이브러리
- tkinter : GUI를 위해
- pdf2image : PDF를 이미지로 변환하기 위해
- Pillow : 이미지 처리 라이브러리
- PyInstaller : 실행 파일 만들기 위해
개발 순서
- 환경 설정 및 라이브러리 설치
- poppler 설치
- Python 스크립트 작성
- PyInstaller를 사용하여 실행 파일 빌드
- setup.bat 스크립트 작성
1. 환경 설정 및 라이브러리 설치
먼저, 개발 환경을 설정하고 필요한 라이브러리를 설치합니다. 가상 환경을 설정하고 필요한 라이브러리를 설치하는 방법을 설명합니다.
가상 환경 설정
가상 환경을 설정하여 프로젝트에서 사용할 독립적인 패키지 환경을 만듭니다.
python -m venv env
가상 환경 활성화
가상 환경을 활성화합니다.
./env/scripts/activate
필요한 라이브러리 설치
필요한 라이브러리를 설치합니다.
pip install pdf2image Pillow PyInstaller
* 참고로 tkinter는 윈도우에서 기본적으로 설치되어있습니다.
2. poppler 설치
pdf2image 라이브러리는 PDF를 이미지로 변환할 때 poppler를 필요로 합니다. poppler는 PDF를 이미지로 변환하는 데 필요한 오픈 소스 유틸리티입니다. 설치하기가 조금 낯설 수 있지만, 따라해보면 어렵지 않습니다.
Windows에서 poppler 설치
- Poppler for Windows 페이지에서 최신 버전을 다운로드합니다.
- 다운로드한 zip 파일의 압축을 풉니다. 예를 들어, C:\poppler-24.07.0 디렉터리에 압축을 풉니다.
- 환경 변수 설정
- Windows 검색에서 "환경 변수 편집"을 검색하여 시스템 환경 변수 설정을 엽니다.
- 아래에 환경 변수로 들어갑니다.
- 시스템 변수 목록에서 Path 항목을 선택하고 편집을 클릭합니다.
- 새로 만들기를 클릭하고 C:\poppler-24.07.0\Library\bin 경로를 추가합니다.
- 확인을 클릭하여 모든 창을 닫고 변경 사항을 적용합니다.
- vscode를 재실행하거나, terminal을 다시 연 후 아래 명령어로 설치 되었는지 확인합니다.
pdfinfo -v
잘 설치 됐다면 아래와 같은 결과가 나옵니다.
pdfinfo version 24.07.0
Copyright 2005-2024 The Poppler Developers - http://poppler.freedesktop.org
Copyright 1996-2011, 2022 Glyph & Cog, LLC
3. Python 스크립트 작성
본격적으로 PDF 파일을 이미지로 변환하는 Python 스크립트를 작성합니다.
한글로 주석을 달아놓았으니 참고하시기 바랍니다.
#pdf_converter.py
import os
from tkinter import Tk, filedialog, Button, Label, StringVar, OptionMenu, messagebox
from pdf2image import convert_from_path
def select_pdf_file():
# PDF 파일 선택 다이얼로그 열기
file_path = filedialog.askopenfilename(filetypes=[("PDF files", "*.pdf")])
pdf_file.set(file_path)
if file_path:
try:
# 첫 페이지만 변환 시도하여 페이지 수 확인
images = convert_from_path(file_path, first_page=0, last_page=0)
page_count.set(f"Page count: {len(images)}")
except Exception as e:
page_count.set("파일을 변환할 수 없습니다. Poppler가 설치되어 있고 PATH에 있는지 확인하세요.")
messagebox.showerror("Error", str(e))
def select_output_folder():
# 출력 폴더 선택 다이얼로그 열기
folder_path = filedialog.askdirectory()
output_folder.set(folder_path)
def convert_pdf():
if not pdf_file.get() or not output_folder.get():
messagebox.showwarning("입력 누락", "PDF 파일과 출력 폴더를 모두 선택하세요.")
return
file_path = pdf_file.get()
folder_path = output_folder.get()
resolution = 200 if resolution_var.get() == "Default" else 100
file_format = file_format_var.get().lower()
try:
# PDF 파일을 이미지로 변환
images = convert_from_path(file_path, dpi=resolution)
for i, image in enumerate(images):
# 각 페이지를 이미지 파일로 저장
output_path = os.path.join(folder_path, f"{os.path.splitext(os.path.basename(file_path))[0]}_page_{i+1}.{file_format}")
image.save(output_path, file_format.upper())
conversion_log.set(f"페이지 {i+1}/{len(images)} 변환 완료")
messagebox.showinfo("변환 완료", f"{len(images)} 페이지가 성공적으로 변환되었습니다.")
except Exception as e:
messagebox.showerror("Error", str(e))
# GUI 애플리케이션 설정
app = Tk()
app.title("PDF to Image Converter")
app.geometry("400x500")
# GUI 요소 설정
pdf_file = StringVar()
output_folder = StringVar()
page_count = StringVar()
resolution_var = StringVar(value="Default")
file_format_var = StringVar(value="PNG")
conversion_log = StringVar()
# 파일 선택 버튼
Button(app, text="PDF 파일 선택", command=select_pdf_file).pack(pady=5)
Label(app, textvariable=pdf_file).pack(pady=5)
Label(app, textvariable=page_count).pack(pady=5)
# 출력 폴더 선택 버튼
Button(app, text="출력 폴더 선택", command=select_output_folder).pack(pady=5)
Label(app, textvariable=output_folder).pack(pady=5)
# 포맷 선택 메뉴
Label(app, text="포맷 선택").pack(pady=5)
OptionMenu(app, file_format_var, "PNG", "JPG").pack(pady=5)
# 해상도 선택 메뉴
Label(app, text="해상도 선택").pack(pady=5)
OptionMenu(app, resolution_var, "Default", "Low").pack(pady=5)
# 변환 버튼
Button(app, text="변환", command=convert_pdf).pack(pady=5)
Label(app, textvariable=conversion_log).pack(pady=5)
# 애플리케이션 실행
app.mainloop()
4. PyInstaller를 사용하여 실행 파일 빌드
Python 스크립트를 독립 실행 파일로 빌드하려면 PyInstaller를 사용합니다.
여기에서 유의할 점은 내가 poppler를 설치한 경로를 입력해야 되는 것입니다.
pip install pyinstaller
pyinstaller --onefile --windowed --add-data "C:\poppler-24.07.0\Library\bin;poppler-24.07.0\Library\bin" pdf_converter.py
5. 실행 및 테스트
자 이제 실행 파일이 만들어 졌을 겁니다.
dist 폴더에 들어가시면 있습니다.
실행하고, PDF 파일을 선택합니다.
출력 폴더를 설정하고
포맷을 PNG, JPG 중에 선택한 후
화질을 기본으로 선택했어요.
Convert를 눌러주면!!
결과를 확인해 보면
오오 잘 변환 되었습니다!!
이미지가 아주 선명하고 깔끔하게 잘 변환되었군요!
이렇게 성공적으로 윈도우 프로그램을 만들어 내셨습니다.
자, 이제 여러분도 PDF 파일을 이미지로 변환하는 프로그램을 만들어보세요. 이번 프로젝트를 통해 Python으로 GUI 애플리케이션을 만들고, poppler와 tkinter, PyInstaller를 통해 프로그램을 생성해서 사용하는 방법을 배웠길 바랍니다.
추가적인 기능이나 수정이 필요하다면 언제든지 질문해 주세요! Happy coding! 💻
#PDF이미지변환프로그램만들기 #파이썬GUI개발과정 #PyInstaller사용법 #PDF2Image라이브러리활용 #Poppler설치방법#Python실행파일만들기 #PDF변환기개발 #tkinter사용법 #파이썬프로젝트관리 #PyInstaller튜토리얼 #PDF변환 #파이썬프로젝트 #GUI개발 #실행파일빌드 #코딩튜토리얼 #파이썬입문 #프로그래밍학습 #개발자스킬 #파이썬라이브러리 #실용프로그래밍 #poppler 설치방법
'개발 이야기 > 파이썬' 카테고리의 다른 글
[파이썬 async] 비동기 프로그래밍 요약 노트 (0) | 2024.04.24 |
---|---|
[파이썬] 제너레이터를 활용한 효율적인 텍스트 처리 방법 (0) | 2024.04.15 |
[Python] 우선순위 큐(Priority Queue) 활용법 - heapq 모듈과 예제 코드 살펴보기 (0) | 2024.04.15 |
[Python] No module named 'pip' 고치기 (0) | 2023.12.29 |
맥북에서 Ubuntu로 외부에서 원격접속해서 VS CODE로 코딩하는 방법. (0) | 2023.07.23 |
댓글