我可以使用python-pptx获得占位符的默认字体大小吗?

时间:2019-09-24 12:58:28

标签: python python-pptx

我正在使用python-pptx package创建一个Powerpoint演示文稿。

我知道我可以set the font size一段或一段。我的问题是我想将字体大小 relative 设置为默认大小。换句话说:我需要知道占位符的默认字体大小是多少。不幸的是,font.size returns None如果没有明确声明字体大小。

这是我期望能够做的:

from pptx import Presentation

# setup presentation
prs = Presentation()
title_slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(title_slide_layout)

# make a title
title = slide.placeholders[0]
title.text = "Hello, World!"

# here I'd like to resize the font size to 70% of default
p = title.text_frame.paragraphs[0]
default_size = p.font.size # <= Desired behaviour. Returns None in reality
font.size = default_size * 0.7

1 个答案:

答案 0 :(得分:0)

答案有些复杂,我没有适合您的食谱,但这也许会为您指明正确的方向。

通常,形状的font-size属性参与样式层次结构,类似于级联样式表(CSS)的工作方式。可以在各个级别上设置值,最接近的显式设置将获胜。这就是形状级别设置可靠的原因,因为它是“最接近”的设置。

对于占位符(例如您的示例中的标题占位符),级联为:

  1. 占位符形状本身(slide.placeholders[0]或更简单的slide.title
  2. 幻灯片布局占位符,源自
  3. 幻灯片占位符占位符来自布局占位符
  4. 在幻灯片母版标题占位符中未指定时,可能是某些全局默认值

因此要得出有效字体大小的值,您需要遍历此“继承链”,直到找到一个明确定义的值,该值即为有效值。类似于以下的伪代码:

def effective_title_placeholder_font_size():
    if title_placeholder.font-size is not None:
        return title_placeholder.font-size
    if slide-layout-title-placeholder.font-size is not None:
        return slide-layout-title-placeholder.font-size
    etc.

由于可以在整体形状上设置字体大小,或者可以在单个段落或行上覆盖字体大小,因此使该过程更加复杂。这是选择整体形状和设置字体大小以及选择文本范围和设置字体大小之间的区别。

因此,您会看到其中涉及的一些复杂性。这绝对是可行的,但是您将需要非常糟糕,这取决于您的Python和一般的软件开发技能水平。

充其量,python-pptx中仅对这些各种操作提供部分API支持(例如获取此幻灯片占位符的幻灯片布局对应物,等等),因此您可能需要深入研究XML相当多。