C# VSTO 我怎样才能return Word文档中的交叉引用

C# VSTO How can can I return the cross references from the Word document

我开发了一种工具,可以迭代 Word 文档以根据文档中的样式提取文本,并将该文本插入到 XML 模板中。

我需要能够检查段落中是否存在对图形的交叉引用,并提取图形引用,或者以某种方式识别它,以便我可以在 XML 文件。

经过大量搜索,我找不到任何可以执行此操作的信息。很多关于插入引用的信息,但不是从文档中检索它们。

我试过下面的代码,它传入 Word 文档的每个段落以查看它是否包含任何字段,但不确定从这里到哪里去。有什么想法吗?

private void checkParaForCrossReferences(word.Paragraph eachPara)
{
     var fields = eachPara.Range.Fields;

     foreach (var field in fields)
     {
          //some code to get the cross reference information (figure or table number, caption or ID or something)

     }
}

Word 使用 REF 字段作为交叉引用,因此要获取段落的 cross-references,代码应如下所示

Word.Range rng = null;

foreach (para In doc.Paragraphs)
{
    rng = para.Range;
    foreach (fld In rng.Fields)
    {
        if (fld.Type = Word.WdFieldType.wdFieldRef)
        {
            Debug.Print("Code: " + fld.Code.Text + "; Result: " + fld.Result.Text);
        }
    }
}

这里棘手的部分是 REF 字段实际引用的内容。当 cross-reference 插入除 Bookmark 之外的任何内容时,Word 会自动为文档中的该范围分配一个书签。书签名称以下划线 _ 开头,后跟 Ref 和一个数字。默认情况下,它们隐藏在页面和“书签”对话框中。典型的 REF 字段代码:REF _Ref1571107

因此无法仅从域代码来确定这是哪种 cross-reference。根据在将 cross-reference 插入图形时选择的选项,它 可能 可以从 Result 中获取它。例如,如果 cross-reference 显示整个标题或 "only label and number",那么它将包含字符串 Figure,这完全是 straight-forward。

如果这两种情况都不是,并且选择了其他三个选项之一,则可以从域代码中提取书签名称并在文档文本中查找书签并从该范围中获取信息 -具体如何取决于个别文件以及如何引用数字。

目前我没有 C# 环境 运行,但是 VB-code 从 REF 字段中查找书签名称的基本方法:

sBkmName = Mid(fld.code, InStr(fld.code, "_Ref"), 11) 'a bookmark name is 11 characters long
Debug.Print ActiveDocument.Bookmarks(sBkmName).Range.Text