今回も引き続き、Pythonから「PowerPoint」を操作する機能を提供する「python-pptx」ライブラリを紹介します。
前回の記事では「pytnon-pptxの導入~ファイル作成」「スライドを追加する」「プレースフォルダ
にコンテンツを挿入する」といった基本操作について解説しました。
前回の記事はこちらになります、重複する内容は割愛していますので一読して頂くことをお勧めします。
また、その他連載記事へのリンクは以下の通りです。
さて、連載2回目となる今回の記事では「タイトル」「見出し」「本文・箇条書き」のテキスト設定や編集にフォーカスします。
プレゼンテーション資料を作るうえ「テキスト」の存在はやはり重要で「理解しやすさ」「訴求性」に関係します。
前回の記事でもプレースフォルダ(コンテンツの雛形)にテキストを設定する方法について触れましたが、「フォント」「段落」「インデント」などさらに細かく編集・設定することもできます。
それには「TextFrameオブジェクト」やそれに関連するオブジェクト・メソッド(プロパティ)の概要を知る必要があります。今回は、このTextFrameオブジェクトに関して深堀りしてテキスト編集にこだわります。
この記事を読むことで次のことがわかるようになりますので最後までお付き合い下さい。
それでは、次節より各オブジェクトの詳細について解説をしていきます。
なお、本記事内で紹介する各種クラスや関数などの使い方は一例です。省略可能なオプション引数などについては割愛していますので、詳細や不明点などは必要に応じて下記「公式ドキュメント」を参照してください。
python-pptx 公式ドキュメント(API Document)
https://openpyxl.readthedocs.io/en/stable/
1. スライドのテキストを管理するTextFrameオブジェクト
本節ではpython-pptxを使ってテキストを設定するうえで、欠かすことのできない「TextFrame」というクラスについて解説しています。
「TextFrame」とは何なのか? という概要からオブジェクトの取得・テキストの設定までを取り上げていきます。
1.1 TextFrame(テキストフレーム)とは
先にも触れましたが、python-pptxでは、テキスト(文字列)を「TextFrame」というフレームワーク(枠組み)の中に配置していくことになります。
PowerPointは図1のように、プレースフォルダ(TITLE, BODY、、等)、図形(AutoShape)、グラフ、テーブル(表)などといったさまざまな要素(※)によって構成されています。(※プレゼンテーション上の要素は、全てShapeオブジェクトとして扱います。)
これら、一つ一つの要素にはテキストを挿入することができる領域が用意されていて、この領域が「TextFrame」ということになります。
普段はあまり意識することなく、これらの要素にテキストを入力していると思いますが、プログラムで操作する際には必ずこのTextFrame(オブジェクト)を経由することになります。
さらに、このTextFrameの中身について掘り下げていきます。
TextFrameがテキストを格納するフレームであるならば、その中には段落があり文字(単語)がありといったぐあいに、関連する配下のオブジェクトの集合体で構成されています。
それによって、インデント(字下げ)やフォントの書式など、細かいテキスト設定に対応することが可能となっているのです。
たとえば、次の3つスタイルをもつテキストを設定したいとします。
- 1行分(1つの段落)の文字列を設定するだけの場合
- 段落分けをして複数行(複数段落)の文字列を設定する場合
- 文字色や字下げなど高度な設定をしたい場合
➀②➂のすべてを、TextFrameオブジェクトだけで対応できるわけではありません。図3のように、さらに配下の関連オブジェクトを連携させて対応することになります。
実際のスライド上での各オブジェクトの相対関係を図示したのが図4となります。テキストボックス(Shapeオブジェクト)の中に、文字列を設定している例です。
図のように、各Shapeオブジェクトごとに、独立した TextFrameオブジェクト を一つずつ持ち、その中に必要分の段落( Paragraphオブジェクト )が配置され、さらに各文字単位には Runオブジェクト が割り当てられるといった階層構造となります。
- テキストボックス(Shapeオブジェクト)・・・赤の枠線
- テキストフレーム(TextFrameオブジェクト)・・・水色の枠線
- 段落(Paragraphオブジェクト)・・・緑の枠線
- 個別文字(Runオブジェクト)・・・青の枠線
それでは、次節より各オブジェクトの詳細と関連するメソッド属性について解説をしていきます。
1.2 TextFrameオブジェクトの取得と設定
テキストの管理領域となるTextFrameオブジェクトは実際に文字を挿入したい、テキストボックスや図形などのShapeオブジェクト(※) 配下の text_frameプロパティ から取得できます。
(※Shapeオブジェクトは<連載5回目>の記事で詳しく解説しています。)
TextFrameオブジェクトの主要なメソッドやプロパティには以下のようなものがあります。
【TextFrameオブジェクト】 | 【機能】 | 【その他詳細】 |
---|---|---|
text | テキストフレームに文字列 を設定/取得する | |
autosize | 文字のサイズを自動調整 する場合の指定 | 【MSO_AUTO_SIZEクラス】 ・.NONE(自動調整しない) ・.SHAPE_TO_FIT_TEXT(Frameサイズをテキストに合わせる) ・.TEXT_TO_FIT_SHAPE(テキストをFrameサイズに合わせる) |
word_wrap | 文字の折り返しの有無を 設定/取得する | ・折り返す場合はTrueを指定 ・デフォルト(折り返さない)はFalse |
vertical_anchor | 文字の上下位置 | 【MSO_VERTICAL_ANCHORクラス】 ・.TOP(上揃え) ・.MIDDLE(中央揃え) ・.BOTTOM(下揃え) |
margin_top(bottom) | 上下の余白を調整する | |
margin_left(right) | 左右の余白を調整する |
テキストをフレームに設定するには、textプロパティ を使います。文字サイズはTextFrame上での直接指定はできず、autosizeプロパティ による自動サイズ調整にて対応します。文字サイズはこのあと紹介する段落(Paragraph)や文字(Run)のレイヤーで指定できます。
このほか、フレーム内の文字位置を vertical_anchorプロパティ で、フレームの余白の調整をmargin_*プロパティ で行います。(図5)
【SAMPLE ➀】
ここでTextFrameオブジェクトに関連した具体例を紹介します。
コードの概要は、スライド内の図形などのShapeオブジェクトの素性を調べます。そして、各ShapeオブジェクトのTextFrameにテキストを設定します。フレーム内の文字のサイズや折り返しは有効とします。<List1>
from pptx import Presentation
from pptx.enum.text import MSO_AUTO_SIZE # MOS_AUTO_SIZEクラスのインポート
prs = Presentation('0218_Blog.pptx') # 既存のファイルを読み込む
sld0 = prs.slides[0]
for shape in sld0.shapes: # スライド中の要素を抽出、種類を表示
print(shape.name) # >> タイトル1、テキストボックス3、矢印:右4、吹き出し:円形12
if not shape.has_text_frame: # shapeオブジェクトにTextFrameが含まれているか確認
continue
textFrame = shape.text_frame # 各種ShapeオブジェクトからTextFrameを取得
textFrame.text = 'Pythonのサンプルプログラムです' # TextFrameにテキストを設定
textFrame.autosize = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE # TextFrameのテキストサイズを自動調整
textFrame.word_wrap = True #TextFrameのテキストの自動折り返しを有効に設定
prs.save('0218_Blog_out.pptx')
ポイントを解説します。
コードの実行結果は以下のようになりました。
「タイトルのプレースフォルダ」「テキストボックス」「図形」に対して、「Pythonのサンプルプログラムです」というテキストが設定されました。また、各Shapeオブジェクトのフレームに収まるサイズや折り返し設定が反映されています。
2. 段落(Paragraphオブジェクト)を追加する
TextFrameオブジェクトの中で段落を管理するユニットが Paragraphオブジェクト となります。
TextFrameオブジェクトには最低1個の段落がデフォルトで存在しています。複数行の段落で構成される文章を設定する場合には、Paragraphを追加する必要があります。
2.1 Paragraphオブジェクトの追加と取得
TextFrameオブジェクトに段落(Paragraphオブジェクト)を追加するには、add_paragraph()メソッド を取得には paragraphsプロパティ を使います。
通常、段落は複数持つことが前提となりますので、TextFrameオブジェクト内ではコレクション(Paragraphオブジェクトを要素としたイテラブルなオブジェクト)として管理されています。
2.2 Paragraphオブジェクトの関連メソッドとプロパティ
Paragraphオブジェクト配下には、主として次のようなメソッド・プロパティが用意され、段落レイヤーに対する操作が可能となります。
【Paragraphオブジェクト】 | 【機能の説明】 | 【その他詳細】 |
---|---|---|
text | 段落に文字列を設定/取得する | |
level | 段落の字下げレベルを 設定/取得する | ・0~8の範囲でレベルを指定する |
font | フォントを設定する (Fontオブジェクトを取得) | 【Fontオブジェクト】関連属性 bold(太字),size(文字サイズ),italic(斜体),color(文字色) |
alignment | 文字列の水平位置の指定 | 【PP_ALIGNクラス】 ・.CENTER(中央) ・.LEFT(左揃え) ・.RIGHT(右揃え) |
line_spacing | 行間の高さの指定 | pt(ポイント)などで指定 |
space_after(before) | 前後の段落の間隔 | pt(ポイント)などで指定 |
段落以降のレイヤーからは fontプロパティ にてフォントの設定を行うことができます。また、段落の字下げを9段階で指定することができる levelプロパティ、それから、行間や段落間の間隔を指定するプロパティがあります。(図7)
【SAMPLE ②】
それでは、Paragraphレイヤでの操作例をサンプルコードを使って確認してみます。
コードの概要は、スライド上のShapeオブジェクト(テキストボックス)に段落(Paragraphオブジェクト)を追加して、表2の主要属性の効果を確認する内容になります。
from pptx import Presentation
from pptx.enum.text import PP_ALIGN # 段落の水平位置のEnume
from pptx.enum.dml import MSO_THEME_COLOR # テーマカラーのEnume
from pptx.util import Pt # 単位の定義(ポイント)
prs = Presentation("Paragraph_Sample.pptx") # pptxの読込み
sld0 = prs.slides[0]
# スライド上のShapeオブジェクト(テキストボックス)の属性情報の調査
# has_text_frame属性が「True」でTextFrameオブジェクトの包含が可能
for sp in sld0.shapes:
print(sp.shape_type, sp.name, sp.has_text_frame)
# >> TEXT_BOX (17) テキスト ボックス 1 True
# >> TEXT_BOX (17) テキスト ボックス 2 True
# >> TEXT_BOX (17) テキスト ボックス 3 True
# >> TEXT_BOX (17) テキスト ボックス 4 True
# TextFrameオブジェクトに段落(Paragraphオブジェクト)を2つ追加する
for dumy in range(2):
sld0.shapes[0].text_frame.add_paragraph()
sld0.shapes[1].text_frame.add_paragraph()
sld0.shapes[2].text_frame.add_paragraph()
sld0.shapes[3].text_frame.add_paragraph()
# 段落の字下げ調整--------------------------------------------------------------------
paras = sld0.shapes[0].text_frame.paragraphs
for i, para in enumerate(paras, 0):
para.text = "段落ごとに字下げを指定する"
para.level = i
# 水平位置調整--------------------------------------------------------------------
List_PP_ALIGN = [PP_ALIGN.LEFT, PP_ALIGN.CENTER, PP_ALIGN.RIGHT]
paras = sld0.shapes[1].text_frame.paragraphs
for i, para in enumerate(paras, 0):
para.text = "段落ごとの水平位置(左/中央/右揃え)を指定する"
para.alignment = List_PP_ALIGN[i]
# 文字列のフォントの設定----------------------------------------------------------
List_MSO_THEME_COLOR = [MSO_THEME_COLOR.ACCENT_1, MSO_THEME_COLOR.ACCENT_2, MSO_THEME_COLOR.ACCENT_6]
paras = sld0.shapes[2].text_frame.paragraphs
for i, para in enumerate(paras, 0):
para.text = "段落レベルで文字列のフォントを調整"
para.font.color.theme_color = List_MSO_THEME_COLOR[i] # フォントの色
para.font.bold = True # フォントの大きさ
# 段落間の間隔調整----------------------------------------------------------------
paras = sld0.shapes[3].text_frame.paragraphs
for para in paras:
para.text = "段落間の間隔(space_after)のPt(15)で調整"
para.space_after = Pt(15)
prs.save('Paragraph_Sample_Apply.pptx') # pptxの保存
ポイントを解説します。
最後に、段落間のスペース調整を space_afterプロパティ で指定します。
今回は、15ポイントの間隔を空けるように調整しています。
コードの実行結果は以下のようになりました。
段落レベルの「字下げ」「水平位置揃え」「フォント設定」「間隔」の各属性が反映されました。(図8)
3. 文字(Runオブジェクト)の設定
段落(Paragraphオブジェクト)内の個々の文字(単語)を管理するユニットが、Runオブジェクト になります。Runオブジェクトとして個別管理することで、文字ごとにフォントの書式を指定できるようになります。
3.1 Runオブジェクトの追加と取得
Paragraphオブジェクトに単語(Runオブジェクト)を追加するには、add_run()メソッド を使います。また、取得するには runsプロパティ を使います。
通常、テキストは複数の単語の集合体で構成されますので、Runオブジェクトは段落の中で、コレクション(Runオブジェクトを要素としたイテラブルなオブジェクト)としてまとめて管理されています。
ここまでの、各オブジェクトの親子関係と主要メソッド・プロパティについて整理すると次のようになります。(図9)
3.2 Runオブジェクトの関連プロパティ
Runオブジェクトには、次のようなプロパティが用意されており、文字単位での操作が可能です。
文字(textプロパティ)と、フォント(fontプロパティ)の設定ができる属性が提供されます。
【Runオブジェクト】 | 【機能】 | 【その他詳細】 |
---|---|---|
text | 文字を設定/取得する | |
font | 文字にフォントを設定する、 Fontオブジェクトを取得 | 【Fontオブジェクト】関連属性 bold(太字),size(文字サイズ),italic(斜体),color(文字色) |
hyperlink.address | ハイパーリンクを割り当てる | WebサイトのURLなど |
【SAMPLE ➂】
Runオブジェクトを使って、テキストを追加・編集する例をサンプルコードで確認します。
コードの概要は、段落内のテキストをRunオブジェクトで細かく設定し、文字色を指定するといったものです。<List3>
from pptx import Presentation
from pptx.dml.color import RGBColor
prs = Presentation()
#------------------------------------------------------------------------------------------------------
title_slide_layout = prs.slide_layouts[1] # "タイトルとコンテンツ"のレイアウトオブジェクトを取得
sld0 = prs.slides.add_slide(title_slide_layout) # 新しいスライドを追加(タイトルとコンテンツ)
for s in sld0.shapes: # スライド中の要素を抽出、種類を表示
print(s.name) # >> Title 1 Content Placeholder 2
sld0.shapes[0].text = 'タイトルの文字色を変更します'
pg = sld0.shapes[0].text_frame.paragraphs[0]
rn = pg.runs[0] # 段落(paragraphオブジェクト)を操作するために、runオブジェクトを取得する
rn.font.color.rgb = RGBColor(50, 185, 20) # runオブジェクトのfont.color.rgbプロパティに文字色を指定
#------------------------------------------------------------------------------------------------------
tf = sld0.shapes[0].text_frame
tf.add_paragraph() # 段落(paragraphオブジェクト)を追加する
pg = sld0.shapes[0].text_frame.paragraphs[1] # 追加した段落を取得
rn0 = pg.add_run() # runオブジェクトをコレクションに追加
rn0.text = '文字列1' # 段落に文字を設定
rn0.font.color.rgb = RGBColor(255, 0, 0) # 段落文字に色(赤)を設定
rn1 = pg.add_run()
rn1.text = '文字列2'
rn1.font.color.rgb = RGBColor(0, 255, 0) # 段落文字に色(緑)を設定
rn2 = pg.add_run()
rn2.text = '文字列3'
rn2.font.color.rgb = RGBColor(0, 0, 255) # 段落文字に色(青)を設定
prs.save('Blog_テキストに色付け_段落付け.pptx')
ポイントを解説します。
コードの実行結果は以下のようになりました。
文字(列)レベルでのフォントの書式設定が可能となりました。(図10)
3.3 フォントの書式設定について
ここでは、段落や文字のレイヤで設定できるFontオブジェクトに、関連したプロパティについてまとめます。
【Fontオブジェクト】 | 【機能】 | 【その他・詳細】 |
---|---|---|
color.rgb | 文字色の設定(RGB) | 【RGBColorクラス】 例)RGBColor(255, 255, 255) |
color.theme_color | 文字色の設定(テーマカラー) | 【MSO_THEME_COLORクラス】のオプション |
italic | 斜体文字の設定 | True(有効)/False(無効) |
bold | 太文字の設定 | True(有効)/False(無効) |
name | フォント名の設定/取得 | 例) ‘Calibri’ |
size | 文字サイズの設定/取得 | Pt(ポイント)などで指定 |
underline | 下線の設定 | True(有効)/False(無効)または、 【MSO_UNDERLINEクラス】のオプション |
一通りのフォント書式の設定ができます。上記のほか「fillプロパティ」による塗り潰し効果も提供されているようですが、適用効果がないため割愛します。
また、フォントの書式は、特に指定しなければ、上位オブジェクトから継承されます。
例えば、TextFrameオブジェクト→Paragraphオブジェクト→Runオブジェクトの順番に継承されますが、現在のレイヤでフォント設定をすることで書式を更新できます。
4. まとめ
いかがでしたでしょうか?
今回は「python-pptxライブラリ」を使って、スライド上のテキストを編集する方法について解説しました。
先にも述べた通り、図や表をメインとしたPowerPointの資料づくりにおいても、必ずこのテキスト編集作業は必要となります。本記事の内容が少しでもお役に立てば幸いです。
最後に、今回の記事内容をまとめておきましょう。
➀. Python-pptxでは、テキストをフレーム領域(TextFrameオブジェクト)や段落(Paragraphオブジェクト)という単位で管理している。
➁. 新たな文章を追加するには、Paragraphオブジェクトを取得・追加し、配下の属性でテキスト設定、体裁を整える。
➂. 文字単位での編集を行うには、さらにRunオブジェクトを追加・取得する。文字(単語)の追記やフォントの書式を設定ができる。
次回の記事は、スライドにグラフを挿入する方法について解説をしていきます。
グラフを活用して数値データを可視化することで、より説得力のある資料に仕上げることができます。
ぜひ、次回の記事も参考にして頂けましたら幸いです。リンク先はこちらになります。↓
最後までお読み頂きありがとうございました。