Office OpenXML 解析(二):字体 - theyangfan - 博客园

合集 - Office OpenXML(3)

1.Office OpenXML 解析(一):Word 中的样式01-28

2.Office OpenXML 解析(二):字体01-29

3.Office OpenXML 解析(三):页眉和页脚02-06

收起

在 OpenXML 文档中,字符的字体由 RunFonts 元素指定,如下所示:

  <w:r w:rsidRPr="001B7601"> // Run
    <w:rPr>
      <w:rFonts w:hint="eastAsia" w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:eastAsia="微软雅黑" w:cs="Times New Roman" /> //RunFonts
    </w:rPr>
    <w:t>中文</w:t>
  </w:r>

在一个 RunFonts 元素中,最多可以存在4种字体槽,每种字体槽可以指定一种特有的字体:

  • ASCII
  • High ANSI
  • Complex Script
  • East Asian

1. 属性

RunFonts 元素的详细属性如下:

属性

描述

ascii(ASCII Font)

指定 Unicode编码为U+0000–U+007F 范围内的字符应该使用的字体。如果同时指定了 asciiTheme 属性,那么该属性被忽略。如果未指定该属性,那么应该按照上述样式层级关系来确定它的值;如果在样式层级中均未指定,则应该使用支持该字符的默认字体。

asciiTheme (ASCII Theme Font)

指定 Unicode编码为U+0000–U+007F 范围内的字符应该使用的主题字体。该字体引用自文档主题部件的预定义 theme fonts。

cs (Complex Script Font)

指定被划分到 Complex Script 字体槽中应该使用的字体。如果同时指定了 cstheme 属性,那么该属性被忽略。如果未指定该属性,那么应该按照上述样式层级关系来确定它的值;如果在样式层级中均未指定,则应该使用支持 complex script 内容的默认字体。

cstheme (Complex Script Theme Font)

指定被划分到 Complex Script 字体槽中应该使用的主题字体。

eastAsia (East Asian Font)

指定 Unicode编码为 East Asian范围内的字符应该使用的字体。如果同时指定了 eastAsiaTheme 属性,那么该属性被忽略。如果未指定该属性,那么应该按照上述样式层级关系来确定它的值;如果在样式层级中均未指定,则应该使用支持 East Asian 内容的默认字体。

eastAsiaTheme(East Asian Theme Font)

指定 Unicode编码为 East Asian范围内的字符应该使用的主题字体。

hAnsi (High ANSI Font)

指定 Unicode编码为 High ANSI 范围内(不属于上述三类范围)的字符应该使用的字体。如果同时指定了 hAnsiTheme 属性,那么该属性被忽略。如果未指定该属性,那么应该按照上述样式层级关系来确定它的值;如果在样式层级中均未指定,则应该使用支持 High ANSI 内容的默认字体。

hAnsiTheme (High ANSI Theme Font)

指定 Unicode编码为 High ANSI 范围内(不属于上述三类范围)的字符应该使用的主题字体。

hint (Font Content Type)

指定有歧义的字符应该使用的字体类别。有些字符没有显式地存储在文档中,可以映射为上面提到的四个类别中的多个类别。这个属性就是用于解决这种冲突。
例:

在上面两个 Run 元素中,虽然其中的省略号"…" 具有相同的 Unicode 编码(U+2026),但是由于 hint 属性的存在,它们使用的是不同的字体。

2. 两步算法(Two-step Algorithm)

第1步:查表

通过下表基于 Unicode 编码确定字符的类别:

Unicode Block

范围

类别

基本拉丁文 (Basic Latin):控制字符,标点符号,数字字母

0000-007F

ASCII 字体

拉丁文补充-1 (Latin 1 Supplement)

00A0-00FF

High ANSI 字体,存在以下例外:
* 如果 hint 属性的值是 eastAsia,那么下列编码的字符使用 East Asian (或eastAsiaTheme)字体:
A1, A4, A7 – A8, AA, AD, AF, B0 – B4, B6 – BA, BC – BF, D7, F7
* 如果 hint 属性的值是 eastAsia 并且 lang(Languages)元素的eastAsia 属性值为“zh”时,下列编码的字符使用 East Asian (或eastAsiaTheme)字体:
E0 – E1, E8 – EA, EC – ED, F2 –F3, F9 – FA, FC
例如,存在下面这样一个 Run 元素:

