초간단! PPT에서 발표자 노트만 쏙 빼오는 파이썬 프로그램 제작하기

소개

안녕하세요, Green입니다.

본격적으로 파이썬 스터디에서 코딩을 시작하기에 앞서, 업무효율화를 위해 내게 어떤 프로그램이 필요한지 곰곰이 생각을 해 보는 시간을 가졌습니다. 😊

특히, 지난 토요일 자기소개 시간에 '만들고자 하는 프로그램'으로 소개했던 '메일 내 서명 이미지 판별 프로그램'의 경우, 같은 스터디원이신 @멍멍 님께서 도와주셔서 Make로 구현이 가능한 부분인 것을 알게 된 바람에, 새로운 프로젝트를 생각해낼 필요가 있었습니다.

그러던 중, 주기적으로 여러 사람들의 PPT 발표자 노트를 읽고, 거기에서 중요한 부분을 가져와야 하는 제 업무가 떠올랐는데요.

매 달에 한번, 혹은 두번씩 반복되는 일이라 지금까지는 별 생각 없이 진행중이었지만, 효율화를 해두면 몇백 장의 PPT를 하나하나 넘기지 않고 더 빠르게 작업을 할 수 있겠다는 생각이 들었습니다.

진행 방법

스터디장 잔마왕님께서 올려주신 5가지 단계를 이정표로 삼아 개발을 진행해 보았습니다.

1) 해결하고자 하는 문제와 그에 대한 배결 방안을 명확히 정의한다
2) AI 코딩툴을 활용해 핵심 기능을 구현한다
3) 구현된 기능에 대해 작은 기능단위로 Test하여 완결된 코드로 다듬는다
4) 다듬어진 코드를 함수화 하여 GUI 코드로 감싼다
5) 필요시 실행파일로 만든다

1) 해결하고자 하는 문제와 그에 대한 해결 방안을 명확히 정의하기

먼저, GPT에게 다음과 어떤 프로그램을 개발할지 설명하고 그에 대한 PRD를 만들어 달라고 요청했습니다.

내 업무는 PPT에서 발표자 노트를 빼내고 거기에서 중요한 내용을 뽑아내는 거야.
그 중에서, 파이썬으로 PPT를 넣으면 자동으로 발표자 노트를 txt 파일로 뽑아 주는 프로그램이 필요해.
PPT발표자 노트 to TXT 프로그램 개발에 필요한 PRD(Product Requirements Document)를 작성해줘.
- 한국어로 작성해줘.
- 최대한 심플한 프로그램으로 만들어줘.
- 개발 일정은 포함하지 않아도 돼.

사실 워낙 간단한 프로그램이라 PRD는 필요없어 보이긴 했는데, 그래도 더 복잡한 프로그램을 만들 미래를 위해... 연습삼아 아래 영상을 참고하며 만들어 보았습니다 ^^

https://youtu.be/4RCBcV2Ucpo?feature=shared

GPT가 준 PRD

**PPT 발표자 노트 추출 프로그램 PRD (Product Requirements Document)**

---

### 1. 목적 (Purpose)
본 프로그램은 파워포인트(PPT) 파일(.pptx)에서 슬라이드마다 작성된 발표자 노트를 추출하여, 텍스트 파일(.txt)로 저장하는 것을 목적으로 한다. 이를 통해 발표 준비나 문서 작업 시 발표자 노트의 내용을 쉽게 확인하고 정리할 수 있도록 돕는다.

---

### 2. 기능 요구사항 (Functional Requirements)

1. **PPT 파일 불러오기**
   - 사용자는 .pptx 형식의 PPT 파일을 프로그램에 입력할 수 있어야 한다.
   - 파일 경로를 입력하거나 파일을 직접 드래그앤드롭하는 기능을 지원한다.

2. **발표자 노트 추출**
   - PPT 슬라이드 내 각 슬라이드에 작성된 발표자 노트를 슬라이드 순서대로 텍스트 형식으로 추출한다.
   - 슬라이드 번호와 함께 발표자 노트 내용을 기록하여 슬라이드 순서대로 출력하도록 한다.
   
3. **TXT 파일로 저장**
   - 추출한 발표자 노트는 .txt 형식의 파일로 저장된다.
   - 기본 파일명은 원본 PPT 파일명에 "_발표자노트"가 붙은 형태로 자동 생성된다. 예: `example_발표자노트.txt`
   - 사용자 지정 파일명으로 저장할 수 있는 옵션을 제공한다.

---

### 3. 비기능 요구사항 (Non-Functional Requirements)

1. **간단한 인터페이스**
   - 프로그램은 명령줄 인터페이스(CLI)로 동작하여 단순하고 직관적인 사용자 경험을 제공한다.
   - GUI를 지원하지 않으며, 최대한 빠르고 가볍게 동작할 수 있도록 한다.

