Trotz automatischer Dokumenterstellung auf dem Server, kann es immer wieder aus verschiedensten Beweggründen notwendig sein, dass manuelle Zwischenschritte erfolgen. Genau dies war in einem Projekt der Fall. Ein wesentlicher Bestandteil dieser Zwischenschritte war die manuelle Überarbeitung der automatisch generierten Dokumente.
Die Dokumente wurden aber nicht nur überarbeitet, sie wurden kommentiert. Diese so kommentierten Dokumente wurden wieder in den Prozess überführt, was prompt zum Ergebnis hatte, dass die weitere Erstellung die interessantesten Effekte produzierte. Darauf hin wurde überprüft, ob noch Kommentare in Dokumenten vorlagen, um zu vermeiden diese erneut dem Prozess hinzuzufügen.
Kommentare sind quasi zusammengesetzte Elemente und werden durch Start- und End-Tags repräsentiert. Das Start-Tag ist w:commentRangeStart das End-Tag wird repräsentiert durch w:commentRangeEnd. Zusätzlich gibt es das Element w:commentReference. Dieses verweist auf den eigentlichen Inhalt des Kommentars im CommentsPart – der Datei comments.xml – anhand des gemeinsamen Attributes id.
Das Besondere ist, dass nicht alle Elemente zusammen vorkommen müssen. Existiert ein Start- ohne End-Tag, wird die Position des Start-Tags als Anker genutzt. Existieren Start- und End-Tag wird die gesamte Range als kommentiert angesehen. Existieren weder Start- noch End-Tag aber ein Referenz-Element, wird dieses, wie das einzelne Start-Tag, als Anker verwendet. Gibt es aber einzig keine Referenz, wird der Kommentar ignoriert.
Wie können jetzt aber Kommentare im Dokument aufgespürt werden? Das immer vorhandene Merkmal ist das Start-Tag. So wird die Suche nach Kommentaren an der Existenz eines Start-Tags ausgerichtet. Beinhaltet ein Dokument das Start-Tag, ist die Bedingung hinreichend erfüllt, dass das Dokumente kommentiert ist.
Kommentare können aber nicht nur im MainDocumentPart vorkommen. In folgenden Parts können Kommentare eingefügt werden:
- MainDocumentPart
- Header
- Footer
- FootNotes
- EndNotes
Eine Prüfung über alle relevanten Parts könnte also wie folgt aussehen:
public bool IsCommented(string file)
{
using (WordprocessingDocument package = WordprocessingDocument.Open(file, false))
{
MainDocumentPart mainDocumentPart = package.MainDocumentPart;
return ContainsComment(mainDocumentPart)
|| ContainsComment(mainDocumentPart.FootnotesPart)
|| ContainsComment(mainDocumentPart.EndnotesPart)
|| ContainsComment((IEnumerable<OpenXmlPart>) mainDocumentPart.HeaderParts)
|| ContainsComment((IEnumerable<OpenXmlPart>) mainDocumentPart.FooterParts);
}
}
private bool ContainsComment(OpenXmlPart openXmlPart)
{
return openXmlPart.RootElement.Descendants().Any(x => x is CommentRangeStart);
}
private bool ContainsComment(IEnumerable<OpenXmlPart> openXmlParts)
{
foreach (var part in openXmlParts)
{
if(part.RootElement.Descendants().Any(x => x is CommentRangeStart))
{
return true;
}
}
return false;
}
0 Kommentare:
Kommentar veröffentlichen