Trabalhar com comentários

Aspose.Words permite que os usuários trabalhem com comentários-os comentários em um documento em Aspose.Words são representados pela classe Comment. Use também as classes CommentRangeStart e CommentRangeEnd para especificar a região do texto que deve ser associada a um comentário.

Adicionar um comentário

Aspose.Words permite adicionar comentários de várias maneiras:

  1. Usando a classe Comment
  2. Usando as classes CommentRangeStart e CommentRangeEnd

O exemplo de código a seguir mostra como adicionar um comentário a um parágrafo usando a classe 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);

O exemplo de código a seguir mostra como adicionar um comentário a um parágrafo usando uma região de texto e as classes CommentRangeStart e 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);

Extrair ou remover comentários

O uso de comentários em um documento do Word (além de rastrear alterações) é uma prática comum ao revisar documentos, especialmente quando há vários revisores. Pode haver situações em que a única coisa que você precisa de um documento são os comentários. Digamos que você queira gerar uma lista de resultados de revisão, ou talvez tenha coletado todas as informações úteis do documento e simplesmente queira remover comentários desnecessários. Você pode querer ver ou remover os comentários de um revisor específico.

Nesta amostra, vamos analisar alguns métodos simples para recolher informações dos comentários de um documento e para remover comentários de um documento. Especificamente, abordaremos como:

  • Extraia todos os comentários de um documento ou apenas os feitos por um determinado autor.
  • Remova todos os comentários de um documento ou apenas de um autor específico.

Como extrair ou remover comentários

O código desta amostra é, na verdade, bastante simples e todos os métodos baseiam-se na mesma abordagem. Um comentário em um documento do Word é representado por um objeto Comment no modelo de objeto de Documento Aspose.Words. Para recolher todos os comentários num documento, utilize o método GetChildNodes com o primeiro parâmetro definido como NodeType.Comment. Certifique-se de que o segundo parâmetro do método GetChildNodes esteja definido como true: isso força o GetChildNodes a selecionar recursivamente de todos os nós filhos, em vez de coletar apenas os filhos imediatos.

Para ilustrar como extrair e remover comentários de um documento, seguiremos as seguintes etapas:

  1. Abrir um documento do Word utilizando a classe Document
  2. Obter todos os comentários do documento em uma coleção
  3. Para extrair comentários:
    1. Percorrer a recolha utilizando o operador foreach
    2. Extrair e listar o nome do autor, data e hora e o texto de todos os comentários
    3. Extrair e listar o nome do autor, a data e a hora e o texto dos comentários escritos por um autor específico, neste caso, o autor ‘ks’
  4. Para remover comentários:
    1. Retroceda através da recolha utilizando o for the operator
    2. Remover comentários
  5. Salve as alterações

Como extrair todos os comentários

O método GetChildNodes é muito útil e você pode usá-lo sempre que precisar obter uma lista de nós de documentos de qualquer tipo. A coleção resultante não cria uma sobrecarga imediata porque os nós são selecionados nessa coleção somente quando você enumera ou acessa itens nela.

O exemplo de código a seguir mostra como extrair o nome do autor, data e hora e o texto de todos os comentários no documento:

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

Como extrair Comentários de um autor especificado

Depois de selecionar os nós de comentário em uma coleção, tudo o que você precisa fazer é extrair as informações necessárias. Neste exemplo, as iniciais do autor, a data, a hora e o texto simples do comentário são combinados numa cadeia de caracteres; em vez disso, pode optar por armazená-lo de outras formas.

O método sobrecarregado que extrai os comentários de um determinado autor é quase o mesmo, apenas verifica o nome do autor antes de adicionar as informações ao array.

O exemplo de código a seguir mostra como extrair o nome do autor, a data e a hora e o texto dos comentários do autor especificado:

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

Como remover comentários

Se você estiver removendo todos os comentários, não há necessidade de percorrer a coleção excluindo Comentários um por um; você pode removê-los chamando NodeCollection.Clear na coleção de comentários.

O exemplo de código a seguir mostra como remover todos os comentários no documento:

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

Quando você precisa remover seletivamente comentários, o processo se torna mais semelhante ao código que usamos para a extração de comentários.

O exemplo de código a seguir mostra como remover comentários do autor especificado:

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

O principal ponto a destacar aqui é a utilização do operador for. Ao contrário da extração simples, aqui você deseja excluir um comentário. Um truque adequado é iterar a coleção para trás do último comentário para o primeiro. A razão para isso se você começar do final e retroceder, o índice dos itens anteriores permanece inalterado e você pode voltar ao primeiro item da coleção.

O exemplo de código a seguir mostra os métodos para a extração e remoção de comentários:

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

Como remover um comentário entre CommentRangeStart e CommentRangeEnd

Usando Aspose.Words Você também pode remover comentários entre os nós CommentRangeStart e CommentRangeEnd.

O exemplo de código a seguir mostra como remover texto entre CommentRangeStart e 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);

Adicionar e remover a resposta do comentário

O método AddReply adiciona uma resposta a este comentário. Observe que, devido às limitações existentes do Microsoft Office, apenas o nível de respostas 1 é permitido no documento. Uma exceção do tipo InvalidOperationException será levantada se este método for chamado no Comentário de resposta existente.

Você pode usar o método RemoveReply para remover a resposta especificada a este comentário.

O exemplo de código a seguir mostra como adicionar uma resposta ao comentário e remover a resposta do comentário:

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

Ler a resposta do comentário

A propriedade Replies retorna uma coleção dos objetos Comment que são filhos imediatos do comentário especificado.

O exemplo de código a seguir mostra como iterar as respostas de um comentário e resolvê-las:

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