今回の記事では、pythonでパワポを操作して、テキスト編集を行う方法について解説をしていきたいと思います
前回の記事では、スライドを作成する方法やプレースホルダーについて解説をしました
初めてpythonでパワポ操作をする場合には、前回の記事からスタートすると理解が深まります
この記事で学べること
pythonでパワポを操作する方法がわかる
pythonでパワポのテキストを編集することができる
pythonから文字色や複数行の文字列を設定することができる
Contents
pythonでパワポ操作〜テキスト編集について〜
pythonからパワポのテキストを編集するには、「TextFrame」を使用していきます
TextFrameとは
TextFrameオブジェクトとは、テキストのフレームワークを指しています
パワーポイントには、図形やテキストボックスなどテキストを編集することができる領域が設定されています
この、テキストを編集することができる領域のことを「TextFrame」と呼びます
パワポを操作している場合には、TextFrameを意識することはありませんが、pythonでパワポを操作する場合には、TextFrameで指定して、テキストを編集していきます
TextFrameを指定することによって、インデントやフォント、文字色などを設定することが可能になります
しかし、これらを設定するには「TextFrame」以外にも必要なものがあり、
- Paragraphオブジェクト
- Runオブジェクト
の知識が必要になります
TextFrameオブジェクト | Paragraphオブジェクト | Runオブジェクト | |
テキスト設定 | 可能 | 不可 | 不可 |
複数行設定 | 可能 | 可能 | 不可 |
文字の詳細設定 | 可能 | 可能 | 可能 |
TextFrameの使い方
では実際にTextFrameを使って、テキストを編集していきたいと思います
TextFrameでテキストを編集する場合には、既存のPowerPointファイルを読み込んで行なっていきます
手順としては、以下のようになります
- 既存ファイルの読み込み
- スライド内にある要素・種類を抽出
- TextFrameが含まれているかを確認
- TextFrameの取得
- テキストの編集
from pptx import Presentation
from pptx.enum.text import MSO_AUTO_SIZE
prs=Presentation('.pptx')
#1ページ目(「タイトル スライド」のレイアウトを指定)
slide_layout_0 = prs.slide_layouts[0]
slide_1 = prs.slides.add_slide(slide_layout_0)
old_sld0_layout0=prs.slides[0] #既存スライドを読み込む
for shape in old_sld0_layout0.shapes: #読み込んだ既存スライドから図形(shapeオブジェクト)を探す
print(shape.name) #探した図形の番号を返す(ex.Title 1 Subtitle 2)
if not shape.has_text_frame: #shapeオブジェクトにTextFrameが含まれているかを確認
continue
textFrame = shape.text_frame #図形(shapeオブジェクト)からTextFrameを取得
textFrame.text='textFrameのサンプル'#TextFrameにテキストを入力
textFrame.autosize = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE #TextFrameのフォントサイズを自動調整
textFrame.word_wrap = True #TextFrame内テキストの折り返しを有効に
#PowerPointを保存
prs.save("powerpnt.pptx")
TextFrameオブジェクトにはいくつかのプロパティがあります
プロパティ | 機能 | 設定 |
textプロパティ | テキストフレームに文字を入力・取得 | |
word_wrapプロパティ | 文字列の折り返し | Trueで有効. デフォルトはFalse |
margin_top(bottom)プロパティ | 上下の余白を調整 | |
margin_left(right)プロパティ | 左右の余白を調整 | |
autosizeプロパティ | 文字のサイズを自動調整. MSO_AUTO_SIZEを使用 | MSO_AUTO_SIZE NONE…自動調整しない. |
vertical_anchorプロパティ | 文字の上下位置. MSO_VERTICAL_ANCHORを使用 | MSO_VERTICAL_ANCHOR TOP…上揃え |
pythonでパワポ操作〜段落の編集について〜
テキスト入力は1行で済む場合もあれば、複数行になることもあります
複数行になった場合に、段落の編集をするのが、「Paragraphオブジェクト」になります
Paragraphオブジェクトについて
Paragraphオブジェクトとは、TextFrame内の段落を調整するものになります
TextFrame内の文字が1行であれば問題ありませんが、複数行になったときには、Paragraphオブジェクトの設定が必要になります
from pptx import Presentation
from pptx.enum.text import MSO_AUTO_SIZE
#既存スライドの読み込み
prs=Presentation('.pptx')
#既存スライドの1枚目を読み込み
old_sld0_layout0=prs.slides[0]
#スライド上のShapeオブジェクト(テキストボックス)の属性情報の抽出
#has_text_frame属性が「True」でTextFrameオブジェクトの包含が可能
for shape in old_sld0_layout0.shapes:
print(shape.shape_type, shape.name, shape.has_text_frame)
#TextFrameオブジェクトに段落(Paragraphオブジェクト)を2つ追加する
#rangeの数値を変えると段落の数が変化
for text in range(2):
old_sld0_layout0.shapes[0].text_frame.add_paragraph()
old_sld0_layout0.shapes.text_frame.add_paragraph()
#PowerPointを保存
prs.save("powerpnt.pptx")
段落の調整ができたので、次は字下げとフォントの位置調整です
from pptx import Presentation
from pptx.enum.text import MSO_AUTO_SIZE
from pptx.enum.text import PP_ALIGN
prs=Presentation('.pptx')
old_sld0_layout0=prs.slides[0]
for shape in old_sld0_layout0.shapes:
print(shape.shape_type, shape.name, shape.has_text_frame)
paras =old_sld0_layout0.shapes[0].text_frame.paragraphs
for i, para in enumerate(paras,0):
para.text="字下げ"
para.level=i
paras = old_sld0_layout0.shapes.text_frame.paragraphs
for i, para in enumerate(paras, 0):
para.text = "段落ごとの水平位置(左/中央/右揃え)を指定する"
#PP_ALIGN.LEFT, PP_ALIGN.CENTER, PP_ALIGN.RIGHTで選ぶ
para.alignment = PP_ALIGN.CENTER
#PowerPointを保存
prs.save("powerpnt.pptx")
最後にフォントの調整と段落間の調整です
from pptx import Presentation
from pptx.enum.text import MSO_AUTO_SIZE
from pptx.enum.text import PP_ALIGN
from pptx.enum.dml import MSO_THEME_COLOR
from pptx.util import Pt
prs=Presentation('.pptx')
old_sld0_layout0=prs.slides[0]
for shape in old_sld0_layout0.shapes:
print(shape.shape_type, shape.name, shape.has_text_frame)
paras =old_sld0_layout0.shapes[0].text_frame.paragraphs
for i, para in enumerate(paras, 0):
para.text = "文字列のフォントを調整"
#MSO_THEME_COLOR.ACCENT_1, MSO_THEME_COLOR.ACCENT_2, MSO_THEME_COLOR.ACCENT_6から選択
para.font.color.theme_color = MSO_THEME_COLOR.ACCENT_1 # フォントの色
para.font.bold = True # フォントの大きさ
for para in paras:
para.text = "15ptで調整"
para.space_after = Pt(15)
#PowerPointを保存
prs.save("powerpnt.pptx")
Paragraphオブジェクトのプロパティ
TextFrameと同じように、Paragraphオブジェクトにもプロパティがあります
プロパティ | 機能 | 設定 |
textプロパティ | 段落に文字列を追加 | |
levelプロパティ | 段落の字下げ | 0〜8で調整 |
fontプロパティ | フォント設定 | Fontオブジェクトを使用 |
alignmentプロパティ | 文字列の水平位置 | PP_ALIGNを使用 |
line_spacingプロパティ | 行間の高さを指定 | ptで指定 |
space_after(before)プロパティ | 前後の段落の調整 | ptで指定 |
enumerate関数について
コードの途中で出てきた「enumerate」ですが、このenumerate関数を使うことで、要素のインデックスと要素を同時に取り出すことができます
似ている関数に、「range関数」もありますが、range関数ではインデックスを取り出すだけになります
pythonman = ['未経験独学', '収益化ばっちり', 'twitter自動化']
for i, j in enumerate(pythonman):
print('{0}:{1}'.format(i, j))
>>>出力結果
0:未経験独学
1:収益化ばっちり
2:twitter自動化
まず1行目でpythonmanにリストを代入しています
2行目のfor文で変数iとjにpythonmanを代入し続けます
このとき、変数iにはlistの添字が代入されるので、0〜2の数字が代入されることになります
そのため、変数iには数字、変数jには文字列、という状況になっています
それをprintで出力すると、上記のような出力結果になります
pythonでパワポ操作〜文字単位での編集について〜
文字単位での編集を行うには、「Runオブジェクト」を使用します
Runオブジェクトとは
Runオブジェクトは、文字列の最小単位を調整するオブジェクトになります
文字列の最小単位は1文字ずつになり、単語になります
1文字ずつ色を変更することは少ないですが、単語レベルで文字色を変えることはありますので、覚えておいて損はありません
from pptx import Presentation
from pptx.dml.color import RGBColor
prs = Presentation()
#"タイトルとコンテンツ"のレイアウトオブジェクトを取得
title_slide_layout = prs.slide_layouts
#新しいスライドを追加(タイトルとコンテンツ)
old_sld0_layout0 = prs.slides.add_slide(title_slide_layout)
#スライド中の要素を抽出、種類を表示
for s in old_sld0_layout0.shapes:
print(s.name)
old_sld0_layout0.shapes[0].text = '文字色を変更'
pg = old_sld0_layout0.shapes[0].text_frame.paragraphs[0]
# 段落(paragraphオブジェクト)を操作するために、runオブジェクトを取得する
rn = pg.runs[0]
# runオブジェクトのfont.color.rgbプロパティに文字色を指定
rn.font.color.rgb = RGBColor(50, 185, 20)
tf = old_sld0_layout0.shapes[0].text_frame
tf.add_paragraph()
pg = old_sld0_layout0.shapes[0].text_frame.paragraphs
rn0 = pg.add_run()
rn0.text = 'AAA'
rn0.font.color.rgb = RGBColor(255, 0, 0)
rn1 = pg.add_run()
rn1.text = 'BBB'
rn1.font.color.rgb = RGBColor(0, 255, 0)
rn2 = pg.add_run()
rn2.text = 'CCC'
rn2.font.color.rgb = RGBColor(0, 0, 255)
prs.save('テキストカラー変更.pptx')
Runオブジェクトのプロパティ
Runオブジェクトのプロパティは以下のようになります
プロパティ | 機能 | 設定 |
textプロパティ | 文字列の追加 | |
fontプロパティ | フォント設定 | Fontオブジェクトを使用 |
hyperlink.addressプロパティ | リンクの割り当て | URL設定 |
python-pptxについて詳しく知りたい場合には、公式ドキュメントがおすすめです
おすすめプログラミングスクール(無料体験あり)