Получение ссылочного текста из объекта поля взаимодействия Word

Я использую Word Interop для создания плагина Word. В этом плагине у меня есть случай, когда я хочу проверить все объекты поля в документе, и когда это поле является перекрестной ссылкой на другое место в том же документе, мне нужно иметь возможность захватить текст в абзаце, в котором находится поле. ссылаясь на.

Мне удалось получить имя объекта поля, но в документе не было определенных закладок, хотя в Word я мог щелкнуть поле, чтобы перейти в другое место.

Пример поля пример поля

Пример поля в виде кода пример поля в виде кода

текст ссылки, который мне нужно получить текст ссылки, который мне нужно получить

Объекты Bookmark не определены Объекты закладок не определены

Я попытался имитировать пользователя, щелкающего по полю, вызвав для него DoClick(), а затем я получил доступ к V_V_Scalar_Document_Generic.Application.Selection.Range.Text, но это ничего не дало. Я также попробовал подход GoTo ниже, но все еще не достиг ссылочного текста.

 System.Collections.Generic.List<string> L_V_List_String_Fields = new System.Collections.Generic.List<string>();
    foreach (Field L_V_Scalar_Field_Item in V_V_Scalar_Document_Generic.Range.Fields)
    {
        try
        {
            if (L_V_Scalar_Field_Item.Type == WdFieldType.wdFieldRef)
                // L_V_Scalar_Field_Item.Data --> gives COM exception
                // L_V_Scalar_Field_Item.Code.ID --> blanks
                // L_V_Scalar_Field_Item.DoClick() 'will not help because fields are not always hyperlinks
                // L_V_Scalar_Field_Item.Result.Text --> gives the text of the field itself

                // all variations I tried for the target parameter in the line below (last param) are not working
                // V_V_Scalar_Document_Generic.[GoTo](Microsoft.Office.Interop.Word.WdGoToItem.wdGoToField, System.Type.Missing, System.Type.Missing, "_Ref28680085")
                // Dim L_V_Scalar_String_Source as string = V_V_Scalar_Document_Generic.Application.Selection.Range.Text

                L_V_List_String_Fields.Add($"CodeText:{L_V_Scalar_Field_Item.Code.Text} |FieldType:{L_V_Scalar_Field_Item.Type} |FieldKind:{L_V_Scalar_Field_Item.Kind} |SourceText:{"source text ??"}");
        }
        catch (Exception L_V_Scalar_Exception_Generic)
        {
        }
    }


person Michael Bahig    schedule 02.01.2020    source источник


Ответы (1)


Закладки не отображаются в списке, поскольку в Word есть соглашение, согласно которому закладки с именами, начинающимися со знака подчеркивания ("_"), являются "скрытыми". В диалоговом окне Вставка->Ссылки->Закладка их можно увидеть, если установить флажок «Скрытые закладки», но в поле «Найти и заменить» нужно ввести имя вручную.

Даже когда закладки скрыты, вы можете ссылаться на них. Так, например, вы должны сделать что-то вроде этого (это синтаксис VBA):

Dim TargetText As String
TargetText = ActiveDocument.Bookmarks("_Ref28680085").Range.Text

чтобы текст был «покрыт» закладкой. Теоретически вы можете использовать Goto, используя wdGotoBookmark вместо wdGotoField, за исключением того, что я думаю, что у него будет возможность работать только с объектом Selection, а не с объектом Range.

В зависимости от того, какой тип перекрестной ссылки вставляет пользователь, Word «покрывает» разные части материала, на который делается ссылка. Таким образом, вам может потребоваться построить диапазон, который вам действительно нужен, например. используя Range.Start закладки, чтобы сказать вам, на какой абзац указывает ссылка.

person Community    schedule 02.01.2020