Работа с Коментари

Aspose.Words позволява на потребителите да работят с Коментари – Коментарите в документ Aspose.Words са представени от класа Comment. Също така използвайте класовете CommentRangeStart и CommentRangeEnd, за да зададете областта от текста, която трябва да бъде свързана с коментар.

Добави коментар

Aspose.Words Позволява ви да добавяте коментари по няколко начина:

  1. Използване на клас Comment
  2. Използване на класовете CommentRangeStart и CommentRangeEnd

Следващият пример за код показва как да добавите коментар към абзац, като използвате клас 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);

Следващият пример за код показва как да добавите коментар към абзац, като използвате област от текст и класовете CommentRangeStart и 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);

Извличане или премахване на коментари

Използването на коментари в документ Word (В допълнение към проследяването на промени) е често срещана практика при преглеждането на документи, особено когато има няколко рецензенти. Може да има ситуации, в които единственото нещо, от което се нуждаете от документ, са коментарите. Да речем, че искате да генерирате списък с резултатите от прегледите или може би сте събрали цялата полезна информация от документа и просто искате да премахнете ненужните Коментари. Може да искате да видите или премахнете коментарите на конкретен рецензент.

В тази извадка ще разгледаме някои прости методи както за събиране на информация от коментарите в документ, така и за премахване на коментари от документ. По-конкретно, ще разгледаме как да:

  • Извлечете всички коментари от даден документ или само тези, направени от конкретен автор.
  • Премахнете всички коментари от даден документ или само от определен автор.

Как да извличате или премахвате Коментари

Кодът в тази извадка всъщност е доста прост и всички методи се основават на един и същ подход. Коментар в документ Word е представен от обект Comment в модел Aspose.Words документ. За да съберете всички коментари в документ, използвайте метода GetChildNodes С първия параметър, зададен на NodeType.Comment. Уверете се, че вторият параметър на метода GetChildNodes е настроен вярно: това принуждава GetChildNodes да избира рекурсивно от всички дъщерни възли, вместо да събира само непосредствените деца.

За да илюстрираме как да извличаме и премахваме коментари от документ, ще преминем през следните стъпки::

  1. Отваряне на документ Word с помощта на клас Document
  2. Получаване на всички коментари от документа в колекция
  3. Извличане на коментари:
    1. Преминете през колекцията, като използвате оператора за предна връзка
    2. Извлечете и Избройте името на автора, датата и часа и текста на всички коментари
    3. Извлечете и Избройте името на автора, датата и часа и текста на коментарите, написани от конкретен автор, в този случай авторът
  4. Премахване на коментари:
    1. Връщане назад през колекцията с помощта на оператора
    2. Премахване на коментари
  5. Запазване на промените

Как да извлечете всички коментари

GetChildNodes методът е много полезен и можете да го използвате всеки път, когато трябва да получите списък с възли на документи от всякакъв тип. Получената колекция не създава непосредствени режийни, защото възлите са избрани в тази колекция само когато изброите или получите достъп до елементи в нея.

Следният пример за код показва как да извлечете името на автора, датата и часа и текста на всички коментари в документа:

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;
}

Как да извлечете коментари от определен автор

След като сте избрали коментарни възли в колекция, всичко, което трябва да направите, е да извлечете информацията, от която се нуждаете. В тази извадка инициали на автора, дата, час и обикновен текст на коментара се комбинират в един низ; можете да изберете да го съхранявате по други начини.

Претовареният метод, който извлича коментарите от конкретен автор, е почти същият, той просто проверява името на автора, преди да добави информацията в масива.

Следният пример за код показва как да извлечете името на автора, датата и часа и текста на коментарите от посочения автор:

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, const System::String& authorName)
{
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 those written by the authorName author.
for (System::SharedPtr<Comment> comment : System::IterateOver<System::SharedPtr<Comment>>(comments))
{
if (comment->get_Author() == authorName)
{
collectedComments.push_back(comment->get_Author() + u" " + comment->get_DateTime() + u" " + System::StaticCast<Node>(comment)->ToString(SaveFormat::Text));
}
}
return collectedComments;
}

Как да премахнете Коментари

Ако премахвате всички коментари, няма нужда да преминавате през колекцията, изтривайки коментарите един по един; можете да ги премахнете, като се обадите NodeCollection.Clear в колекцията от коментари.

Следният пример за код показва как да премахнете всички коментари в документа:

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();
}

Когато трябва избирателно да премахвате Коментари, процесът става по-подобен на кода, който използвахме за извличане на коментари.

Следният пример за код показва как да премахнете коментари от посочения автор:

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, const System::String& authorName)
{
// Collect all comments in the document
System::SharedPtr<NodeCollection> comments = doc->GetChildNodes(NodeType::Comment, true);
// Look through all comments and remove those written by the authorName author.
for (int32_t i = comments->get_Count() - 1; i >= 0; i--)
{
System::SharedPtr<Comment> comment = System::DynamicCast<Comment>(comments->idx_get(i));
if (comment->get_Author() == authorName)
{
comment->Remove();
}
}
}

Основното, което трябва да се подчертае тук, е използването на оператора. За разлика от простото извличане, тук искате да изтриете коментар. Подходящ трик е да се повтаря колекцията назад от последния коментар към първия. Причината за това ако започнете от края и се придвижите назад, индексът на предходните елементи остава непроменен и можете да се върнете към първия елемент в колекцията.

Следващият пример за код показва методите за извличане и премахване на коментарите:

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);

Как да премахнете коментар между CommentRangeStart и CommentRangeEnd

С Aspose.Words можете също да премахвате Коментари между възлите CommentRangeStart и CommentRangeEnd.

Следният пример за код показва как да премахнете текст между CommentRangeStart и 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);

Добавяне и премахване на коментар Отговор

Методът AddReply добавя отговор на този коментар. Моля, имайте предвид, че поради съществуващите ограничения Microsoft в документа е разрешено само 1 ниво на отговори. Изключение от тип InvalidOperationException ще бъде повдигнато, ако този метод е извикан в съществуващия коментар за отговор.

Можете да използвате метода RemoveReply, за да премахнете посочения отговор на този коментар.

Следващият пример за код показва как да добавите отговор към коментар и да премахнете отговора на коментара:

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);

Прочетете отговора на коментара

Собственост Replies връща колекция от Comment обекти, които са непосредствени деца на посочения коментар.

Следващият пример за код показва как да итерирате отговорите на коментар и да ги разрешите:

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);
}
}