[Python-pptx] 업무 자동화 - 파이썬으로 파워포인트 편집하기
오.오.쓰 에 오신 것을 환영합니다.
[보고서 자동화 프로젝트] 입니다.
아래와 같은 순서로 배워보겠습니다.
1. 학습 목표
일상 속에서 반복되는 일은 어떤게 있나요? 반복되는 일로 인해 지겹거나, 다른 누군가가 해주었으면 하는 생각하신적 없으신가요?
회사에서 일을 하다 보면 주간보고, 월간보고 등 주기적으로 작성해야 하는 보고서들이 많습니다. 이를 자동화 함으로써 시간을 절약하고, 더 중요한 일에 집중해보는건 어떨까요?
이번 장에서는 파이썬으로 파워포인트를 편집해보겠습니다.
[프로젝트 리소스 및 소스 코드]
- res/powerpoint_handling : 동작 확인을 위한 리스소 파일이 위치한 폴더
- powerpoint_handling.ipynb : 구현된 소스 코드
> 접속 URL : drive.google.com/drive/folders/10KXyPrJ_KEesvAvjnMpx1DS_md7gaN6H?usp=sharing
※ 프로젝트에 필요한 리소스 및 소스코드의 경로 구성은 자유롭게 설정하면 됩니다. 그러나, 아래 설명되어 있는 코드 구현이 제시된 구성으로 되어 있으니, 동일하게 경로와 파일명으로 구성해 둔다면 별다른 코드 수정 없이 실행해 볼 수 있습니다.
2. 사전 준비
> 링크 (python-pptx 라이브러리 문서) python-pptx.readthedocs.io/en/latest/
> 링크 (python-pptx 라이브러리 quick-start 문서) : python-pptx.readthedocs.io/en/latest/user/quickstart.html
$ pip install python-pptx
3. 사전 지식 쌓기
파워포인트에서는 다양한 레이아웃을 제공하고 있습니다. 기본 테마 (office테마)의 경우, 11개의 레이아웃을 지원하고 있습니다.
테마가 다른 경우 지원되는 레이아웃이 달라지며, 이번 장에서는 office 테마 범위 내에서 내용을 다루도록 하겠습니다.
지식을 쌓을 내용은 다음과 같습니다.
3-1) 모든 레이아웃 적용해 보기
3-2) 레이아웃 별 placeholder 속성 확인하기
3-1) 모든 레이아웃 적용해 보기
office테마에서 지원하는 11개의 레이아웃을 각 슬라이드에 적용해 보겠습니다.
코드
from pptx import Presentation # 라이브러리
from pptx.util import Inches # 사진, 표등을 그리기 위해
prs = Presentation() # 파워포인트 객체 선언
for i in range(0, 11):
title_slide_layout = prs.slide_layouts[i] # 슬라이드 종류 선택
slide = prs.slides.add_slide(title_slide_layout) # 슬라이드 추가
prs.save('add all slides.pptx')
실행 결과
총 11개의 슬라이드가 추가되었고, 5번째 슬라이드를 클릭해보니 "비교" 레이아웃이 적용되어 있습니다.
코드 설명
1~2라인 : 필요한 라이브러리를 import 합니다.
4라인 : 파워포인트 객체를 선언합니다.
6라인 : 총 11개의 레이아웃을 추가하기 위해 반복문을 사용합니다.
7라인 : slide_layouts [i]는 슬라이드 레이아웃을 의미합니다. 위의 [그림 2]에서 보이는 순서대로 0은 제목 슬라이드를 의미하고, 1은 제목 및 내용 슬라이드를 2는 구역 머리글 슬라이드를 의미합니다. 테마를 변경하는 경우 목적에 맞게 변경할 필요해야 합니다.
8라인 : 슬라이드를 추가합니다.
10라인 : 구성된 내용을 저장합니다.
3-2) 레이아웃 별 placeholder 속성 확인하기
placeholder는 콘텐츠를 추가하는 것을 훨씬 더 쉽게 만들어 줍니다. 레이아웃에서 관리되고 있는 palceholder를 확인하고, 그에 맞게 정보를 추가하여 장표를 꾸미면 됩니다.
이를 위해 각 레이아웃별 placeholder를 확인해봅시다.
코드
from pptx import Presentation # 라이브러리
from pptx.util import Inches # 사진, 표등을 그리기 위해
prs = Presentation()
for i in range(0, 11):
print("--------[%d] ------ "%(i))
slide = prs.slides.add_slide(prs.slide_layouts[i])
for shape in slide.placeholders:
print('%d %s' % (shape.placeholder_format.idx, shape.name))
실행 결과
[그림 x-3]의 테마는 ----[4]----에 해당하는데, 총 5개의 palceholder가 있네요.
큰제목에 내용을 쓰려면 slide.placeholder [0]을 사용하면 됩니다. 또는 다른 속성 값으로도 접근 가능한데, 이 부분은 문서를 통해 확인하세요.
코드 설명
6 라인 : 총 11개의 레이아웃을 추가하기 위해 반복문을 사용합니다.
7 라인 : 슬라이드를 추가합니다.
8 라인 : 슬라이드를 구성하고 있는 placeholder 목록을 확인하기 위해 반복문을 사용합니다.
9 라인 : placeholder의 index(순서)와 이름을 출력합니다.
4. 구현
여러 레이아웃 중에 작업 시 가장 많이 사용하는 4가지 레이아웃을 좀 더 상세히 다뤄보겠습니다.
[구현 순서]
슬라이드를 하나씩 추가하고, 저장하면서 그 결과를 확인해보겠습니다.
Step1 | 객체 선언 |
Step2 | 제목 슬라이드 |
Step3 | 제목 + 내용 슬라이드 |
Step4 | 사진 슬라이드 |
Step5 | 표 슬라이드 |
Step1) 객체 선언
라이브러리를 import 하고, 객체를 선언합니다.
from pptx import Presentation # 라이브러리
from pptx.util import Inches # 사진, 표등을 그리기 위해
prs = Presentation() # 파워포인트 객체 선언
Step2) 제목 슬라이드
'제목 슬라이드'를 추가해보겠습니다.
코드
title_slide_layout = prs.slide_layouts[0] # 0 : 제목슬라이드에 해당
slide = prs.slides.add_slide(title_slide_layout) # 슬라이드 추가
# 제목 - 제목에 값넣기
title = slide.placeholders[0] # 제목
title.text = "Hello, World!" # 제목에 값 넣기
# 부제목
subtitle = slide.placeholders[1] # 제목상자는 placeholders[0], 부제목상자는 [1]
subtitle.text = "python-pptx was here!"
# 저장
prs.save('test.pptx')
실행 결과
저장된 test.pptx를 열어보세요. 와우!! 감탄사가 절로 나오죠?ㅎㅎ
코드 설명
1~2라인 : prs.slide_layouts[0]에서 0은 제목 슬라이드를 의미하며, 해당 레이아웃을 추가합니다.
5~6라인 : 제목 슬라이드의 레이아웃(0)의 경우는 [그림 4]에서 알 수 있듯 2가지 placeholder가 있습니다. 첫 번째는 제목을 의미하며, 두 번째는 부제목을 의미합니다. slide.placeholders[0]에서 0은 제목을 의미하며, 제목의 값을 "Hello, World!"로 설정합니다.
9~10라인 : 두번째 placeholder는 부제목을 의미하며, 부제목에 "python-pptx was here!" 값을 설정합니다.
13라인 : 파일을 저장합니다.
Step3) 제목 + 내용 슬라이드
'제목 내용 슬라이드'를 추가해보겠습니다.
코드
bullet_slide_layout = prs.slide_layouts[1] # 1 : 제목 + 내용 슬라이드
slide = prs.slides.add_slide(bullet_slide_layout) # 기존에 있던 슬라이드에 추가
# 제목
title_shape = slide.placeholders[0]
title_shape.text = 'Adding a Bullet Slide'
# 내용
body_shape = slide.placeholders[1]
tf = body_shape.text_frame
tf.text = 'Find the bullet slide layout'
# 단락 추가
p = tf.add_paragraph()
p.text = 'Use _TextFrame.text for first bullet'
p.level = 1 # 1 : 들여쓰기 레벨
# 단락 추가
p = tf.add_paragraph()
p.text = 'Use _TextFrame.add_paragraph() for subsequent bullets'
p.level = 2 # 2 : 들여쓰기 레벨
prs.save('test.pptx')
실행 결과
코드 설명
1~2라인 : prs.slide_layouts[1]에서 1은 제목+내용 슬라이드를 의미하며, 해당 레이아웃을 추가합니다.
5~6라인 : 제목+내용 슬라이드의 레이아웃(1)의 경우는 [그림 4]에서 알 수 있듯 2가지 placeholder가 있습니다. 첫 번째는 제목을 의미하며, 두 번째는 내용을 의미합니다. slide.placeholders[0]에서 0은 제목을 의미하며, 제목의 값을 "Adding a Bullet Slide"로 설정합니다.
9~11라인 : 두번째 placeholder는 내용을 의미하며, "Find the bullet slide layout" 값을 설정합니다.
13~16라인 : add_paragraph 함수를 호출하여 단락을 추가합니다. p.level로 들여 쓰기 레벨을 설정할 수 있습니다.
19~21라인 : add_paragraph 함수를 호출하여 단락을 또 추가합니다. 그리고, 들여쓰기 레벨을 2로 설정합니다.
Step4) 사진 슬라이드
'빈 화면'슬라이드를 추가해서 원하는 사진을 삽입해보겠습니다.
코드
img_path = 'res/powerpoint_handling/slide_test.jpg'
blank_slide_layout = prs.slide_layouts[6] # 6 : 제목/내용이 없는 '빈' 슬라이드
slide = prs.slides.add_slide(blank_slide_layout)
left = top = Inches(1)
width = height = Inches(1)
# width, hegith가 없을 경우 원본 사이즈로
pic = slide.shapes.add_picture(img_path, left, top, width=width,height=height)
left = Inches(3)
width = Inches(5.5)
height = Inches(4)
pic = slide.shapes.add_picture(img_path, left, top, width=width,height=height)
prs.save('test.pptx')
실행 결과
코드 설명
1 라인 : 넣고 싶은 이미지 파일을 설정합니다.
3~4라인 : prs.slide_layouts[6]에서 6은 빈 슬라이드를 의미합니다.
6~9라인 : add_picture() 함수를 호출하여 이미지를 추가합니다. 이미지의 경우 위치와 크기 설정이 필요합니다. top, left는 시작점을 width와 height는 이미지의 크기를 의미합니다.
11~14라인 : add_picture() 함수를 호출하여 이미지를 추가하는데, 기존보다 크게 추가해 보았습니다.
Step5) 표 슬라이드
'제목만' 슬라이드를 추가하여, 표를 삽입해 보겠습니다.
코드
title_only_slide_layout = prs.slide_layouts[5]
slide = prs.slides.add_slide(title_only_slide_layout)
shapes = slide.shapes
title_shape = slide.placeholders[0]
title_shape.text = 'Adding a Table'
rows = cols = 2
left = top = Inches(2.0)
width = Inches(6.0)
height = Inches(0.8)
table = shapes.add_table(rows, cols, left, top, width, height).table
# set column widths
table.columns[0].width = Inches(2.0)
table.columns[1].width = Inches(4.0)
# write column headings
table.cell(0, 0).text = 'Foo'
table.cell(0, 1).text = 'Bar'
# write body cells
table.cell(1, 0).text = 'Baz'
table.cell(1, 1).text = 'Qux'
prs.save('test.pptx')
실행 결과
코드 설명
1~2라인 : prs.slide_layouts[5]에서 5는 '제목만' 슬라이드를 의미합니다.
5~6라인 : 제목을 의미하는 placeholder에 'Adding a Table'을 설정합니다.
8~13라인 : add_table() 함수를 호출하여 표를 추가합니다. 표는 몇 행 몇렬로 만들 것인지와 그릴 위치와 크기 설정합니다. rows와 cols를 2로 설정하여 2행 2열의 표를 만들었습니다.
16~17라인 : 칼럼 크기를 설정합니다.
20~25라인 : 표의 각 cell에 값을 설정합니다. table.cell(행, 열)입니다.
5. 요약정리
이번 장에서는 파이썬으로 파워포인트를 제어해보았습니다. 슬라이드에서 지원하는 레이아웃을 추가하고, 각 속성들을 설정하는 방법을 배웠습니다.
이번장 내용을 모두 학습하셨다면, 주식 분석 보고서 자동화 프로젝트( Link ) 진행해보세요. 재미난 프로젝트가 될 것입니다.
여러분이 사용하고 있는 테마와 보고서에 한번 적용해시고요.
반복적인 업무를 자동화함으로써 칼퇴하십시오!
도움이 되셨다면, 좋아요 / 구독 버튼 눌러주세요~
저작물의 저작권은 작성자에게 있습니다.
공유는 자유롭게 하시되 댓글 남겨주세요~
상업적 용도로는 무단 사용을 금지합니다.
끝까지 읽어주셔서 감사합니다^^