개발자/파이썬 Python

파이썬 pptx 파일 자동화 python-pptx 라이브러리

지구빵집 2022. 12. 29. 09:31
반응형

 

 

요즘 수많은 업무 자동화 프로그램과 웹사이트에서 어떤 방식으로 사용자 요청 작업을 실행하고, 결과를 어떤 형태로든 다운로드할 수 있도록 하는지 궁금했다. 특히 웹을 통해 문서를 생성하고 만들고 수정하는 작업들, 예를 들면 배경 화면 제거, 문서 이미지로 변환하기나 반대로, 번역이나 음성을 텍스트로 만들기 등이 모두 자동으로 진행하는데 어떤 방식으로 하는지 알고 싶었다. 좀 더 일찍 검색하고 찾아봤다면 하는 생각이 든다.

 

항상 먼저 대가를 치를 준비를 해야 한다. 머리는 비상하고, 행동은 민첩하고, 반짝반짝 빛나는 아이디어가 넘칠 때 생각하고, 실행하다가 포기하고 멈춘 것들은 이제 모두 현실이 되었지만 바로 그 지점에 남자는 없다는 생각이 참담할 뿐이다. 잘못한 길에 들어섰다면 다시 뒤로 물러나 수정하고 올바른 길을 걸어야 한다. 

 

 

python-pptx는 PowerPoint(.pptx) 파일을 만들고 업데이트하기 위한 Python 라이브러리입니다.

 

일반적인 용도는 웹 응용 프로그램에서 링크를 클릭하여 다운로드할 수 있는 데이터베이스 콘텐츠에서 사용자 지정 PowerPoint 프레젠테이션을 생성하는 것입니다. 여러 개발자가 이를 사용하여 작업 관리 시스템에 저장된 정보를 기반으로 프레젠테이션 가능한 엔지니어링 상태 보고서 생성을 자동화했습니다. 또한 프레젠테이션 라이브러리를 대량으로 업데이트하거나 손으로 바로잡기에는 지루한 슬라이드 한두 개를 자동으로 생성하는 데 사용할 수도 있습니다.

 

자세한 내용은 python-pptx 공식 문서 에서 확인할 수 있습니다.

python-pptx로 무엇을 할 수 있는지 빠르게 알아보려면 스크린숏과 함께 예제를 살펴보세요. 

 

 

python-pptx 설치는 PyPI에서 호스팅 되므로 pip로 설치하는 것은 간단합니다. 아래 명령으로 설치합니다.

 

$ pip install python-pptx

 

설치할 때 관리자 권한으로 실행한 명령 창에서 실행하고, 의존성 있는 lxml, Pillow, XlsxWriter (to use charting features) 설치를 확인한다. 혹시 에러가 난다면 순서대로 설치하는 것을 권장한다.

 

pptx 파일 만들기

 

아래 코드는 새로운 pptx 파일을 만드는 코드다. VS Code에서 입력하여 실행하면 test.pptx 파일이 폴더에 만들어진다. 

 

from pptx import Presentation

prs = Presentation()
title_slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(title_slide_layout)
title = slide.shapes.title
subtitle = slide.placeholders[1]

title.text = "Hello, World!"
subtitle.text = "python-pptx was here!"

prs.save('test.pptx')

 

pptx 파일을 열면 아래와 같다. 이제 pptx에 내용을 채워넣는 방법을 알아보자.

 

 

새로운 pptx 파일을 만드는 코드

 

파워포인트를 처음 실행할 때 ppt 파일을 생성하고 원하는 레이아웃을 선택해 슬라이드를 추가하는 코드다. 

 

#python-pptx의 가장 기본이 되는 Presentation 클래스 불러오기
from pptx import Presentation

#Presentation 객체 생성
prs = Presentation()

#슬라이드의 레이아웃 선택
slide_layout = prs.slide_layouts[0]

#선택한 레이아웃의 슬라이드 추가
slide = prs.slides.add_slide(slide_layout)

#pptx 파일 저장
prs.save('test3.pptx')

 

여기서 ppt의 기본 레이아웃(Office Theme)는 11개가 있는데, 아래의 순서대로 prs.slide_layouts[ ]의 괄호 안에 0~11 중 숫자 하나를 선택해서 넣어주면 해당 레이아웃을 사용할 수 있다. 원하는 ppt 레이아웃을 prs.slide_layouts[0] 번호에 넣어준다. 

 

 

ppt 레이아웃

 

레이아웃 0번으로 만들어진 test3.pptx 파일은 아래와 같다. 파일이 열려 있으면 ppt 파일을 닫고 실행한다.

 

 

레이아웃 0 번 pptx 파일 생성

 

 

아래는 파워포인트에서 제공하는 11개 레이아웃을 모두 작성하여 파일로 만들어 주는 코드다. pptx파일을 열면 11개 레이아웃이 들어간 슬라이드 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')

 

 

슬라이드에 글 쓰기

 

방금 전 추가했던 '제목+부제' 레이아웃(혹은 템플릿)에는 두 가지 placeholder가 존재한다. placeholder는 그냥 콘텐츠를 입력하는 자리, 즉 상자라고 생각하면 된다. 우리는 이 placeholder를 선택해서 글자를 입력한다. placeholder에 대한 자세한 설명은 포스팅을 참고한다. 코드는 아래 참고 1번 링크.

 

