Arbeiten mit Kommentaren

Aspose.Words ermöglicht Benutzern das Arbeiten mit Kommentaren – Kommentare in einem Dokument in Aspose.Words werden durch die Comment-Klasse dargestellt. Verwenden Sie außerdem die CommentRangeStart- und CommentRangeEnd-Klassen, um den Textbereich anzugeben, der einem Kommentar zugeordnet werden soll.

Einen Kommentar hinzufügen

Mit Aspose.Words können Sie Kommentare auf verschiedene Arten hinzufügen:

  1. Verwendung der Comment-Klasse
  2. Verwendung der CommentRangeStart- und CommentRangeEnd-Klassen

Das folgende Codebeispiel zeigt, wie Sie mithilfe der Comment-Klasse einen Kommentar zu einem Absatz hinzufügen:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithComments();
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.Write("Some text is added.");
Comment comment = new Comment(doc, "Awais Hafeez", "AH", DateTime.Today);
builder.CurrentParagraph.AppendChild(comment);
comment.Paragraphs.Add(new Paragraph(doc));
comment.FirstParagraph.Runs.Add(new Run(doc, "Comment text."));
dataDir = dataDir + "Comments_out.doc";
// Save the document.
doc.Save(dataDir);

Das folgende Codebeispiel zeigt, wie Sie mithilfe eines Textbereichs und der CommentRangeStart- und CommentRangeEnd-Klassen einen Kommentar zu einem Absatz hinzufügen:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithComments();
Document doc = new Document();
Paragraph para1 = new Paragraph(doc);
Run run1 = new Run(doc, "Some ");
Run run2 = new Run(doc, "text ");
para1.AppendChild(run1);
para1.AppendChild(run2);
doc.FirstSection.Body.AppendChild(para1);
Paragraph para2 = new Paragraph(doc);
Run run3 = new Run(doc, "is ");
Run run4 = new Run(doc, "added ");
para2.AppendChild(run3);
para2.AppendChild(run4);
doc.FirstSection.Body.AppendChild(para2);
Comment comment = new Comment(doc, "Awais Hafeez", "AH", DateTime.Today);
comment.Paragraphs.Add(new Paragraph(doc));
comment.FirstParagraph.Runs.Add(new Run(doc, "Comment text."));
CommentRangeStart commentRangeStart = new CommentRangeStart(doc, comment.Id);
CommentRangeEnd commentRangeEnd = new CommentRangeEnd(doc, comment.Id);
run1.ParentNode.InsertAfter(commentRangeStart, run1);
run3.ParentNode.InsertAfter(commentRangeEnd, run3);
commentRangeEnd.ParentNode.InsertAfter(comment, commentRangeEnd);
dataDir = dataDir + "Anchor.Comment_out.doc";
// Save the document.
doc.Save(dataDir);

Kommentare extrahieren oder entfernen

Die Verwendung von Kommentaren in einem Word-Dokument (zusätzlich zum Verfolgen von Änderungen) ist eine gängige Vorgehensweise bei der Überprüfung von Dokumenten, insbesondere wenn es mehrere Prüfer gibt. Es kann Situationen geben, in denen das Einzige, was Sie von einem Dokument benötigen, die Kommentare sind. Angenommen, Sie möchten eine Liste mit Überprüfungsergebnissen erstellen oder Sie haben alle nützlichen Informationen aus dem Dokument gesammelt und möchten einfach unnötige Kommentare entfernen. Möglicherweise möchten Sie die Kommentare eines bestimmten Rezensenten anzeigen oder entfernen.

In diesem Beispiel werden wir uns einige einfache Methoden zum Sammeln von Informationen aus den Kommentaren in einem Dokument und zum Entfernen von Kommentaren aus einem Dokument ansehen. Im Einzelnen behandeln wir Folgendes:

  • Extrahieren Sie alle Kommentare aus einem Dokument oder nur die von einem bestimmten Autor
  • Entfernen Sie alle Kommentare aus einem Dokument oder nur von einem bestimmten Autor

So extrahieren oder entfernen Sie Kommentare

Der Code in diesem Beispiel ist eigentlich recht einfach und alle Methoden basieren auf dem gleichen Ansatz. Ein Kommentar in einem Word-Dokument wird durch ein Comment-Objekt im Aspose.Words-Dokumentobjektmodell dargestellt. Um alle Kommentare in einem Dokument zu sammeln, verwenden Sie die GetChildNodes-Methode, wobei der erste Parameter auf NodeType.Comment eingestellt ist. Stellen Sie sicher, dass der zweite Parameter der GetChildNodes-Methode auf true eingestellt ist: Dadurch wird GetChildNodes gezwungen, rekursiv aus allen untergeordneten Knoten auszuwählen, anstatt nur die unmittelbar untergeordneten Knoten zu sammeln.

