Python-PPTX:读取字体颜色

fafcakar  于 2023-03-16  发布在  Python
关注(0)|答案(3)|浏览(592)

我想从给定的文本框中读取字体颜色。我可以提取字体名称和粗体,但不能提取颜色(或字体名称)。
下面是我的代码:

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

谢谢

mlnl4t2r

mlnl4t2r1#

在PowerPoint中(在这方面与CSS大致相似),字体属性可以应用于被称为(至少有些人)* 样式层次结构 * 的各种级别。这些级别的最低级别覆盖了上面的任何级别,将样式直接应用于特定的运行。只有像这样的 * 直接应用 * 属性可以使用.bold.color这样的属性来检索。
可能有.effective_bold.effective_color这样的属性,它们可以导航样式层次结构,以计算在渲染时将应用什么值,但目前还没有。
因此font.color.rgbNone值表明run * 从其样式层次结构(例如段落默认值、形状默认值、主题或表示默认值等)继承了 * 其颜色设置,但不幸的是,它没有遍历样式层次结构来确定其有效的颜色设置是什么。

sczxawaw

sczxawaw2#

我也有过同样的填充需求。区别不是很大。它的工作原理差不多。简化一下就是把“fill.fore_color”改成“font.color”。
第一件事是检查给定的颜色是否是特定的(rgb不是None)。如果是,你已经得到了它。如果不是,继续主题颜色路径,从那里得到RGB值。

srgb = font.color.rgb
if srgb == None:
    theme_color = font.color.theme_color
    brightness = font.color.brightness

现在你有一个theme_color和一个brightness。主题颜色实际上是一个数字值,定义了PowerPoint中使用的“强调”颜色。它可以由MSO_THEME_COLOR解析,通过一个私有字典“_member_to_xml”,你可以用它来定义提取它所需的xml路径:

from pptx.enum.dml import MSO_THEME_COLOR
accent = MSO_THEME_COLOR._member_to_xml[theme_color]
xpath = 'a:themeElements/a:clrScheme/a:{}/a:srgbClr/@val'.format(accent)

要进行提取,您需要有适当的主题信息可用,您可以从slide_master提取主题信息,slide_master由当前幻灯片使用的布局定义。为此,需要更多的导入:

from pptx.opc.constants import RELATIONSHIP_TYPE as RT
from pptx.oxml import parse_xml
slide_master_part = slide.slide_layout.slide_master.part
theme_part = slide_master_part.part_related_by(RT.THEME)
theme = parse_xml(theme_part.blob)  # theme here is an <a:theme> element

现在,您终于有了找出使用了什么PPT强调色所需的东西,返回到我们前面定义的xpath,并使用我们刚刚找到的主题对其进行转换:

hex_color = theme.xpath(xpath)[0]

如果没有亮度(亮度为零),则hex_color不仅定义了所使用的重音,还定义了真正的RGB颜色。这可以使用任何方法从十六进制颜色值中提取。例如imagecolor:

from PIL import ImageColor
import numpy as np
srgb = np.array(ImageColor.getcolor('#{}'.format(hex_color), 'RGB'))

但是如果亮度(我们在开始查找主题颜色时发现的)不为零,我们还有更多的工作要做。然后,真实颜色比强调颜色更暗或更亮,由亮度值定义。达到真实的RGB所需的额外步骤需要调整亮度。以类似于PowerPoint中的方式使颜色更亮需要转换为HSL。然后更改亮度,然后转换回RGB:

import colorsys
srgb = srgb / 255
h, luminance, s = colorsys.rgb_to_hls(*srgb)
lum_mod = 100000 * (1 - brightness)
lum_off = 100000 * brightness
luminance = luminance * (lum_mod / 100000) + (lum_off / 100000)
srgb = np.array(colorsys.hls_to_rgb(h, luminance, s))
srgb = (srgb * 255).round(0).astype(int)

我在上面展示了制作一种颜色所需的步骤。每张幻灯片只需要找到一次幻灯片母版主题,实际上在PPT演示文稿中每个母版只需要一次。因此,真正的代码最好按照适合您需要的顺序进行拆分。

vvppvyoh

vvppvyoh3#

更改PowerPoint幻灯片中的颜色后,您可以访问python-pptx中的字体颜色属性。您可以在PowerPoint中更改为预设颜色:* “标准色”* 和python-pptx:run.font.color.theme_color。或者,您可以在PowerPoint中选择自定义颜色:如果您使用滴管或单击“更多颜色”*,并在python-pptx中:run.font.color.rgb。如果您没有在PowerPoint中设置颜色属性,python-pptx将返回“None”。

相关问题