2. **파일 형식 호환성**
   - .pptx 형식의 파일만 지원하며, 그 외 형식은 처리하지 않는다.
   - 발표자 노트가 없는 슬라이드는 빈 줄 혹은 "발표자 노트 없음"으로 처리하여 출력한다.

3. **에러 핸들링**
   - 잘못된 형식의 파일이 입력되었을 때 적절한 오류 메시지를 제공한다.
   - 발표자 노트 추출 중 발생할 수 있는 오류(예: 발표자 노트가 없는 경우 등)를 사전에 처리하여 프로그램이 중단되지 않도록 한다.

---

### 4. 제약 사항 (Constraints)

- **파이썬(Python) 언어 사용**
  - 파이썬을 이용해 프로그램을 구현하며, `python-pptx` 라이브러리를 사용하여 PPT 파일을 다룬다.
  - 프로그램은 기본적으로 콘솔 환경에서 실행된다.

- **의존성 최소화**
  - 프로그램 설치 및 실행 시 추가 설치가 필요한 패키지 의존성을 최소화하며, `python-pptx` 외의 패키지 사용은 제한한다.
  
---

### 5. 사용자 요구사항 (User Requirements)

- **용이한 사용성**
  - 파일을 선택 후 간단한 명령어로 발표자 노트를 텍스트 파일로 변환하는 기능이 요구된다.
  - 파일 생성 후 성공 메시지를 제공하여 사용자가 파일이 정상적으로 생성되었음을 확인할 수 있도록 한다.

---

### 6. 예외 처리 (Exception Handling)

- 입력 파일이 .pptx 형식이 아닌 경우: "지원되지 않는 파일 형식입니다."라는 오류 메시지를 출력한다.
- 발표자 노트가 없는 경우: "발표자 노트 없음"을 슬라이드 순서대로 파일에 기록하도록 한다.
- 파일 입출력 오류 발생 시: "파일을 불러오거나 저장하는 중 문제가 발생했습니다."라는 메시지를 출력하여 사용자에게 알린다.

---

### 7. 예상 출력 예시 (Expected Output Example)

**입력 파일**: `presentation.pptx`

**출력 파일**: `presentation_발표자노트.txt`

```plaintext
슬라이드 1:
본 발표는 회사 연간 성과에 대한 개요를 제공합니다.

슬라이드 2:
발표자 노트 없음

슬라이드 3:
주요 성과 지표 및 성장률 설명

...
```

---

### 8. 기술 스택 (Technical Stack)

- **프로그래밍 언어**: Python
- **주요 라이브러리**: python-pptx

---

### 9. 유지보수 (Maintenance)

- 발표자 노트 추출 로직이 정상 동작하지 않을 경우, `python-pptx` 라이브러리 업데이트 확인 및 코드 개선을 통해 유지보수한다.
  
---

### 10. 테스트 케이스 (Test Cases)

1. **일반 테스트**: 발표자 노트가 있는 PPT 파일을 입력하여 슬라이드 별 노트가 정상적으로 추출되는지 확인한다.
2. **발표자 노트 없음**: 발표자 노트가 없는 슬라이드가 포함된 PPT 파일을 입력하여, 해당 슬라이드가 "발표자 노트 없음"으로 표시되는지 확인한다.
3. **잘못된 파일 형식**: .pptx 외의 파일(.pdf, .docx 등)을 입력할 경우, 오류 메시지가 출력되는지 확인한다.
4. **파일 저장 오류**: 사용자가 지정한 경로에 저장 권한이 없는 경우, 오류 메시지가 출력되는지 확인한다.

---

### 11. 향후 확장 가능성 (Future Enhancements)

- PPT 파일 내 이미지나 도형 설명 등 추가 메타 정보 추출 기능
- 다국어 발표자 노트 추출 기능
- GUI 버전으로 확장하여 일반 사용자 접근성 강화

--- 

위 PRD를 바탕으로 기본적인 PPT 발표자 노트 추출 프로그램을 개발한다.


2) AI 코딩툴을 활용해 핵심 기능 구현하기

커서로 코드를 짜 보았습니다! 😃

import os
from pptx import Presentation
from typing import Optional