Um zu veranschaulichen, wie Kommentare aus einem Dokument extrahiert und entfernt werden, führen wir die folgenden Schritte durch:

  1. Öffnen Sie ein Word-Dokument mit der Document-Klasse
  2. Holen Sie sich alle Kommentare aus dem Dokument in eine Sammlung
  3. So extrahieren Sie Kommentare:
    1. Gehen Sie die Sammlung mit dem foreach-Operator durch
    2. Extrahieren und listen Sie den Namen des Autors, Datum und Uhrzeit sowie den Text aller Kommentare auf
    3. Extrahieren und listen Sie den Namen des Autors, Datum und Uhrzeit sowie den Text der Kommentare auf, die von einem bestimmten Autor verfasst wurden, in diesem Fall dem Autor “ks”
  4. So entfernen Sie Kommentare:
    1. Gehen Sie mit dem for-Operator rückwärts durch die Sammlung
    2. Kommentare entfernen
  5. Speichern Sie die Änderungen

So extrahieren Sie alle Kommentare

Die GetChildNodes-Methode ist sehr nützlich und Sie können sie jedes Mal verwenden, wenn Sie eine Liste von Dokumentknoten jeglicher Art benötigen. Die resultierende Sammlung verursacht keinen unmittelbaren Mehraufwand, da die Knoten nur dann in dieser Sammlung ausgewählt werden, wenn Sie Elemente darin aufzählen oder darauf zugreifen.

Das folgende Codebeispiel zeigt, wie der Name des Autors, Datum und Uhrzeit sowie der Text aller Kommentare im Dokument extrahiert werden:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
static ArrayList ExtractComments(Document doc)
{
ArrayList collectedComments = new ArrayList();
// Collect all comments in the document
NodeCollection comments = doc.GetChildNodes(NodeType.Comment, true);
// Look through all comments and gather information about them.
foreach (Comment comment in comments)
{
collectedComments.Add(comment.Author + " " + comment.DateTime + " " + comment.ToString(SaveFormat.Text));
}
return collectedComments;
}

So extrahieren Sie Kommentare eines bestimmten Autors

Nachdem Sie Comment-Knoten in einer Sammlung ausgewählt haben, müssen Sie nur noch die benötigten Informationen extrahieren. In diesem Beispiel werden die Initialen des Autors, Datum, Uhrzeit und der Klartext des Kommentars in einer Zeichenfolge zusammengefasst. Sie könnten es stattdessen auch auf andere Weise speichern.

Die überladene Methode, die die Kommentare eines bestimmten Autors extrahiert, ist fast identisch. Sie überprüft lediglich den Namen des Autors, bevor die Informationen zum Array hinzugefügt werden.

Das folgende Codebeispiel zeigt, wie der Name des Autors, Datum und Uhrzeit sowie der Text der Kommentare des angegebenen Autors extrahiert werden:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
static ArrayList ExtractComments(Document doc, string authorName)
{
ArrayList collectedComments = new ArrayList();
// Collect all comments in the document
NodeCollection comments = doc.GetChildNodes(NodeType.Comment, true);
// Look through all comments and gather information about those written by the authorName author.
foreach (Comment comment in comments)
{
if (comment.Author == authorName)
collectedComments.Add(comment.Author + " " + comment.DateTime + " " + comment.ToString(SaveFormat.Text));
}
return collectedComments;
}

So entfernen Sie Kommentare

Wenn Sie alle Kommentare entfernen, ist es nicht nötig, durch die Sammlung zu blättern und die Kommentare einzeln zu löschen. Sie können sie entfernen, indem Sie die Clear-Methode für die Kommentarsammlung aufrufen.

Das folgende Codebeispiel zeigt, wie alle Kommentare im Dokument entfernt werden:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
static void RemoveComments(Document doc)
{
// Collect all comments in the document
NodeCollection comments = doc.GetChildNodes(NodeType.Comment, true);
// Remove all comments.
comments.Clear();
}

Wenn Sie Kommentare selektiv entfernen müssen, ähnelt der Vorgang eher dem Code, den wir zum Extrahieren von Kommentaren verwendet haben.

Das folgende Codebeispiel zeigt, wie Kommentare des angegebenen Autors entfernt werden:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
static void RemoveComments(Document doc, string authorName)
{
// Collect all comments in the document
NodeCollection comments = doc.GetChildNodes(NodeType.Comment, true);
// Look through all comments and remove those written by the authorName author.
for (int i = comments.Count - 1; i >= 0; i--)
{
Comment comment = (Comment)comments[i];
if (comment.Author == authorName)
comment.Remove();
}
}

