我想从给定的文本框中读取字体颜色。我可以提取字体名称和粗体,但不能提取颜色(或字体名称)。
下面是我的代码:
text_frame = shape.text_frame
paragraph = text_frame.paragraphs[0]
for run in paragraph.runs:
font = run.font
try:
font_size = font.size.pt
print(font_size)
font_bold = font.bold
print(font_bold)
font_name = font.name
print(font_name)
color = font.color.rgb
print(color)
except:
pass
退货:
36.0
True
None
谢谢
3条答案
按热度按时间mlnl4t2r1#
在PowerPoint中(在这方面与CSS大致相似),字体属性可以应用于被称为(至少有些人)* 样式层次结构 * 的各种级别。这些级别的最低级别覆盖了上面的任何级别,将样式直接应用于特定的运行。只有像这样的 * 直接应用 * 属性可以使用
.bold
和.color
这样的属性来检索。可能有
.effective_bold
和.effective_color
这样的属性,它们可以导航样式层次结构,以计算在渲染时将应用什么值,但目前还没有。因此
font.color.rgb
的None
值表明run * 从其样式层次结构(例如段落默认值、形状默认值、主题或表示默认值等)继承了 * 其颜色设置,但不幸的是,它没有遍历样式层次结构来确定其有效的颜色设置是什么。sczxawaw2#
我也有过同样的填充需求。区别不是很大。它的工作原理差不多。简化一下就是把“fill.fore_color”改成“font.color”。
第一件事是检查给定的颜色是否是特定的(rgb不是None)。如果是,你已经得到了它。如果不是,继续主题颜色路径,从那里得到RGB值。
现在你有一个theme_color和一个brightness。主题颜色实际上是一个数字值,定义了PowerPoint中使用的“强调”颜色。它可以由MSO_THEME_COLOR解析,通过一个私有字典“_member_to_xml”,你可以用它来定义提取它所需的xml路径:
要进行提取,您需要有适当的主题信息可用,您可以从slide_master提取主题信息,slide_master由当前幻灯片使用的布局定义。为此,需要更多的导入:
现在,您终于有了找出使用了什么PPT强调色所需的东西,返回到我们前面定义的xpath,并使用我们刚刚找到的主题对其进行转换:
如果没有亮度(亮度为零),则hex_color不仅定义了所使用的重音,还定义了真正的RGB颜色。这可以使用任何方法从十六进制颜色值中提取。例如imagecolor:
但是如果亮度(我们在开始查找主题颜色时发现的)不为零,我们还有更多的工作要做。然后,真实颜色比强调颜色更暗或更亮,由亮度值定义。达到真实的RGB所需的额外步骤需要调整亮度。以类似于PowerPoint中的方式使颜色更亮需要转换为HSL。然后更改亮度,然后转换回RGB:
我在上面展示了制作一种颜色所需的步骤。每张幻灯片只需要找到一次幻灯片母版主题,实际上在PPT演示文稿中每个母版只需要一次。因此,真正的代码最好按照适合您需要的顺序进行拆分。
vvppvyoh3#
更改PowerPoint幻灯片中的颜色后,您可以访问python-pptx中的字体颜色属性。您可以在PowerPoint中更改为预设颜色:* “标准色”* 和python-pptx:
run.font.color.theme_color
。或者,您可以在PowerPoint中选择自定义颜色:如果您使用滴管或单击“更多颜色”*,并在python-pptx中:run.font.color.rgb
。如果您没有在PowerPoint中设置颜色属性,python-pptx将返回“None”。