python-pptx:读取字体颜色

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


这是我的代码:


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

谢谢


郎朗坤
浏览 1075回答 2
2回答

喵喔喔

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

哈士奇WWW

我对填充也有同样的需求。差别不是那么大。它以类似的方式工作。简化只是将“fill.fore_color”更改为“font.color”。首先是检查给定的颜色是否特定(rgb 不是 None)。如果是你已经得到了。如果没有,请追求主题颜色路径以从那里获取 RGB 值。srgb = font.color.rgbif srgb == None:&nbsp; &nbsp; theme_color = font.color.theme_color&nbsp; &nbsp; brightness = font.color.brightness现在你拥有的是一个 theme_color 和一个亮度。主题颜色实际上是一个数值,用于定义 PowerPoint 中使用的“强调”颜色。它可以通过 MSO_THEME_COLOR 解析,通过私有字典“_member_to_xml”,您可以使用它来定义提取它所需的 xml 路径:from pptx.enum.dml import MSO_THEME_COLORaccent = MSO_THEME_COLOR._member_to_xml[theme_color]xpath = 'a:themeElements/a:clrScheme/a:{}/a:srgbClr/@val'.format(accent)要进行提取,您需要有适当的可用主题信息,您可以通过从您所在的当前幻灯片使用的布局定义的 slide_master 中提取主题信息来获得这些信息。为此需要更多导入:from pptx.opc.constants import RELATIONSHIP_TYPE as RTfrom pptx.oxml import parse_xmlslide_master_part = slide.slide_layout.slide_master.parttheme_part = slide_master_part.part_related_by(RT.THEME)theme = parse_xml(theme_part.blob)&nbsp; # theme here is an <a:theme> element现在终于,你有什么需要找出使用什么 PPT 强调色,回到我们之前定义的 xpath,并使用我们刚刚找到的主题翻译它:hex_color = theme.xpath(xpath)[0]如果没有亮度(亮度为零),您的 hex_color 不仅定义了使用的口音,还定义了真正的 RGB 颜色。这是使用您想要的任何方法从十六进制颜色值中提取的。例如图像颜色:from PIL import ImageColorimport numpy as npsrgb = np.array(ImageColor.getcolor('#{}'.format(hex_color), 'RGB'))但是,如果亮度(我们在开始时找到主题颜色时发现的)不为零,我们还有更多工作要做。然后,真实颜色比由亮度值定义的强调色更暗或更亮。获得真实 RGB 所需的额外步骤需要调整该亮度。以与 PowerPoint 中类似的方式使颜色更亮需要转换为 HSL。然后改变亮度,然后转换回RGB:import colorsyssrgb = srgb / 255h, luminance, s = colorsys.rgb_to_hls(*srgb)lum_mod = 100000 * (1 - brightness)lum_off = 100000 * brightnessluminance = 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 演示文稿中每个母版只需要一次。因此,真正的代码最好拆分为适合您需求的顺序。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python