如何 "refresh"(在 c# 中)包含 table 内容的 word 文档以获得正确的字段页面?

How to "refresh" (in c#) a word document with table of contents in order to get correct page for a Field?

我的要求是使用 ms office interop (c#) 从 Word 文档中检索范围的页码和位置。特别是,我正在寻找一个字段的页面,同时遍历文档的字段。

我发现我的问题出在文档中(开始时)"generated" 内容,例如 table 的内容、table 的列表、table 的数字。

因此,对我来说,第二页上的字段被报告为第一页上的字段。如果我删除目录并替换为空格,则在正确的页面上会报告相同的范围。

这是代码的相关部分...

foreach (Field field in wordDocument.Fields)
{
    field.Code.get_Information(WdInformation.wdActiveEndAdjustedPageNumber) 
}

...而且,如果没有 TOC 或其他生成的元素,同样可以正常工作。

另外,显然有效的是我尝试找到表示某些文本的范围的页面。

        if (range.Find.Execute(FindText: "xyz", MatchCase: false, Format: false, MatchWildcards: true, Forward: true))
        {
            Console.WriteLine("xyz page number is " + range.get_Information(WdInformation.wdActiveEndAdjustedPageNumber));
        }

但我真的很想利用可用的字段列表,而不是在文档中搜索文本。 我尝试了一些方法,例如遍历 table 并更新它们 re-paginating,使应用程序可见。在我尝试基本上刷新文档并使目录采用其 "space" 以便正确报告页码的尝试中,似乎没有任何效果。

有人知道我错过了什么吗?

谢谢, 克里斯

p.s。我怀疑它是否重要,但基本上我正在尝试构建 "list of figures (or tables)",当没有一个时,用于书签目的。所以,我正在寻找某些作为标题的字段,我需要页面和位置。

目前看来,为此类字段获取可靠页码的解决方案是遍历文档段落,而不是文档字段(即即使我到达相同的字段)。

无论如何,我最终得到了这样的结果:

foreach (Paragraph parag in wordDocument.Paragraphs)
{
    foreach (Field field in parag.Range.Fields)
    {
        // e.g. SEQ Equation \* ARABIC § MyEquation
        if (field.Code.Text.StartsWith("SEQ "))
        {
              pageNo = parag.Range.get_Information(WdInformation.wdActiveEndAdjustedPageNumber);
              ...
        }
    }
}