Práce s komentáři
Vyzkoušejte online
Tuto funkci můžete vyzkoušet pomocí našeho Zdarma online odstranit anotace.
Aspose.Words umožňuje uživatelům pracovat s komentáři-komentáře v dokumentu v Aspose.Words jsou reprezentovány třídou Comment. Také použijte třídy CommentRangeStart a CommentRangeEnd k určení oblasti textu, která by měla být spojena s komentářem.
Přidat komentář
Aspose.Words umožňuje přidávat komentáře několika způsoby:
- Použití třídy Comment
- Použití tříd CommentRangeStart a CommentRangeEnd
Následující příklad kódu ukazuje, jak přidat komentář k odstavci pomocí třídy Comment:
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); |
Následující příklad kódu ukazuje, jak přidat komentář k odstavci pomocí oblasti textu a tříd CommentRangeStart a CommentRangeEnd:
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); |
Extrahujte nebo odeberte Komentáře
Používání komentářů v Word dokumentu (kromě sledování změn) je běžnou praxí při kontrole dokumentů, zejména pokud existuje více recenzentů. Mohou nastat situace, kdy jediné, co od dokumentu potřebujete, jsou komentáře. Řekněme, že chcete vygenerovat seznam zjištění recenze, nebo jste možná shromáždili všechny užitečné informace z dokumentu a jednoduše chcete odstranit zbytečné komentáře. Možná budete chtít zobrazit nebo odstranit komentáře konkrétního recenzenta.
V této ukázce se podíváme na několik jednoduchých metod jak pro shromažďování informací z komentářů v dokumentu, tak pro odstraňování komentářů z dokumentu. Konkrétně se budeme zabývat tím, jak:
- Extrahujte všechny komentáře z dokumentu nebo pouze ty, které vytvořil konkrétní autor.
- Odstraňte všechny komentáře z dokumentu nebo pouze od konkrétního autora.
Jak extrahovat nebo odstranit komentáře
Kód v tomto vzorku je ve skutečnosti poměrně jednoduchý a všechny metody jsou založeny na stejném přístupu. Komentář v dokumentu Word je reprezentován objektem Comment v modelu objektu Aspose.Words dokumentu. Chcete-li shromáždit všechny komentáře v dokumentu, použijte metodu GetChildNodes s prvním parametrem nastaveným na NodeType.Comment. Ujistěte se, že druhý parametr metody GetChildNodes je nastaven na hodnotu true: to nutí GetChildNodes rekurzivně vybírat ze všech podřízených uzlů, spíše než shromažďovat pouze bezprostřední podřízené.
Pro ilustraci, jak extrahovat a odstranit komentáře z dokumentu, projdeme následujícími kroky:
- Otevřete dokument Word pomocí třídy Document
- Získejte všechny komentáře z dokumentu do sbírky
- Chcete-li extrahovat Komentáře:
- Projděte sbírku pomocí operátora foreach
- Extrahujte a uveďte jméno autora, datum a čas a text všech komentářů
- Extrahujte a uveďte jméno autora, datum a čas a text komentářů napsaných konkrétním autorem, v tomto případě autorem ‘ks’
- Chcete-li odstranit komentáře:
- Vraťte se zpět do sbírky pomocí pro operátora
- Odstranit komentáře
- Uložte změny
Jak extrahovat všechny komentáře
Metoda GetChildNodes je velmi užitečná a můžete ji použít pokaždé, když potřebujete získat seznam uzlů dokumentů jakéhokoli typu. Výsledná kolekce nevytváří okamžitou režii, protože uzly jsou vybrány do této kolekce pouze při výčtu nebo přístupu k položkám v ní.
Následující příklad kódu ukazuje, jak extrahovat jméno autora, datum a čas a text všech komentářů v dokumentu:
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; | |
} |
Jak extrahovat Komentáře zadaného autora
Po výběru uzlů komentářů do kolekce stačí extrahovat potřebné informace. V této ukázce jsou iniciály autora, datum, čas a prostý text komentáře sloučeny do jednoho řetězce; místo toho se můžete rozhodnout jej uložit jinými způsoby.
Přetížená metoda, která extrahuje komentáře od konkrétního autora, je téměř stejná, pouze zkontroluje jméno autora před přidáním informací do pole.
Následující příklad kódu ukazuje, jak extrahovat jméno autora, datum a čas a text komentářů zadaného autora:
Jak odstranit komentáře
Pokud odstraňujete všechny komentáře, není třeba procházet kolekcí a mazat komentáře jeden po druhém; můžete je odstranit voláním NodeCollection.Clear
v kolekci komentářů.
Následující příklad kódu ukazuje, jak odstranit všechny komentáře v dokumentu:
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(); | |
} |
Když potřebujete selektivně odstranit komentáře, proces se více podobá kódu, který jsme použili pro extrakci komentářů.
Následující příklad kódu ukazuje, jak odstranit komentáře zadaného autora:
Hlavním bodem, který je zde třeba zdůraznit, je použití operátora for. Na rozdíl od jednoduché extrakce zde chcete smazat komentář. Vhodným trikem je iterovat sbírku zpět od posledního komentáře k prvnímu. Důvod pro to pokud začnete od konce a posunete se zpět, index předchozích položek zůstane nezměněn a můžete se vrátit zpět k první položce v kolekci.
Následující příklad kódu ukazuje metody pro extrakci a odstranění komentářů:
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); |
Jak odstranit komentář mezi CommentRangeStart a CommentRangeEnd
Pomocí Aspose.Words můžete také odstranit komentáře mezi uzly CommentRangeStart a CommentRangeEnd.
Následující příklad kódu ukazuje, jak odstranit text mezi CommentRangeStart a CommentRangeEnd:
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); |
Přidat a odebrat odpověď Komentáře
Metoda AddReply přidá odpověď na tento komentář. Vezměte prosím na vědomí, že vzhledem k existujícím omezením Microsoft Office je v dokumentu povolena pouze 1 úroveň odpovědí. Výjimka typu InvalidOperationException bude vyvolána, pokud je tato metoda vyvolána u existujícího komentáře odpovědi.
K odstranění zadané odpovědi na tento komentář můžete použít metodu RemoveReply.
Následující příklad kódu ukazuje, jak přidat odpověď na komentář a odstranit odpověď Komentáře:
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); |
Přečtěte si Odpověď komentáře
Vlastnost Replies vrací kolekci objektů Comment, které jsou bezprostředními podřízenými zadaného Komentáře.
Následující příklad kódu ukazuje, jak iterovat odpovědi komentáře a vyřešit je:
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); | |
} | |
} |