如何根据字体获取文本范围

How to get text ranges based on fonts

我有一段应用了多种字体。因此有许多范围。有没有办法(不直接使用 OOXML)获取这些范围、它们的字体和文本?这是我正在谈论的 OOXML 片段示例:

      <w:p w:rsidR="00301FAD" w:rsidRDefault="00301FAD">
        <w:r w:rsidRPr="001D4040">
          <w:rPr>
            <w:b/>
            <w:bCs/>
          </w:rPr>
          <w:t>Spam</w:t>
        </w:r>
        <w:r>
          <w:t xml:space="preserve"/>
        </w:r>
        <w:r w:rsidRPr="001D4040">
          <w:rPr>
            <w:b/>
            <w:bCs/>
            <w:i/>
            <w:iCs/>
          </w:rPr>
          <w:t>and</w:t>
        </w:r>
        <w:r>
          <w:t xml:space="preserve"/>
        </w:r>
        <w:r w:rsidRPr="001D4040">
          <w:rPr>
            <w:i/>
            <w:iCs/>
          </w:rPr>
          <w:t>eggs</w:t>
        </w:r>
      </w:p>

Word 中的段落文本如下所示:

Spam and eggs

您可以使用段落 class' 拆分方法,该方法可以根据字符串将段落拆分为多个范围。我使用这个函数来打印所提供示例的字体和文本:

async function run() {
  await Word.run(async (context) => {
    const body = context.document.body;

    var par = body.paragraphs.getFirst();
    let words = par.split([" "]);
    let first_word = words.getFirst();
    first_word.load(["font", "text"]);
    await context.sync();

    console.log(f_word.font);
    console.log(f_word.text);
  });
}

这样做的一个缺点是您无法区分具有如下字体的单词:Spam,或像这样: Spam 因为它会将粗体 属性 设置为 null 两次。