2016-10-31 15 views
1

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

я увидел, что для того, чтобы получить все сноски, я могу сделать что-то вроде этого:

FootnotesPart footnotesPart = doc.MainDocumentPart.FootnotesPart; 
if (footnotesPart != null) 
{ 
    IEnumerable<Footnote> footnotes = footnotesPart.Footnotes.Elements<Footnote>(); 

    foreach (var footnote in footnotes) 
    { 
     ... 
    } 
} 

Однако, я не знаю, как знать, где каждая сноска принадлежит в этом пункте.
Я хочу, например, взять сноску и поместить ее в скобки внутри текста, где раньше была сноска.
Как это сделать?

ответ

2

Вы должны найти элемент FootnoteReference с тем же идентификатором, что и FootNote. Это даст вам элемент Run, где расположена сноска.

Пример кода:

FootnotesPart footnotesPart = doc.MainDocumentPart.FootnotesPart; 
if (footnotesPart != null) 
{ 
    var footnotes = footnotesPart.Footnotes.Elements<Footnote>(); 
    var references = doc.MainDocumentPart.Document.Body.Descendants<FootnoteReference>().ToArray(); 
    foreach (var footnote in footnotes) 
    { 
     long id = footnote.Id; 
     var reference = references.Where(fr => (long)fr.Id == id).FirstOrDefault(); 
     if (reference != null) 
     { 
      Run run = reference.Parent as Run; 
      reference.Remove(); 
      var fnText = string.Join("", footnote.Descendants<Run>().SelectMany(r => r.Elements<Text>()).Select(t => t.Text)).Trim(); 
      run.Parent.InsertAfter(new Run(new Text("(" + fnText + ")")), run); 
     } 
    } 
} 
doc.MainDocumentPart.Document.Save(); 
doc.Close();