Arbeiten mit Kommentaren
Online ausprobieren
Sie können diese Funktionalität mit unserem ausprobieren Anmerkungen kostenlos online entfernen.
Aspose.Words ermöglicht Benutzern das Arbeiten mit Kommentaren – Kommentare in einem Dokument in Aspose.Words werden durch die Klasse Comment dargestellt. Verwenden Sie auch die Klassen CommentRangeStart und CommentRangeEnd, um den Textbereich anzugeben, der einem Kommentar zugeordnet werden soll.
Kommentar hinzufügen
Aspose.Words ermöglicht das Hinzufügen von Kommentaren auf verschiedene Arten:
- Verwenden der Comment -Klasse
- Verwenden der Klassen CommentRangeStart und CommentRangeEnd
Das folgende Codebeispiel zeigt, wie Sie einem Absatz mithilfe der Klasse Comment einen Kommentar hinzufügen:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
// The path to the documents directory. | |
System::String outputDataDir = GetOutputDataDir_WorkingWithComments(); | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
builder->Write(u"Some text is added."); | |
System::SharedPtr<Comment> comment = System::MakeObject<Comment>(doc, u"Awais Hafeez", u"AH", System::DateTime::get_Today()); | |
builder->get_CurrentParagraph()->AppendChild(comment); | |
comment->get_Paragraphs()->Add(System::MakeObject<Paragraph>(doc)); | |
comment->get_FirstParagraph()->get_Runs()->Add(System::MakeObject<Run>(doc, u"Comment text.")); | |
System::String outputPath = outputDataDir + u"AddComments.doc"; | |
// Save the document. | |
doc->Save(outputPath); |
Das folgende Codebeispiel zeigt, wie Sie einem Absatz mithilfe eines Textregions und der Klassen CommentRangeStart und CommentRangeEnd einen Kommentar hinzufügen:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
// The path to the documents directory. | |
System::String outputDataDir = GetOutputDataDir_WorkingWithComments(); | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<Paragraph> para1 = System::MakeObject<Paragraph>(doc); | |
System::SharedPtr<Run> run1 = System::MakeObject<Run>(doc, u"Some "); | |
System::SharedPtr<Run> run2 = System::MakeObject<Run>(doc, u"text "); | |
para1->AppendChild(run1); | |
para1->AppendChild(run2); | |
doc->get_FirstSection()->get_Body()->AppendChild(para1); | |
System::SharedPtr<Paragraph> para2 = System::MakeObject<Paragraph>(doc); | |
System::SharedPtr<Run> run3 = System::MakeObject<Run>(doc, u"is "); | |
System::SharedPtr<Run> run4 = System::MakeObject<Run>(doc, u"added "); | |
para2->AppendChild(run3); | |
para2->AppendChild(run4); | |
doc->get_FirstSection()->get_Body()->AppendChild(para2); | |
System::SharedPtr<Comment> comment = System::MakeObject<Comment>(doc, u"Awais Hafeez", u"AH", System::DateTime::get_Today()); | |
comment->get_Paragraphs()->Add(System::MakeObject<Paragraph>(doc)); | |
comment->get_FirstParagraph()->get_Runs()->Add(System::MakeObject<Run>(doc, u"Comment text.")); | |
System::SharedPtr<CommentRangeStart> commentRangeStart = System::MakeObject<CommentRangeStart>(doc, comment->get_Id()); | |
System::SharedPtr<CommentRangeEnd> commentRangeEnd = System::MakeObject<CommentRangeEnd>(doc, comment->get_Id()); | |
run1->get_ParentNode()->InsertAfter(commentRangeStart, run1); | |
run3->get_ParentNode()->InsertAfter(commentRangeEnd, run3); | |
commentRangeEnd->get_ParentNode()->InsertAfter(comment, commentRangeEnd); | |
System::String outputPath = outputDataDir + u"AnchorComment.doc"; | |
// Save the document. | |
doc->Save(outputPath); |
Kommentare extrahieren oder entfernen
Die Verwendung von Kommentaren in einem Word-Dokument (zusätzlich zum Nachverfolgen von Änderungen) ist eine gängige Praxis bei der Überprüfung von Dokumenten, insbesondere wenn mehrere Prüfer vorhanden sind. Es kann Situationen geben, in denen das einzige, was Sie von einem Dokument benötigen, die Kommentare sind. Angenommen, Sie möchten eine Liste der Überprüfungsergebnisse 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 Bewerters anzeigen oder entfernen.
In diesem Beispiel werden wir uns einige einfache Methoden ansehen, um sowohl Informationen aus den Kommentaren in einem Dokument zu sammeln als auch Kommentare aus einem Dokument zu entfernen. Insbesondere werden wir behandeln, wie es geht:
- Extrahieren Sie alle Kommentare aus einem Dokument oder nur die Kommentare eines bestimmten Autors.
- 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 demselben 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 Methode GetChildNodes, wobei der erste Parameter auf NodeType.Comment gesetzt ist. Stellen Sie sicher, dass der zweite Parameter der GetChildNodes -Methode auf true gesetzt ist: Dies zwingt GetChildNodes, rekursiv aus allen untergeordneten Knoten auszuwählen, anstatt nur die unmittelbaren untergeordneten Knoten zu sammeln.
Um zu veranschaulichen, wie Kommentare aus einem Dokument extrahiert und entfernt werden, werden die folgenden Schritte ausgeführt:
- Öffnen Sie ein Word-Dokument mit der Klasse Document
- Holen Sie sich alle Kommentare aus dem Dokument in eine Sammlung
- So extrahieren Sie Kommentare:
- Gehen Sie die Sammlung mit dem Operator foreach durch
- Extrahieren und listen Sie den Namen des Autors, Datum und Uhrzeit sowie den Text aller Kommentare auf
- Extrahieren und listen Sie den Namen des Autors, Datum und Uhrzeit sowie den Text der Kommentare eines bestimmten Autors, in diesem Fall des Autors ‘ks’, auf
- So entfernen Sie Kommentare:
- Gehen Sie mit dem für den Operator rückwärts durch die Sammlung
- Kommentare entfernen
- 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 eines beliebigen Typs benötigen. Die resultierende Auflistung erzeugt keinen unmittelbaren Overhead, da die Knoten nur dann in dieser Auflistung ausgewählt werden, wenn Sie darin enthaltene Elemente auflisten oder darauf zugreifen.
Das folgende Codebeispiel zeigt, wie Sie den Namen des Autors, Datum und Uhrzeit sowie den Text aller Kommentare im Dokument extrahieren:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
std::vector<System::String> ExtractComments(const System::SharedPtr<Document>& doc) | |
{ | |
std::vector<System::String> collectedComments; | |
// Collect all comments in the document | |
System::SharedPtr<NodeCollection> comments = doc->GetChildNodes(NodeType::Comment, true); | |
// Look through all comments and gather information about them. | |
for (System::SharedPtr<Comment> comment : System::IterateOver<System::SharedPtr<Comment>>(comments)) | |
{ | |
collectedComments.push_back(comment->get_Author() + u" " + comment->get_DateTime() + u" " + System::StaticCast<Node>(comment)->ToString(SaveFormat::Text)); | |
} | |
return collectedComments; | |
} |
So extrahieren Sie Kommentare eines bestimmten Autors
Nachdem Sie Kommentarknoten 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 zu einer Zeichenfolge zusammengefasst. Sie können es stattdessen auch auf andere Weise speichern.
Die überladene Methode, die die Kommentare eines bestimmten Autors extrahiert, ist fast dieselbe. Sie überprüft lediglich den Namen des Autors, bevor die Informationen zum Array hinzugefügt werden.
Das folgende Codebeispiel zeigt, wie Sie den Autorennamen, Datum und Uhrzeit sowie den Text der Kommentare des angegebenen Autors extrahieren:
So entfernen Sie Kommentare
Wenn Sie alle Kommentare entfernen, müssen Sie nicht nacheinander durch die Sammlung blättern und Kommentare löschen. Sie können sie entfernen, indem Sie NodeCollection.Clear
in der Kommentarsammlung aufrufen.
Das folgende Codebeispiel zeigt, wie Sie alle Kommentare im Dokument entfernen:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
void RemoveComments(const System::SharedPtr<Document>& doc) | |
{ | |
// Collect all comments in the document | |
System::SharedPtr<NodeCollection> comments = doc->GetChildNodes(NodeType::Comment, true); | |
// Remove all comments. | |
comments->Clear(); | |
} |
Wenn Sie Kommentare selektiv entfernen müssen, ähnelt der Prozess dem Code, den wir für die Kommentarextraktion verwendet haben.
Das folgende Codebeispiel zeigt, wie Kommentare des angegebenen Autors entfernt werden:
Der wichtigste Punkt, der hier hervorgehoben werden muss, 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 zum ersten Kommentar rückwärts zu durchlaufen. Der Grund dafür ist, dass wenn Sie am Ende beginnen und rückwärts gehen, der Index der vorhergehenden Elemente unverändert bleibt und Sie sich zum ersten Element in der Sammlung zurückarbeiten können.
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-C | |
// The path to the documents directories. | |
System::String inputDataDir = GetInputDataDir_WorkingWithComments(); | |
System::String outputDataDir = GetOutputDataDir_WorkingWithComments(); | |
// Open the document. | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"TestFile.doc"); | |
// Extract the information about the comments of all the authors. | |
for (System::String const &comment : ExtractComments(doc)) | |
{ | |
std::cout << comment.ToUtf8String(); | |
} | |
// Remove comments by the "pm" author. | |
RemoveComments(doc, u"pm"); | |
std::cout << "Comments from \"pm\" are removed!" << std::endl; | |
// Extract the information about the comments of the "ks" author. | |
for (System::String const &comment: ExtractComments(doc, u"ks")) | |
{ | |
std::cout << comment.ToUtf8String(); | |
} | |
//Read the comment's reply and resolve them. | |
CommentResolvedandReplies(doc); | |
// Remove all comments. | |
RemoveComments(doc); | |
std::cout << "All comments are removed!" << std::endl; | |
System::String outputPath = outputDataDir + u"ProcessComments.doc"; | |
// Save the document. | |
doc->Save(outputPath); |
So entfernen Sie einen Kommentar zwischen CommentRangeStart und CommentRangeEnd
Mit Aspose.Words können Sie auch Kommentare zwischen den Knoten CommentRangeStart und CommentRangeEnd 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-C | |
// The path to the documents directories. | |
System::String inputDataDir = GetInputDataDir_WorkingWithComments(); | |
System::String outputDataDir = GetOutputDataDir_WorkingWithComments(); | |
// Open the document. | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"TestFile.doc"); | |
System::SharedPtr<CommentRangeStart> commentStart = System::DynamicCast<CommentRangeStart>(doc->GetChild(NodeType::CommentRangeStart, 0, true)); | |
System::SharedPtr<CommentRangeEnd> commentEnd = System::DynamicCast<CommentRangeEnd>(doc->GetChild(NodeType::CommentRangeEnd, 0, true)); | |
System::SharedPtr<Node> currentNode = commentStart; | |
bool isRemoving = true; | |
while (currentNode != nullptr && isRemoving) | |
{ | |
if (currentNode->get_NodeType() == NodeType::CommentRangeEnd) | |
{ | |
isRemoving = false; | |
} | |
System::SharedPtr<Node> nextNode = currentNode->NextPreOrder(doc); | |
currentNode->Remove(); | |
currentNode = nextNode; | |
} | |
System::String outputPath = outputDataDir + u"RemoveRegionText.doc"; | |
// Save the document. | |
doc->Save(outputPath); |
Kommentar-Antwort hinzufügen und entfernen
Die AddReply -Methode fügt diesem Kommentar eine Antwort hinzu. Bitte beachten Sie, dass aufgrund der bestehenden Microsoft Bürobeschränkungen nur 1 Antwortebenen im Dokument zulässig sind. Eine Ausnahme vom Typ InvalidOperationException wird ausgelöst, wenn diese Methode für den vorhandenen Antwortkommentar aufgerufen wird.
Sie können die Methode RemoveReply verwenden, um die angegebene Antwort auf diesen Kommentar zu entfernen.
Das folgende Codebeispiel zeigt, wie Sie eine Antwort zum Kommentar hinzufügen und die Antwort des Kommentars entfernen:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
// The path to the documents directories. | |
System::String inputDataDir = GetInputDataDir_WorkingWithComments(); | |
System::String outputDataDir = GetOutputDataDir_WorkingWithComments(); | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"TestFile.doc"); | |
System::SharedPtr<Comment> comment = System::DynamicCast<Comment>(doc->GetChild(NodeType::Comment, 0, true)); | |
//Remove the reply | |
comment->RemoveReply(comment->get_Replies()->idx_get(0)); | |
//Add a reply to comment | |
comment->AddReply(u"John Doe", u"JD", System::DateTime(2017, 9, 25, 12, 15, 0), u"New reply"); | |
System::String outputPath = outputDataDir + u"CommentReply.doc"; | |
// Save the document to disk. | |
doc->Save(outputPath); |
Lesen Sie die Antwort des Kommentars
Die Eigenschaft Replies gibt eine Auflistung der Comment -Objekte zurück, die unmittelbare untergeordnete Elemente des angegebenen Kommentars sind.
Das folgende Codebeispiel zeigt, wie Sie die Antworten eines Kommentars durchlaufen und auflösen:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
void CommentResolvedandReplies(const System::SharedPtr<Document>& doc) | |
{ | |
System::SharedPtr<NodeCollection> comments = doc->GetChildNodes(NodeType::Comment, true); | |
System::SharedPtr<Comment> parentComment = System::DynamicCast<Comment>(comments->idx_get(0)); | |
for (System::SharedPtr<Comment> childComment : System::IterateOver<System::SharedPtr<Comment>>(parentComment->get_Replies())) | |
{ | |
// Get comment parent and status. | |
std::cout << childComment->get_Ancestor()->get_Id() << std::endl << childComment->get_Done() << std::endl; | |
// And update comment Done mark. | |
childComment->set_Done(true); | |
} | |
} |