那么,根据上述规则,第1,3个字符的字体为 “微软雅黑”,第2个字符的字体为 "Times New Roman"。

拉丁文扩展-A (Latin Extended-A)

0100-017F

High ANSI 字体,存在以下例外:如果 hint 属性的值是 eastAsia 并且 lang(Languages)元素的eastAsia 属性值为“zh”,或者 East Asian 字体的字符集为 Big5 或 GB2312 时,使用 East Asian (或eastAsiaTheme)字体。

拉丁文扩展-B (Latin Extended-B)

0180-024F

同上。

国际音标扩展 (IPA Extensions)

0250-02AF

同上。

空白修饰字母 (Spacing Modifiers)

02B0-02FF

如果 hint 属性的值是 eastAsia ,那么使用 East Asian 字体,否则使用 High ANSI 字体。

结合用读音符号 (Combining Diacritics Marks)

0300-036F

同上。

希腊文 (Greek )

0370-03CF

同上。

西里尔字母 (Cyrillic)

0400-04FF

同上。

希伯来文 (Hebrew)

0590-05FF

ASCII 字体

阿拉伯文 (Arabic)

0600-06FF

同上。

叙利亚文 (Syriac)

0700-074F

同上。

阿拉伯文补充 (Arabic Supplement)

0750-077F

同上。

马尔代夫语 (Thaana)

0780-07BF

同上。

朝鲜文 (Hangul Jamo)

1100-11FF

East Asian 字体

常用标点 (General Punctuation)

2000-206F

如果 hint 属性的值是 eastAsia ,那么使用 East Asian 字体,否则使用 High ANSI 字体。

CJK 部首补充 (CJK Radicals Supplement)

2E80-2EFF

East Asian 字体

CJK 符号和标点 (CJK Symbols and Punctuation)

3000-303F

同上。

字母表达形式 (Alphabetic Presentation Form)

FB00-FB4F

FB00-FB1C:如果 hint 属性的值是 eastAsia ,那么使用 East Asian 字体,否则使用 High ANSI 字体。FB1D-FB4F:使用 ASCII 字符。

第2步

经过第1步查表之后:

如果字符被划分到了 East Asian 类别中并且 hint 属性的值是 eastAsia,那么该字符就应该使用 East Asian 字体;

否则,如果 Run 元素中存在 <w:cs/> 或者 <w:rtl/> 元素,那么字符就应该使用 Complex Script 字体,不管它的 Unicode 编码在哪个区域;

否则,使用上表中的规则。

上述的流程可以用下图来表示:

例1:下面这个 Run 元素中同时存在阿拉伯字符和英文字符,

<w:r>
    <w:rPr>
      <w:rFonts w:ascii="Courier New" w:cs="Times New Roman" />
    </w:rPr>
    <w:t>English العربية </w:t>
</w:r>

在这个 Run 元素中,指定了 ASCII 和 Complex Script 两种字体槽,根据前面的“两步”算法,我们可以得知这两种文字都会映射到 ASCII 槽中,也就是都会应用 Courier New 字体。

例2:

<w:r>
    <w:rPr>
      <w:rFonts w:ascii="Courier New" w:cs="Times New Roman" />
      <w:rtl/> // RightToLeftText
    </w:rPr>
    <w:t>English العربية </w:t>
</w:r>

在这个 Run 元素中, 同样根据下面的“两步”算法可以得知,这两种文字都会映射到 Complex Script 槽中,也就是 Times New Roman 字体。

例3:

<w:r>
    <w:rPr>
      <w:rFonts w:hint="eastAsia" />
      <w:bCs/>
      <w:rtl/>
    </w:rPr>
    <w:t>English 中文</w:t>
</w:r>

在这个例子中,“中文” 字符处于 East Asian 类别,同时 hint 属性的值为 eastAsia,所以,这两个字符应用 East Asian 字体,同时,<w:bCs/> 元素不会使其加粗。

对于“English” 字符,由于它不处于 East Asian 类别,同时又存在 <w:rtl/> 元素,那么,它应用的是 Complex Script 字体,同时,<w:bCs/> 元素会使其加粗。

所以,最终显示的时候,“English”字符会加粗,而“中文”字符不会加粗。

3. 参考

[1] ECMA-376-1:2016,Office Open XML File Formats — Fundamentals and Markup Language Reference,§17.3.2.26 Run Fonts


原网址: 访问
创建于: 2023-06-02 13:00:20
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论