文本

自动形状和表格单元格可以包含文本。其他形状不能。文本总是以相同的方式操作,不管它的容器是什么。

文本存在于三个层次:

形状中的所有文本都包含在其文本框架中。文本框具有垂直对齐、边距、换行和自动适应行为、旋转角度和一些可能的 3D 视觉功能,可以设置为将文本格式化为多个列。它还包含段落序列,它总是包含至少一个段落,即使是空的。

段落有行间距、前后空格、可用的 bullet 格式、制表符、大纲/缩进级别和水平对齐方式。段落可以为空,但如果它包含任何文本,则该文本将包含在一次或多次 run 中。

run 的存在是为了提供字符级格式,包括字体、大小和颜色、可选的超链接目标 URL、粗体、斜体和下划线样式、删除线、字距,以及一些大写样式,如所有大写。

让我们一个一个地看一遍。仅显示当前版本中可用的特性。

访问文本框

如前所述,并不是所有形状都有文本框架。所以,如果你不确定,你不想捕获可能的异常,你会想要在尝试访问它之前检查:

for shape in slide.shapes:
    if not shape.has_text_frame:
        continue
    text_frame = shape.text_frame
    # do things with the text frame
    ...

访问段落

文本框架总是至少包含一个段落。这就导致了将多个段落整理成一个形状的过程比人们希望的要笨拙一些。举个例子,你想要一个有三个段落的形状:

paragraph_strs = [
    'Egg, bacon, sausage and spam.',
    'Spam, bacon, sausage and spam.',
    'Spam, egg, spam, spam, bacon and spam.'
]

text_frame = shape.text_frame
text_frame.clear()  # remove any existing paragraphs, leaving one empty one

p = text_frame.paragraphs[0]
p.text = paragraph_strs[0]

for para_str in paragraph_strs[1:]:
    p = text_frame.add_paragraph()
    p.text = para_str

添加文本

只有 run 才能真正包含文本。将字符串赋值给形状、文本框架或段落的 .text 属性是将文本放置在由这些对象包含的 run 中的一种快捷方法。下面两个代码片段产生了相同的结果:

shape.text = 'foobar'

# is equivalent to ...

text_frame = shape.text_frame
text_frame.clear()
p = text_frame.paragraphs[0]
run = p.add_run()
run.text = 'foobar'

应用文本框架级格式

下面生成的形状只有一个段落,底部距比顶部距稍宽(默认值为 0.05”),没有左边距,顶部文本对齐,并关闭了换行功能。此外,设置自动大小行为来调整形状的宽度和高度以适应其文本。请注意,文本框上设置了垂直对齐。在每个段落设置水平对齐:

from pptx.util import Inches
from pptx.enum.text import MSO_ANCHOR, MSO_AUTO_SIZE

text_frame = shape.text_frame
text_frame.text = 'Spam, eggs, and spam'
text_frame.margin_bottom = Inches(0.08)
text_frame.margin_left = 0
text_frame.vertical_anchor = MSO_ANCHOR.TOP
text_frame.word_wrap = False
text_frame.auto_size = MSO_AUTO_SIZE.SHAPE_TO_FIT_TEXT

TextFrame.auto_sizeTextFrame.vertical_anchor 的可能值分别由枚举 MSO_AUTO_SIZEMSO_VERTICAL_ANCHOR 指定。

应用段落级格式

下面的形状包含三个左对齐的段落,第二个和第三个缩进(像 sub-bullets)在第一个下面:

from pptx.enum.text import PP_ALIGN

paragraph_strs = [
    'Egg, bacon, sausage and spam.',
    'Spam, bacon, sausage and spam.',
    'Spam, egg, spam, spam, bacon and spam.'
]

text_frame = shape.text_frame
text_frame.clear()

p = text_frame.paragraphs[0]
p.text = paragraph_strs[0]
p.alignment = PP_ALIGN.LEFT

for para_str in paragraph_strs[1:]:
    p = text_frame.add_paragraph()
    p.text = para_str
    p.alignment = PP_ALIGN.LEFT
    p.level = 1

应用字符级格式

字符级格式化在 run 级应用,使用 .font 属性。下面用 18pt Calibri 粗体格式化一个句子,并应用主题颜色 Accent 1。

from pptx.dml.color import RGBColor
from pptx.enum.dml import MSO_THEME_COLOR
from pptx.util import Pt

text_frame = shape.text_frame
text_frame.clear()  # not necessary for newly-created shape

p = text_frame.paragraphs[0]
run = p.add_run()
run.text = 'Spam, eggs, and spam'

font = run.font
font.name = 'Calibri'
font.size = Pt(18)
font.bold = True
font.italic = None  # cause value to be inherited from theme
font.color.theme_color = MSO_THEME_COLOR.ACCENT_1

如果您愿意,可以将字体颜色设置为绝对 RGB 值。注意,当主题改变时,这不会改变颜色:

font.color.rgb = RGBColor(0xFF, 0x7F, 0x50)

通过提供目标 URL,run 也可以变成超链接:

run.hyperlink.address = 'https://github.com/scanny/python-pptx'