非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【Python】パワポ自動化の基礎:スライド内オブジェクトの自動判別と動的データ編集・サイズ変更

   

PythonでPowerPointを操作する「python-pptx」を用い、スライド内に混在する各種オブジェクトを自動検出し、要素に応じた個別操作を行う手法を解説します。実務におけるドキュメント生成では、表へのデータ挿入、画像のサイズ変更、既存テキストボックスへの文章追記など、要素ごとに異なる処理を施す場面が多くあります。オブジェクトの種類を判別し制御を行うコードで書き留めておきます。

from pathlib import Path
from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE_TYPE
from pptx.util import Inches

# ==========================================
# 準備:ファイルの読み込み
# ==========================================
# ※ 実行する際は、スクリプトと同じフォルダに「template.pptx」を用意してください。
template_path = Path("template.pptx")
if not template_path.exists():
    raise FileNotFoundError(f"ファイルが見つかりません: {template_path}")

prs = Presentation(str(template_path))

# 操作対象のスライドを指定(例として1ページ目:index=0 を操作)
slide_to_check = prs.slides[0]

print("--- スライド内のオブジェクト探索と操作開始 ---")

# スライド上に配置されているすべてのオブジェクト(図形、テキスト、表など)をループで処理
for shape in slide_to_check.shapes:
    
    # 1. 表(Table)を検出した場合
    if shape.shape_type == MSO_SHAPE_TYPE.TABLE:
        print("➔ 【表(Table)】を検出しました。")
        
        tbl = shape.table
        # 【追加操作】0行目・0列目(一番左上のセル)を取得
        cell = tbl.cell(0, 0)
        
        # セルにテキストを代入(※元の書式やフォントはリセットされます)
        cell.text = "更新データ"
        print("   [操作] 表の左上(0行0列)のセルに '更新データ' を挿入しました。")
        
    # 2. 画像(Picture)を検出した場合
    elif shape.shape_type == MSO_SHAPE_TYPE.PICTURE:
        print("➔ 【画像(Picture)】を検出しました。")
        
        # 【追加操作】画像の横幅(width)を 5インチ に変更
        # ※縦横比(アスペクト比)を維持したまま、縦幅も自動的に縮尺されます
        shape.width = Inches(5.0)
        print("   [操作] 画像の横幅を 5インチ に変更しました(縦横比は維持されます)。")
        
    # 3. テキストボックスを検出した場合
    elif shape.shape_type == MSO_SHAPE_TYPE.TEXT_BOX:
        print(f"➔ 【テキストボックス】を検出しました。文字数: {len(shape.text)}")
        
        # 【追加操作】既存の文章の後ろに、改行を挟んでテキストを追記
        # text_frame.add_paragraph() で新しい段落を追加し、そこに文字をセットします
        tf = shape.text_frame
        new_paragraph = tf.add_paragraph()
        new_paragraph.text = "(プログラムによって追記されたテキスト)"
        print("   [操作] テキストボックスに新しい段落を追記しました。")
        
    # 4. その他の図形の場合
    else:
        print(f"➔ 【その他の図形(タイプID: {shape.shape_type})】を検出しました。特になにもしません。")


# ==========================================
# 完了:別名で保存
# ==========================================
output_path = Path("object_modified_output.pptx")
prs.save(str(output_path))

print("---------------------------------------")
print(f"オブジェクトの個別操作が完了しました。保存先: {output_path}")
 

スポンサーリンク

 - Python