[python-pptx] python으로 PowerPoint 글꼴 정보를 csv로 출력

배경



PowerPoint 문서 Review에서 일부 글꼴이 잘못되었다고 지적했습니다.
100페이지 이상의 슬라이드의 어디의 폰트가 다른가를, 하나씩 체크해 수정….
목검으로 하고 싶지 않았고, 앞으로도 같은 작업을 할 가능성이 있으므로 효율적으로 할 수 없을까… 라고 생각했습니다.

python-pptx



지금의 시대 파이썬으로 할 수 없는 일은 없어!
살펴보면 python-pptx에서 python에서 PowerPoint 파일을 조작 할 수 있음을 알았습니다.
공식 페이지 : python-pptx

객체 이미지



Qiita의 위대한 선구자들의 기사를 참고로 공식 Getting Start를 조금 만졌습니다.
어쩐지 이미지가 붙었으므로, 아래에 Dump 합니다.
(잘못되면 지적을 부탁드립니다…)

전체 부감도



Presentation > slides[] > shapes[] > text_frame.paragraphs[] > runs[]


shapes[] 와 슬라이드의 대응



slide 는 그 슬라이드내의 객체를 shapes[] 에 배열의 형태로 가지고 있다.


text_frame.paragraphs[] 와 슬라이드 대응



shape 안에서, 문자를 가지는 것(?)은 text_frame.paragraphs[] 를 가질 수 있다.
자주 shapes[n].paragraphs[m] 로 액세스하려고 하는데 오류가 있었습니다…


runs[]와 슬라이드 대응



1문자마다 폰트를 바꿀 수 있습니다만, 어떻게 가지고 있는 것일까…라고, 전전부터 의문이었습니다.
run 이라는 단위로 가지고 있는 것 같아, 각각에 폰트를 설정할 수 있습니다.


만든 것



모든 슬라이드의 모든 paragraphs와 runs를 csv로 dump.
TARGET_FILE_PATH 에는 대상의 powerpoint 파일에의 패스를, OUTPUT_FILE_PATH 에는 출력의 csv 의 파일에의 패스를 설정.

python-pptx.py
from pptx import Presentation
from pptx.util import Pt
import csv

TARGET_FILE_PATH = './targetFile/targetFile.pptx'
OUTPUT_FILE_PATH = './output.csv'
FONT_SIZE_DIVESER = 12700
# ["pptxFile名","slide番号","object番号","run番号","オブジェクトタイプ"," font.name"," font.size"," text"]
def export_slide_fonts_and_text():
  outputArray = []
  outputArray.append(["pptxFile名","slide番号","object番号","paragraph番号","run番号","オブジェクトタイプ"," font.name"," font.size"," text"])

  # ppt file の読み込み
  prs = Presentation(TARGET_FILE_PATH)

  slide_number = 0
  # スライドの読み込み
  for slide in prs.slides:
    shape_number = 0
    # shape ごとに処理
    for shape in slide.shapes:
      if not shape.has_text_frame:
        shape_number = shape_number + 1
        continue

      paragraph_number = 0
      # paragraph の段階で一旦出力
      for paragraph in shape.text_frame.paragraphs:
        if(paragraph.font.size != None):
          fontSize = paragraph.font.size/FONT_SIZE_DIVESER
        else:
          fontSize = None
        outputArray.append([TARGET_FILE_PATH, slide_number, shape_number,paragraph_number, "-","paragraph", str(paragraph.font.name), str(fontSize), paragraph.text])

        run_number = 0
        # runを各々出力
        for run in paragraph.runs:
          if(run.font.size != None):
            fontSize = run.font.size/FONT_SIZE_DIVESER
          else:
            fontSize = None
          outputArray.append([TARGET_FILE_PATH, slide_number, shape_number,paragraph_number, run_number, "run", str(run.font.name), str(fontSize), run.text])

          run_number = run_number + 1
        paragraph_number = paragraph_number + 1
      shape_number = shape_number + 1
    slide_number = slide_number +1

  # 書き込み
  with open(OUTPUT_FILE_PATH, 'w', encoding="shift-jis") as f:
    wirter = csv.writer(f, lineterminator='\n', quoting=csv.QUOTE_ALL)
    wirter.writerows(outputArray)

if __name__ == "__main__":
  export_slide_fonts_and_text()

출력된 것을 조금 가공



csv 로 출력된 것을 Excel 에 붙여 색을 붙여 본 것이 아래와 같습니다.
대략입니다만, 하고 싶은 일이 되어 있을 것 같은 느낌입니다!


ToBe



기본값을 가져옵니다.



위의 Excel에서 볼 수 있듯이 글꼴 이름과 글꼴 크기가 "None"인 경우가 많습니다.
값이 설정되어 있지 않은 경우 디폴트의 값을 참조한다고 합니다.
placeholder 에 액세스하는 것으로 취득할 수 있을 것 같습니다만… 좀 더 조사해 보고 싶습니다.

참고로 해 주신 선구자님



감사합니다…
압도적 감사 ...!
python-pptx 요약
python-pptx로 리포팅 자동화
[Python] 폭속으로 보고 파와포를 생성!
파이썬을 이용한 리포트의 자동 작성【PowerPoint】【python-pptx】
htps : // 이 m/코로_440/이고 ms/22에 8539다 465686496d3

좋은 웹페이지 즐겨찾기