from pptx import Presentation

prs = Presentation()

slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(slide_layout)

# 제목과 부제 박스를 선택해서 변수에 대입
title = slide.placeholders[0]   # title = slide.shapes.title와 동일
subtitle = slide.placeholders[1]

# 제목과 부제에 글자 입력
title.text = "안녕하세요. Python-pptx에 대한 포스팅입니다."
subtitle.text = "서브타이틀 자리 placeholder"

# 추가 문단 입력하고 싶을 때 해당 코드 사용
tf = subtitle.text_frame
p = tf.add_paragraph()
p.text = '추가 문단'

#ppt 저장
prs.save('test.pptx')

 

test.pptx 파일을 열어 아래와 같은 결과를 확인하고 placeholder에 관해 자세히 알아보기 위해 다음 단계를 진행한다.

 

슬라이드에 글 쓰기

 

여러 레이아웃 중에서 가장 많이 사용하는 레이아웃을 작성하는 방법을 알아보자. 실행 결과로 만든 파일 이미지와 코드를 함께 올린다.

 

가장 기본적인 pptx 파일 만들기 

 

from pptx import Presentation

prs = Presentation()
title_slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(title_slide_layout)
title = slide.shapes.title
subtitle = slide.placeholders[1]

title.text = "Hello, World!"
subtitle.text = "python-pptx was here!"

prs.save('test.pptx')

 

글머리 기호 슬라이드 만들기

 

from pptx import Presentation

prs = Presentation()
bullet_slide_layout = prs.slide_layouts[1]

slide = prs.slides.add_slide(bullet_slide_layout)
shapes = slide.shapes

title_shape = shapes.title
body_shape = shapes.placeholders[1]

title_shape.text = 'Adding a Bullet Slide'

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

p = tf.add_paragraph()
p.text = 'Use _TextFrame.add_paragraph() for subsequent bullets'
p.level = 2

prs.save('test.pptx')

 

add_textbox() 구현

 

 

from pptx import Presentation
from pptx.util import Inches, Pt

prs = Presentation()
blank_slide_layout = prs.slide_layouts[6]
slide = prs.slides.add_slide(blank_slide_layout)

left = top = width = height = Inches(1)
txBox = slide.shapes.add_textbox(left, top, width, height)
tf = txBox.text_frame

tf.text = "This is text inside a textbox"

p = tf.add_paragraph()
p.text = "This is a second paragraph that's bold"
p.font.bold = True

p = tf.add_paragraph()
p.text = "This is a third paragraph that's big"
p.font.size = Pt(40)

prs.save('test.pptx')

 

add_picture() 예제

 

 

from pptx import Presentation
from pptx.util import Inches

img_path = 'monty-truth.png'

prs = Presentation()
blank_slide_layout = prs.slide_layouts[6]
slide = prs.slides.add_slide(blank_slide_layout)

left = top = Inches(1)
pic = slide.shapes.add_picture(img_path, left, top)

left = Inches(5)
height = Inches(5.5)
pic = slide.shapes.add_picture(img_path, left, top, height=height)

prs.save('test.pptx')

 

add_shape() 예제

 

 

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE
from pptx.util import Inches

prs = Presentation()
title_only_slide_layout = prs.slide_layouts[5]
slide = prs.slides.add_slide(title_only_slide_layout)
shapes = slide.shapes

shapes.title.text = 'Adding an AutoShape'

left = Inches(0.93)  # 0.93" centers this overall set of shapes
top = Inches(3.0)
width = Inches(1.75)
height = Inches(1.0)

shape = shapes.add_shape(MSO_SHAPE.PENTAGON, left, top, width, height)
shape.text = 'Step 1'

left = left + width - Inches(0.4)
width = Inches(2.0)  # chevrons need more width for visual balance

for n in range(2, 6):
    shape = shapes.add_shape(MSO_SHAPE.CHEVRON, left, top, width, height)
    shape.text = 'Step %d' % n
    left = left + width - Inches(0.4)

prs.save('test.pptx')

 

add_table() 예제

 

 

from pptx import Presentation
from pptx.util import Inches

prs = Presentation()
title_only_slide_layout = prs.slide_layouts[5]
slide = prs.slides.add_slide(title_only_slide_layout)
shapes = slide.shapes

shapes.title.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')

 

 

프리젠테이젼 모든 슬라이드에서 텍스트를 추출하는 예제

 

from pptx import Presentation

prs = Presentation(path_to_presentation)

# text_runs will be populated with a list of strings,
# one for each text run in presentation
text_runs = []

for slide in prs.slides:
    for shape in slide.shapes:
        if not shape.has_text_frame:
            continue
        for paragraph in shape.text_frame.paragraphs:
            for run in paragraph.runs:
                text_runs.append(run.text)

 

 

정리하는 것도 힘드네. ㅎ 배우고 익히고 습관이 되게 하고  실천하는 일. 

 

 

참고 

python-pptx 공식 지원 문서

코딩 유치원 - 파이썬으로 PPT 문서 다루기 1편. ppt 슬라이드 생성하고 텍스트 입력하기 

 

 

 

반응형