2016-11-26 6 views
2

У меня есть индекс символа и вы хотите получить Range страницы, содержащей этот индекс. Чтобы проиллюстрировать этот конкретный случай использования, я выполняю правила проверки предложения (используйте обработку естественного языка), и я хочу запустить их на всей странице, над которой работает пользователь. Итак:VSTO Word: Retrieve range страницы

public static class ExtensionForDocument 
{ 
    public static Range GetPage(this Document document, int characterIndex) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Пример вызова:

public void OnInspect(IRibbonControl control) 
    { 
     var selection = Application.Selection; 
     var selectionRange = Application.ActiveDocument.GetPage(selection.Range.Start); 
     // Process range here. 
    } 

Я пробовал:

public static Range GetPage(this Document document, int characterIndex) 
    { 
     var sectionCount = document.Sections.Count; 

     for (var sectionIndex = 1; sectionIndex <= sectionCount; sectionIndex++) 
     { 
      var section = document.Sections[sectionIndex]; 
      var sectionRange = section.Range; 
      if (characterIndex >= sectionRange.Start && characterIndex <= sectionRange.End) 
      { 
       return sectionRange; 
      } 
     } 

     return null; 
    } 

Разделы не работают. Таким образом, получение диапазонов фактических страниц:

public static Range GetPage(this Document document, int characterIndex) 
{ 
    var numberOfPages = (int)document.Content.Information[WdInformation.wdNumberOfPagesInDocument]; 

    for (var p = 1; p <= numberOfPages; p++) 
    { 
     object what = WdGoToItem.wdGoToPage; 
     object which = WdGoToDirection.wdGoToAbsolute; 
     object count = p; 
     var range = document.GoTo(ref what, ref which, ref count); 
     if (characterIndex >= range.Start && characterIndex <= range.End) return range; 
    } 

    return document.Range(); 
} 

Но на этих диапазонах в начале и в конце указывается номер страницы, а не индекс символа. Я также пробовал то же самое с закладками, видя, что я читал, что должны быть закладки «\ page», но нет никаких закладок. Каков правильный подход?

Примечание: Word 2016, Office Tools в VS2015 под .NET4.6.1

+1

Прежде всего: должен ли анализ быть основан на странице? Это не просто для диапазона текущей страницы, Word работает намного лучше на параграфах и разделах. Поэтому, если работа над секцией или рядом абзацев работает тоже, чем вы могли бы предпочесть такой подход. Только получение диапазона текущей страницы довольно просто, используя закладку «\ page». У вас, похоже, проблемы с этой закладкой, но вы не указали соответствующий исходный код, поэтому мы не можем знать, в чем была проблема. Обратите внимание, что встроенная закладка «\ page» скрыта, но тем не менее существует. –

ответ

0

Ваш GetPage() очень близка к решению. Функция GoTo() возвращает первый индекс символа страницы в обоих диапазонах. Начало и диапазон.Еnd, он не возвращает номер страницы. Чтобы получить начало и конец страницы, вам нужно дважды запустить GoTo.

Не самый лучший код. Извините, я использую некоторые условные обозначения Java-кода на C#.

public Word.Range getPageByCharacterIndex(int characterIndex) { 
      var numberOfPages = (int)doc.Content.Information[Word.WdInformation.wdNumberOfPagesInDocument]; 
      int lastCharInDoc = doc.Range(0).End; 

      Word.Range rangeStart = null; ; 
      Word.Range rangeEnd = null; 
      for (var p = 1; p <= numberOfPages; p++) { 
       object what = Word.WdGoToItem.wdGoToPage; 
       object which = Word.WdGoToDirection.wdGoToAbsolute; 
       object count = p; 
       rangeStart = doc.GoTo(ref what, ref which, ref count); 
       object countPlusOne = p + 1; 
       rangeEnd = doc.GoTo(ref what, ref which, ref countPlusOne); 
       if (rangeStart.Start <= characterIndex && characterIndex <= rangeEnd.End) { 
        Word.Range result = doc.Range(rangeStart.Start, rangeEnd.End); 
        return result; 
       } 
      } 
      // ¿is characterIndex in last page? 
      if (rangeEnd !=null & rangeEnd.Start <= characterIndex && characterIndex <= lastCharInDoc) { 
       Word.Range result = doc.Range(rangeEnd.Start, lastCharInDoc); 
       return result; 
      } 

      return null; 
     }