C # VSTO Как я могу вернуть перекрестные ссылки из документа Word - PullRequest
0 голосов
/ 20 февраля 2019

Я разработал инструмент, который перебирает документ 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)

     }
}

1 Ответ

0 голосов
/ 20 февраля 2019

Word использует REF поля для перекрестных ссылок, поэтому, чтобы получить перекрестные ссылки для абзаца, код должен выглядеть примерно так

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поле на самом деле относится.Когда перекрестная ссылка вставляется во что-либо, кроме Bookmark Word, автоматически назначается закладка для этого диапазона в документе.Названия закладок начинаются с символа подчеркивания _, за которым следует Ref и число.По умолчанию они скрыты на странице и в диалоговом окне «Закладки».Типичный код поля REF: REF _Ref1571107

Таким образом, нет никакого способа, кроме только кода поля, определить, какая это перекрестная ссылка.В зависимости от того, какой параметр был выбран при вставке перекрестной ссылки на рисунок, может получить ее из Result.Например, если перекрестная ссылка отображает весь заголовок или «только метку и номер», то она будет содержать строку Figure, которая является довольно простой.

Если ни один из этих случаев не подходит, и был выбран один из трех других вариантов, можно извлечь имя закладки из кода поля, найти закладку в тексте документа и извлечь информацию из этого диапазона- как именно это будет зависеть от отдельного документа и от того, как ссылались на цифры.

В данный момент у меня не запущена среда C #, но есть базовый VB-код для поиска имени закладки изREF поле:

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