字体颜色

颜色,作为一个主题,延伸到 Font 对象;字体颜色只是它出现的第一个地方。因此,它比通常更深入地思考,因为我们希望重用相同的对象和协议,以便在其他上下文中指定颜色;设计一个能够承受预期重用的通用解决方案是有意义的。

对于这个API,有三个历史来源可以借鉴。

  1. 这个 w:rPr/w:color 元素。在将颜色直接应用于文本或设置样式的文本颜色时,默认情况下使用此选项。这对应于 Font.Color 属性(不幸的是,没有文件证明)。此元素支持RGB颜色、主题颜色和主题颜色的着色或着色。

  2. 这个 w:rPr/w14:textFill 元素。这是Word用来表示像渐变和阴影效果这样的花哨文本。这对应于 Font.Fill 属性。

  3. PowerPoint字体颜色界面。这似乎是前两者之间的一个合理的折衷方案,允许直接ish访问常见的颜色选项,同时为 Font.fill 如果需要,稍后将添加操作。

候选方案

docx.text.run.Run 具有字体属性:

>>> from docx import Document
>>> from docx.text.run import Font, Run
>>> run = Document().add_paragraph().add_run()
>>> isinstance(run, Run)
True
>>> font = run.font
>>> isinstance(font, Font)
True

docx.text.run.Font 具有只读颜色属性,返回 docx.dml.color.ColorFormat 对象:

>>> from docx.dml.color import ColorFormat
>>> color = font.color
>>> isinstance(font.color, ColorFormat)
True
>>> font.color = 'anything'
AttributeError: can't set attribute

docx.dml.color.ColorFormat 有只读的 type 属性和读/写 rgbtheme_colorbrightness 性质。

ColorFormat.type 返回其中一个 MSO_COLOR_TYPE.RGBMSO_COLOR_TYPE.THEMEMSO_COLOR_TYPE.AUTONone ,后者表示字体没有直接应用颜色:

>>> font.color.type
None

ColorFormat.rgb 返回一个 RGBColor 对象当 typeMSO_COLOR_TYPE.RGB . 在以下情况下,它也可能报告RGBColor值: typeMSO_COLOR_TYPE.THEME ,因为在这种情况下也可能存在RGB颜色。根据规范,指定主题颜色时会忽略RGB颜色值,但Word在指定主题颜色时会将主题颜色的当前RGB值与主题颜色名称(例如“accent1”)一起写入;这可能是文件浏览器使用的方便值。价值 .type 必须咨询以确定RGB值是有效的还是“最佳猜测”:

>>> font.color.type
RGB (1)
>>> font.color.rgb
RGBColor(0x3f, 0x2c, 0x36)

分配 RGBColor 价值到 ColorFormat.rgb 原因 ColorFormat.type 成为 MSO_COLOR_TYPE.RGB ::

>>> font.color.type
None
>>> font.color.rgb = RGBColor(0x3f, 0x2c, 0x36)
>>> font.color.type
RGB (1)
>>> font.color.rgb
RGBColor(0x3f, 0x2c, 0x36)

ColorFormat.theme_color 返回的成员 MSO_THEME_COLOR_INDEX 什么时候? typeMSO_COLOR_TYPE.THEME ::

>>> font.color.type
THEME (2)
>>> font.color.theme_color
ACCENT_1 (5)

分配的成员 MSO_THEME_COLOR_INDEXColorFormat.theme_color 原因 ColorFormat.type 成为 MSO_COLOR_TYPE.THEME ::

>>> font.color.type
RGB (1)
>>> font.color.theme_color = MSO_THEME_COLOR.ACCENT_2
>>> font.color.type
THEME (2)
>>> font.color.theme_color
ACCENT_2 (6)

这个 ColorFormat.brightness 属性可用于选择主题颜色的淡色或阴影。将值指定为0.1将使颜色亮10%(淡色);指定-0.1将生成颜色深10%(着色)::

>>> font.color.type
None
>>> font.color.brightness
0.0
>>> font.color.brightness = 0.4
ValueError: not a theme color

>>> font.color.theme_color = MSO_THEME_COLOR.TEXT_1
>>> font.color.brightness = 0.4
>>> font.color.brightness
0.4

XML样本

没有字体颜色的基线段落:

<w:p>
  <w:r>
    <w:t>Text with no color.</w:t>
  </w:r>
</w:p>

直接应用RGB颜色的段落:

<w:p>
  <w:pPr>
    <w:rPr>
      <w:color w:val="0000FF"/>
    </w:rPr>
  </w:pPr>
  <w:r>
    <w:rPr>
      <w:color w:val="0000FF"/>
    </w:rPr>
    <w:t>Directly-applied color Blue.</w:t>
  </w:r>
</w:p>

直接应用主题颜色运行:

<w:r>
  <w:rPr>
    <w:color w:val="4F81BD" w:themeColor="accent1"/>
  </w:rPr>
  <w:t>Theme color Accent 1.</w:t>
</w:r>

以40%的文本色调运行2主题颜色:

<w:r>
  <w:rPr>
    <w:color w:val="548DD4" w:themeColor="text2" w:themeTint="99"/>
  </w:rPr>
  <w:t>Theme color with 40% tint.</w:t>