class PPTNoteExtractor:
    def __init__(self):
        self.input_file: Optional[str] = None
        self.output_file: Optional[str] = None

    def validate_file(self, file_path: str) -> bool:
        """파일 유효성 검사"""
        if not os.path.exists(file_path):
            print("파일이 존재하지 않습니다.")
            return False
        if not file_path.endswith('.pptx'):
            print("지원되지 않는 파일 형식입니다. (.pptx 파일만 지원)")
            return False
        return True

    def extract_notes(self, input_file: str, output_file: Optional[str] = None) -> bool:
        """발표자 노트 추출 메인 함수"""
        try:
            if not self.validate_file(input_file):
                return False

            self.input_file = input_file
            if output_file is None:
                # 기본 출력 파일명 생성
                file_name = os.path.splitext(input_file)[0]
                self.output_file = f"{file_name}_발표자노트.txt"
            else:
                self.output_file = output_file

            # PPT 파일 열기
            presentation = Presentation(self.input_file)
            
            # 발표자 노트 추출 및 저장
            with open(self.output_file, 'w', encoding='utf-8') as f:
                for idx, slide in enumerate(presentation.slides, 1):
                    f.write(f"슬라이드 {idx}:\n")
                    
                    # 발표자 노트 확인
                    notes = slide.notes_slide.notes_text_frame.text if slide.has_notes_slide else "발표자 노트 없음"
                    notes = notes.strip() if notes.strip() else "발표자 노트 없음"
                    
                    f.write(f"{notes}\n\n")

            print(f"발표자 노트가 성공적으로 추출되어 {self.output_file}에 저장되었습니다.")
            return True

        except Exception as e:
            print(f"오류가 발생했습니다: {str(e)}")
            return False

def main():
    """메인 실행 함수"""
    print("PPT 발표자 노트 추출 프로그램")
    print("-" * 40)
    
    extractor = PPTNoteExtractor()
    
    while True:
        input_file = input("\nPPT 파일 경로를 입력하세요 (종료: q): ").strip()
        
        if input_file.lower() == 'q':
            print("프로그램을 종료합니다.")
            break
            
        output_file = input("저장할 파일명을 입력하세요 (Enter: 기본값): ").strip()
        output_file = output_file if output_file else None
        
        extractor.extract_notes(input_file, output_file)

if __name__ == "__main__":
    main()


3~4) 다듬어진 코드를 함수화 하여 GUI 코드로 감싸기, 구현된 기능에 대해 작은 기능단위로 Test하여 완결된 코드로 다듬기

사실 앞서 구현한 기능을 작게 테스트해보며 진행해야 하지만, 워낙 간단한 프로그램이다 보니 일단 GUI로 감싸서 프로그램으로 만들어 보고 싶어서 3번을 건너뛰었습니다.

한국어 텍스트가 있는 화면의 스크린샷

잔마왕님이 주신 gui 코드마저... 커서에게 주고 합쳐 달라고 조르니 파일이 완성되더군요!

한국어 텍스트가 있는 검은 화면

python파일을 그냥 더블클릭하면 제 눈에 보이게 실행이 안 돼서, 또 해결방법을 찾아냈습니다. 보통 GPT한테 물어봤었는데, 커서한테 시켜 보니 바로바로 붙여넣을 수 있어서 좋네요!

한국어 텍스트가 적힌 컴퓨터 화면

잔마왕님께서 정말 유용한 GUI 파일을 주셔서, 바로 그럴싸한 프로그램이 뚝딱 나왔습니다.

결과와 배운 점

다운로드 버튼을 가리키는 파란색 화살표가 있는 창

실제로 파일을 집어넣으니,

한국어 텍스트가 있는 창

정말 txt파일로 뚝딱 만들어져서 발표자 노트가 추출된 것을 확인할 수 있었습니다! 😃

사실 발표자 노트를 추출하는 방법을 인터넷에 검색해 보면, 아래와 같이 워드 프로그램으로 변환시키는 기능을 사용하면서 슬라이드와 노트를 같이 빼내는 방법을 제시하고 있습니다. (혹은 Google Slide에 업로드해서 발표자노트를 추출하는 방법)

이런 식으로 말이죠!

그런데 실제로 PPT에서 발표자 노트를 워드로 추출해보면, 에러가 너무 자주 발생해서 발표자 노트를 실제로 이 방법으로 성공적으로 빼 본 적이 없습니다 ㅜㅜ

그리고 Google Slide에서 발표자 노트를 빼내는 방법은 클릭 한 번으로 매우 간단하지만,

PPT용량이 애초에 큰 경우 구글 슬라이드에서 내용이 불러와지지 않는다는 단점이 있었죠 (불러와지지 않으면 내용 추출도 못 함)

그래서 이번 스터디를 계기로, 발표자 노트 자동 추출기를 만들어 두니 확실히 편하네요!

안 그래도 내일 추출작업을 마저 해야 하는데, 이 프로그램으로 좀 더 발전시킨다면

1) 추출한 텍스트 파일을

2) ai에게 자동으로 요약시키기

정도까지 발전시켜서 제 업무 중 하나를 완전 자동화시킬 수도 있을 것 같습니다 👍

감사합니다!

도움 받은 글

잔마왕, <파이썬 코딩 스터디 시작에 앞서 스터디 지향점 및 참고자료>

5
2개의 답글

👉 이 게시글도 읽어보세요