Der wichtigste hier hervorzuhebende Punkt ist die Verwendung des for-Operators. Im Gegensatz zur einfachen Extraktion möchten Sie hier einen Kommentar löschen. Ein geeigneter Trick besteht darin, die Sammlung vom letzten Kommentar zum ersten rückwärts zu iterieren. Der Grund dafür: Wenn Sie am Ende beginnen und rückwärts gehen, bleibt der Index der vorhergehenden Elemente unverändert und Sie können sich zum ersten Element in der Sammlung zurückarbeiten.

Das folgende Codebeispiel zeigt die Methoden zum Extrahieren und Entfernen von Kommentaren:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithComments();
string fileName = "TestFile.doc";
// Open the document.
Document doc = new Document(dataDir + fileName);
// Extract the information about the comments of all the authors.
foreach (string comment in ExtractComments(doc))
Console.Write(comment);
// Remove comments by the "pm" author.
RemoveComments(doc, "pm");
Console.WriteLine("Comments from \"pm\" are removed!");
// Extract the information about the comments of the "ks" author.
foreach (string comment in ExtractComments(doc, "ks"))
Console.Write(comment);
//Read the comment's reply and resolve them.
CommentResolvedandReplies(doc);
// Remove all comments.
RemoveComments(doc);
Console.WriteLine("All comments are removed!");
dataDir = dataDir + RunExamples.GetOutputFilePath(fileName);
// Save the document.
doc.Save(dataDir);

So entfernen Sie einen Kommentar zwischen CommentRangeStart und CommentRangeEnd

Mit Aspose.Words können Sie auch Kommentare zwischen den CommentRangeStart- und CommentRangeEnd-Knoten entfernen.

Das folgende Codebeispiel zeigt, wie Text zwischen CommentRangeStart und CommentRangeEnd entfernt wird:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithComments();
string fileName = "TestFile.doc";
// Open the document.
Document doc = new Document(dataDir + fileName);
CommentRangeStart commentStart = (CommentRangeStart)doc.GetChild(NodeType.CommentRangeStart, 0, true);
CommentRangeEnd commentEnd = (CommentRangeEnd)doc.GetChild(NodeType.CommentRangeEnd, 0, true);
Node currentNode = commentStart;
Boolean isRemoving = true;
while (currentNode != null && isRemoving)
{
if (currentNode.NodeType == NodeType.CommentRangeEnd)
isRemoving = false;
Node nextNode = currentNode.NextPreOrder(doc);
currentNode.Remove();
currentNode = nextNode;
}
dataDir = dataDir + "RemoveRegionText_out.doc";
// Save the document.
doc.Save(dataDir);

Kommentarantwort hinzufügen oder entfernen

Die AddReply-Methode fügt eine Antwort auf diesen Kommentar hinzu. Bitte beachten Sie, dass aufgrund der bestehenden Microsoft Office-Einschränkungen nur eine Antwortebene im Dokument zulässig ist. Eine Ausnahme vom Typ InvalidOperationException wird ausgelöst, wenn diese Methode für den vorhandenen Antwortkommentar aufgerufen wird.

Mit der RemoveReply-Methode können Sie die angegebene Antwort auf diesen Kommentar entfernen.

Das folgende Codebeispiel zeigt, wie man einem Kommentar eine Antwort hinzufügt und die Antwort des Kommentars entfernt:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document(dataDir + "TestFile.doc");
Comment comment = (Comment)doc.GetChild(NodeType.Comment, 0, true);
//Remove the reply
comment.RemoveReply(comment.Replies[0]);
//Add a reply to comment
comment.AddReply("John Doe", "JD", new DateTime(2017, 9, 25, 12, 15, 0), "New reply");
dataDir = dataDir + "TestFile_Out.doc";
// Save the document to disk.
doc.Save(dataDir);

Lesen Sie die Antwort des Kommentars

Die Replies-Eigenschaft gibt eine Sammlung der Comment-Objekte zurück, die unmittelbar untergeordnete Elemente des angegebenen Kommentars sind.

Das folgende Codebeispiel zeigt, wie Sie die Antworten eines Kommentars durchlaufen und diese auflösen:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
static void CommentResolvedandReplies(Document doc)
{
NodeCollection comments = doc.GetChildNodes(NodeType.Comment, true);
Comment parentComment = (Comment)comments[0];
foreach (Comment childComment in parentComment.Replies)
{
// Get comment parent and status.
Console.WriteLine(childComment.Ancestor.Id);
Console.WriteLine(childComment.Done);
// And update comment Done mark.
childComment.Done = true;
}
}