亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python-pptx:讀取字體顏色

python-pptx:讀取字體顏色

郎朗坤 2021-11-09 10:35:50
我想從給定的文本框中讀取字體顏色。我可以提取字體名稱和粗體,但不能提取顏色(或字體名稱)。這是我的代碼:text_frame = shape.text_frameparagraph = 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.0TrueNone謝謝
查看完整描述

2 回答

?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

在 PowerPoint(在這方面與 CSS 大致相似)中,字體屬性可以應用于(至少某些人稱之為)樣式層次結構中的各種級別。這些的底層覆蓋了上面的任何級別,將樣式直接應用于特定的運行。僅直接施加這樣的屬性可以使用類似的屬性來檢索.bold.color。

可能是屬性,如.effective_bold.effective_color其導航樣式層次算得了什么價值將在渲染時被應用,但目前還沒有(還)。

因此,該Nonefont.color.rgb表示 run從其樣式層次結構(例如,段落默認值、形狀默認值、主題或演示默認值等)繼承其顏色設置,但不幸的是,它不會遍歷樣式層次結構以確定其有效顏色設置是什么。


查看完整回答
反對 回復 2021-11-09
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

我對填充也有同樣的需求。差別不是那么大。它以類似的方式工作。簡化只是將“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 和一個亮度。主題顏色實際上是一個數值,用于定義 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 中提取主題信息來獲得這些信息。為此需要更多導入:


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 顏色。這是使用您想要的任何方法從十六進制顏色值中提取的。例如圖像顏色:


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 演示文稿中每個母版只需要一次。因此,真正的代碼最好拆分為適合您需求的順序。


查看完整回答
反對 回復 2021-11-09
  • 2 回答
  • 0 關注
  • 1395 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號