0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

python パワポのテキストの特定の文字列の色を変える(ChatGPT協力)

Posted at

python-pptxでパワポのテキストの特定の文字列の色を変える方法
ChatGPTに聞いたら一発だった
ちゃんとコードを見直してどうやってるのか見直さないと
考える癖なくなっちゃう

image.png

ChatGPT質問.txt
python-pptx で一個のテキストボックスを作成して、指定したテキストデータを入力するものとします。

・テキストデータが複数行なら段落を分けて入力する関数
指定例
textsharp = textboxset(textsharp,textdata)

・指定したワードのフォント色を指定した色に変える関数
指定例
textsharp = setwordcolor(textsharp,word1,color1)
textsharp = setwordcolor(textsharp,word2,color2)
textsharp = setwordcolor(textsharp,word3,color3)
直列処理も可能とする

それぞれ作成してください
ppt_textcolor.py
from pptx import Presentation
from pptx.util import Pt
from pptx.dml.color import RGBColor


def textboxset(slide, textdata, left, top, width, height):
    """
    テキストボックスを作成し、テキストデータを段落ごとに入力する。
    
    Args:
        slide: スライドオブジェクト
        textdata: テキストデータ(複数行の文字列)
        left: テキストボックスの左位置(Pt単位)
        top: テキストボックスの上位置(Pt単位)
        width: テキストボックスの幅(Pt単位)
        height: テキストボックスの高さ(Pt単位)
    
    Returns:
        text_box: 作成されたテキストボックスのオブジェクト
    """
    textbox = slide.shapes.add_textbox(left, top, width, height)
    text_frame = textbox.text_frame
    text_frame.clear()
    
    # テキストを段落ごとに分割して設定
    for line in textdata.splitlines():
        p = text_frame.add_paragraph()
        p.text = line
    
    # 最初の段落は既存の段落が利用されるため削除
    if text_frame.paragraphs[0].text == "":
        text_frame.paragraphs[0]._element.getparent().remove(text_frame.paragraphs[0]._element)
    
    return textbox


def setwordcolor(textbox, word, color):
    """
    テキストボックス内の指定ワードのフォント色を変更する。
    
    Args:
        textbox: テキストボックスオブジェクト
        word: 色を変更したい文字列
        color: 変更後の色 (RGBタプル形式: (R, G, B))
    
    Returns:
        textbox: 更新されたテキストボックス
    """
    for paragraph in textbox.text_frame.paragraphs:
        for run in paragraph.runs:
            if word in run.text:
                # ワードの位置を見つけて部分変更
                start_index = run.text.find(word)
                end_index = start_index + len(word)
                before = run.text[:start_index]
                target = run.text[start_index:end_index]
                after = run.text[end_index:]
                
                # 元の文字列を削除して、新しいフォーマットの文字列を挿入
                run.text = before
                if before:
                    run = paragraph.add_run()
                
                run.text = target
                run.font.color.rgb = RGBColor(*color)
                
                if after:
                    run = paragraph.add_run()
                    run.text = after
    return textbox


# 使用例
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])

# テキストデータ入力
textdata = """This is a test.
python-pptx is useful.
You can customize your slides."""

textbox = textboxset(slide, textdata, Pt(100), Pt(100), Pt(400), Pt(200))

# 指定ワードの色変更
textbox = setwordcolor(textbox, "test", (255, 0, 0))  # 赤
textbox = setwordcolor(textbox, "python-pptx", (0, 255, 0))  # 緑
textbox = setwordcolor(textbox, "slides", (0, 0, 255))  # 青

# プレゼンテーションを保存
prs.save("output.pptx")
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?