Lavorare con i commenti

Aspose.Words consente agli utenti di lavorare con i commenti: i commenti in un documento in Aspose.Words sono rappresentati dalla classe Comment. Utilizzare anche le classi CommentRangeStart e CommentRangeEnd per specificare l’area di testo che deve essere associata a un commento.

Aggiungi un commento

Aspose.Words consente di aggiungere commenti in diversi modi:

  1. Utilizzo della classe Comment
  2. Utilizzo delle classi CommentRangeStart e CommentRangeEnd

L’esempio di codice seguente mostra come aggiungere un commento a un paragrafo utilizzando la 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);

Nell’esempio di codice seguente viene illustrato come aggiungere un commento a un paragrafo utilizzando un’area di testo e le classi 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);

Estrarre o rimuovere i commenti

L’utilizzo dei commenti in un documento Word (oltre a tenere traccia delle modifiche) è una pratica comune durante la revisione dei documenti, in particolare quando ci sono più revisori. Ci possono essere situazioni in cui l’unica cosa di cui hai bisogno da un documento sono i commenti. Supponiamo che tu voglia generare un elenco di risultati delle recensioni, o forse hai raccolto tutte le informazioni utili dal documento e vuoi semplicemente rimuovere i commenti non necessari. Potresti voler visualizzare o rimuovere i commenti di un determinato revisore.

In questo esempio, esamineremo alcuni metodi semplici sia per raccogliere informazioni dai commenti all’interno di un documento che per rimuovere i commenti da un documento. In particolare, copriremo come:

  • Estrarre tutti i commenti da un documento o solo quelli fatti da un particolare autore.
  • Rimuovere tutti i commenti da un documento o solo da un determinato autore.

Come estrarre o rimuovere i commenti

Il codice in questo esempio è in realtà abbastanza semplice e tutti i metodi sono basati sullo stesso approccio. Un commento in un documento di Word è rappresentato da un oggetto Comment nel modello a oggetti del documento Aspose.Words. Per raccogliere tutti i commenti in un documento utilizzare il metodo GetChildNodes con il primo parametro impostato su NodeType.Comment. Assicurarsi che il secondo parametro del metodo GetChildNodes sia impostato su true: questo costringe GetChildNodes a selezionare ricorsivamente da tutti i nodi figlio, piuttosto che raccogliere solo i figli immediati.

Per illustrare come estrarre e rimuovere i commenti da un documento, passeremo attraverso i seguenti passaggi:

  1. Aprire un documento Word usando la classe Document
  2. Ottenere tutti i commenti dal documento in una raccolta
  3. Per estrarre i commenti:
    1. Passare attraverso la raccolta utilizzando l’operatore foreach
    2. Estrarre ed elencare il nome dell’autore, la data e l’ora e il testo di tutti i commenti
    3. Estrarre ed elencare il nome dell’autore, la data e l’ora e il testo dei commenti scritti da un autore specifico, in questo caso, l’autore’ks'
  4. Per rimuovere i commenti:
    1. Andare indietro attraverso la raccolta usando il per l’operatore
    2. Rimuovi commenti
  5. Salva le modifiche

Come estrarre tutti i commenti

Il metodo GetChildNodes è molto utile e puoi usarlo ogni volta che hai bisogno di ottenere un elenco di nodi di documenti di qualsiasi tipo. La raccolta risultante non crea un overhead immediato perché i nodi vengono selezionati in questa raccolta solo quando si enumerano o si accedono agli elementi in essa contenuti.

Il seguente esempio di codice mostra come estrarre il nome dell’autore, la data e l’ora e il testo di tutti i commenti nel 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;
}

Come estrarre i commenti di un autore specificato

Dopo aver selezionato i nodi di commento in una raccolta, tutto ciò che devi fare è estrarre le informazioni necessarie. In questo esempio, le iniziali dell’autore, la data, l’ora e il testo normale del commento sono combinati in un’unica stringa; è possibile scegliere di memorizzarlo in altri modi.

Il metodo sovraccarico che estrae i commenti da un particolare autore è quasi lo stesso, controlla solo il nome dell’autore prima di aggiungere le informazioni nell’array.

L’esempio di codice seguente mostra come estrarre il nome dell’autore, la data e l’ora e il testo dei commenti dell’autore specificato:

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

Come rimuovere i commenti

Se si rimuovono tutti i commenti, non è necessario spostarsi nella raccolta eliminando i commenti uno per uno; è possibile rimuoverli chiamando NodeCollection.Clear nella raccolta commenti.

Il seguente esempio di codice mostra come rimuovere tutti i commenti nel 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 è necessario rimuovere selettivamente i commenti, il processo diventa più simile al codice che abbiamo usato per l’estrazione dei commenti.

L’esempio di codice seguente mostra come rimuovere i commenti dall’autore specificato:

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

Il punto principale da evidenziare qui è l’uso dell’operatore for. A differenza della semplice estrazione, qui si desidera eliminare un commento. Un trucco adatto è quello di iterare la raccolta all’indietro dall’ultimo commento al primo. La ragione di ciò se si inizia dalla fine e si sposta all’indietro, l’indice degli elementi precedenti rimane invariato e si può tornare al primo elemento della raccolta.

Il seguente esempio di codice mostra i metodi per l’estrazione e la rimozione dei commenti:

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

Come rimuovere un commento tra CommentRangeStart e CommentRangeEnd

Usando Aspose.Words puoi anche rimuovere i commenti tra i nodi CommentRangeStart e CommentRangeEnd.

Il seguente esempio di codice mostra come rimuovere il testo tra 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);

Aggiungere e rimuovere la risposta del commento

Il metodo AddReply aggiunge una risposta a questo commento. Si noti che a causa delle limitazioni esistenti di Microsoft Office è consentito solo il livello 1 di risposte nel documento. Un’eccezione di tipo InvalidOperationException verrà sollevata se questo metodo viene chiamato sul commento di risposta esistente.

È possibile utilizzare il metodo RemoveReply per rimuovere la risposta specificata a questo commento.

L’esempio di codice seguente mostra come aggiungere una risposta al commento e rimuovere la risposta del commento:

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

Leggi la risposta del commento

La proprietà Replies restituisce una raccolta degli oggetti Comment che sono figli immediati del commento specificato.

Il seguente esempio di codice mostra come scorrere le risposte di un commento e risolverle:

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