</w:r>

带有25%着色的强调文字颜色2主题颜色:

<w:r>
  <w:rPr>
    <w:color w:val="943634" w:themeColor="accent2" w:themeShade="BF"/>
  </w:rPr>
  <w:t>Theme color with 25% shade.</w:t>
</w:r>

架构摘要

<xsd:complexType name="CT_RPr">  <!-- denormalized -->
  <xsd:sequence>
    <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="rStyle"          type="CT_String"/>
      <xsd:element name="rFonts"          type="CT_Fonts"/>
      <xsd:element name="b"               type="CT_OnOff"/>
      <xsd:element name="bCs"             type="CT_OnOff"/>
      <xsd:element name="i"               type="CT_OnOff"/>
      <xsd:element name="iCs"             type="CT_OnOff"/>
      <xsd:element name="caps"            type="CT_OnOff"/>
      <xsd:element name="smallCaps"       type="CT_OnOff"/>
      <xsd:element name="strike"          type="CT_OnOff"/>
      <xsd:element name="dstrike"         type="CT_OnOff"/>
      <xsd:element name="outline"         type="CT_OnOff"/>
      <xsd:element name="shadow"          type="CT_OnOff"/>
      <xsd:element name="emboss"          type="CT_OnOff"/>
      <xsd:element name="imprint"         type="CT_OnOff"/>
      <xsd:element name="noProof"         type="CT_OnOff"/>
      <xsd:element name="snapToGrid"      type="CT_OnOff"/>
      <xsd:element name="vanish"          type="CT_OnOff"/>
      <xsd:element name="webHidden"       type="CT_OnOff"/>
      <xsd:element name="color"           type="CT_Color"/>
      <xsd:element name="spacing"         type="CT_SignedTwipsMeasure"/>
      <xsd:element name="w"               type="CT_TextScale"/>
      <xsd:element name="kern"            type="CT_HpsMeasure"/>
      <xsd:element name="position"        type="CT_SignedHpsMeasure"/>
      <xsd:element name="sz"              type="CT_HpsMeasure"/>
      <xsd:element name="szCs"            type="CT_HpsMeasure"/>
      <xsd:element name="highlight"       type="CT_Highlight"/>
      <xsd:element name="u"               type="CT_Underline"/>
      <xsd:element name="effect"          type="CT_TextEffect"/>
      <xsd:element name="bdr"             type="CT_Border"/>
      <xsd:element name="shd"             type="CT_Shd"/>
      <xsd:element name="fitText"         type="CT_FitText"/>
      <xsd:element name="vertAlign"       type="CT_VerticalAlignRun"/>
      <xsd:element name="rtl"             type="CT_OnOff"/>
      <xsd:element name="cs"              type="CT_OnOff"/>
      <xsd:element name="em"              type="CT_Em"/>
      <xsd:element name="lang"            type="CT_Language"/>
      <xsd:element name="eastAsianLayout" type="CT_EastAsianLayout"/>
      <xsd:element name="specVanish"      type="CT_OnOff"/>
      <xsd:element name="oMath"           type="CT_OnOff"/>
    </xsd:choice>
    <xsd:element name="rPrChange" type="CT_RPrChange" minOccurs="0"/>
  </xsd:sequence>
</xsd:group>

<xsd:complexType name="CT_Color">
  <xsd:attribute name="val"        type="ST_HexColor" use="required"/>
  <xsd:attribute name="themeColor" type="ST_ThemeColor"/>
  <xsd:attribute name="themeTint"  type="ST_UcharHexNumber"/>
  <xsd:attribute name="themeShade" type="ST_UcharHexNumber"/>
</xsd:complexType>

<!-- simple types -->

<xsd:simpleType name="ST_HexColor">
  <xsd:union memberTypes="ST_HexColorAuto s:ST_HexColorRGB"/>
</xsd:simpleType>

<xsd:simpleType name="ST_HexColorAuto">
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="auto"/>
  </xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="ST_HexColorRGB">
  <xsd:restriction base="xsd:hexBinary">
    <xsd:length value="3" fixed="true"/>
  </xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="ST_ThemeColor">
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="dark1"/>
    <xsd:enumeration value="light1"/>
    <xsd:enumeration value="dark2"/>
    <xsd:enumeration value="light2"/>
    <xsd:enumeration value="accent1"/>
    <xsd:enumeration value="accent2"/>
    <xsd:enumeration value="accent3"/>
    <xsd:enumeration value="accent4"/>
    <xsd:enumeration value="accent5"/>
    <xsd:enumeration value="accent6"/>
    <xsd:enumeration value="hyperlink"/>
    <xsd:enumeration value="followedHyperlink"/>
    <xsd:enumeration value="none"/>
    <xsd:enumeration value="background1"/>
    <xsd:enumeration value="text1"/>
    <xsd:enumeration value="background2"/>
    <xsd:enumeration value="text2"/>
  </xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="ST_UcharHexNumber">
  <xsd:restriction base="xsd:hexBinary">
    <xsd:length value="1"/>
  </xsd:restriction>
</xsd:simpleType>