파이썬으로 발표자료나 구성도를 자동 생성할 때, 다이어그램을 이미지로 만들어 슬라이드에 붙이는 방법을 많이 씁니다. 그런데 이렇게 하면 받는 사람이 글자 하나 못 고칩니다. python-pptx로 네이티브 도형과 텍스트 박스를 만들면, 파워포인트에서 그대로 편집 가능한 PPT가 나옵니다. 그 방법과 자주 막히는 함정을 정리합니다.
1. 왜 이미지 말고 '도형'인가
자동 생성 PPT의 흔한 실수가 matplotlib이나 PIL로 그림을 그려 통째로 붙이는 것입니다. 보기엔 깔끔한데 받는 쪽에서 텍스트 수정도, 색 변경도, 위치 이동도 안 됩니다. 협업 도구(구글 슬라이드 등)에 올려도 그냥 이미지 한 장입니다. 반면 python-pptx로 도형/텍스트를 넣으면 각 요소가 파워포인트 개체라 자유롭게 편집됩니다.
- 이미지 첨부: 예쁘지만 수정 불가, 텍스트 검색/복사 안 됨
- 네이티브 도형: 글자/색/위치 편집 가능, 클라우드 협업에 유리
- 결론: 남에게 넘길 자료일수록 도형으로
2. 설치와 기본 골격
설치는 pip 한 줄입니다. 프레젠테이션 객체를 만들고, 슬라이드 크기를 정하고, 빈 레이아웃으로 슬라이드를 추가하는 게 기본 뼈대입니다. 레이아웃 인덱스 6번이 보통 '빈 화면'이라 도형을 자유롭게 얹기 좋습니다.

- pip install python-pptx
- Presentation() 생성 후 slide_width/height로 비율 지정
- slide_layouts[6] = 빈 레이아웃(도형 얹기 좋음)
3. 도형과 텍스트 박스, 그리고 좌표 단위 함정
도형은 add_shape로, 글상자는 add_textbox로 넣습니다. 여기서 python-pptx 최대 함정이 좌표 단위입니다. 내부 단위가 EMU(English Metric Unit)라 숫자를 그냥 넣으면 안 되고, Inches()/Pt()/Emu()로 감싸야 합니다. Inches(1)이 약 914400 EMU라, 이걸 모르고 좌표에 100 같은 숫자를 넣으면 점만큼 작은 도형이 나옵니다.

- add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height)
- 좌표/크기는 반드시 Inches()/Pt()/Emu()로 감싸기
- fill.solid() + fore_color.rgb = RGBColor(...)로 색, text_frame으로 글자
4. 박스 연결선과 표
구성도라면 박스를 화살표로 잇고, 데이터라면 표가 필요합니다. add_connector로 연결선을, add_table로 네이티브 표를 넣습니다. 표도 이미지가 아니라 진짜 파워포인트 표라 셀 내용을 그대로 수정할 수 있습니다.

- add_connector(MSO_CONNECTOR.STRAIGHT, x1, y1, x2, y2)로 박스 연결
- add_table(rows, cols, left, top, width, height).table로 표
- 셀은 table.cell(r, c).text로 채움(편집 가능한 네이티브 표)
5. 4:3 vs 16:9와 저장
슬라이드 비율은 slide_width/height로 정합니다. 4:3은 10 x 7.5인치, 16:9는 13.33 x 7.5인치입니다. 오래된 회사 템플릿이나 인쇄용은 4:3을 요구하는 경우가 많으니 받는 쪽 기준을 먼저 확인하는 게 좋습니다. 마지막에 save로 저장하면 끝입니다.
- 4:3 = Inches(10) x Inches(7.5), 16:9 = Inches(13.33) x Inches(7.5)
- prs.save("out.pptx")
- 파워포인트에서 열면 모든 도형/글자/표가 편집 가능
여기까지 python-pptx로 이미지가 아니라 편집 가능한 네이티브 도형으로 PPT를 자동 생성하는 방법에 대해서 작성해봤습니다. 여기까지 읽어주셔서 감사합니다!
'일상' 카테고리의 다른 글
| 로그에서 원하는 것만 뽑는 grep 패턴 (배치·에러 추적 실전) (0) | 2026.07.10 |
|---|---|
| Antigravity·윈도우 터미널에서 한글이 깨질 때 (CP949 vs UTF-8) (0) | 2026.07.10 |
| 작업은 다 끝났는데 exit code 9로 죽는 faster-whisper (CUDA 종료 크래시 잡기) (0) | 2026.07.10 |
| 웹 자동화(Playwright)에서 스크립트가 끝나도 브라우저를 살려두기 (크롬 독립 실행 + CDP 재사용) (0) | 2026.07.05 |
| 파이썬에서 윈도우 토스트 알림 보내기 (설치 없이 PowerShell로, 한글 깨짐 해결까지) (0) | 2026.07.04 |