Работа с комментариями

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-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithComments();
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.Write("Some text is added.");
Comment comment = new Comment(doc, "Awais Hafeez", "AH", DateTime.Today);
builder.CurrentParagraph.AppendChild(comment);
comment.Paragraphs.Add(new Paragraph(doc));
comment.FirstParagraph.Runs.Add(new Run(doc, "Comment text."));
dataDir = dataDir + "Comments_out.doc";
// Save the document.
doc.Save(dataDir);

Следующий пример кода показывает, как добавить комментарий к абзацу, используя область текста и CommentRangeStart и CommentRangeEnd классы:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithComments();
Document doc = new Document();
Paragraph para1 = new Paragraph(doc);
Run run1 = new Run(doc, "Some ");
Run run2 = new Run(doc, "text ");
para1.AppendChild(run1);
para1.AppendChild(run2);
doc.FirstSection.Body.AppendChild(para1);
Paragraph para2 = new Paragraph(doc);
Run run3 = new Run(doc, "is ");
Run run4 = new Run(doc, "added ");
para2.AppendChild(run3);
para2.AppendChild(run4);
doc.FirstSection.Body.AppendChild(para2);
Comment comment = new Comment(doc, "Awais Hafeez", "AH", DateTime.Today);
comment.Paragraphs.Add(new Paragraph(doc));
comment.FirstParagraph.Runs.Add(new Run(doc, "Comment text."));
CommentRangeStart commentRangeStart = new CommentRangeStart(doc, comment.Id);
CommentRangeEnd commentRangeEnd = new CommentRangeEnd(doc, comment.Id);
run1.ParentNode.InsertAfter(commentRangeStart, run1);
run3.ParentNode.InsertAfter(commentRangeEnd, run3);
commentRangeEnd.ParentNode.InsertAfter(comment, commentRangeEnd);
dataDir = dataDir + "Anchor.Comment_out.doc";
// Save the document.
doc.Save(dataDir);

Извлечение или удаление комментариев

Использование комментариев в документе Word (в дополнение к изменениям трека) является обычной практикой при рассмотрении документов, особенно когда есть несколько рецензентов. Могут быть ситуации, когда единственное, что вам нужно от документа, это комментарии. Скажем, вы хотите создать список результатов обзора, или, возможно, вы собрали всю полезную информацию из документа, и вы просто хотите удалить ненужные комментарии. Вы можете просмотреть или удалить комментарии конкретного рецензента.

В этой выборке мы рассмотрим некоторые простые методы как для сбора информации из комментариев в документе, так и для удаления комментариев из документа. В частности, мы рассмотрим, как:

  • Извлеките все комментарии из документа или только те, которые сделаны конкретным автором
  • Удалить все комментарии из документа или только от конкретного автора

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

Код в этой выборке на самом деле довольно прост, и все методы основаны на одном и том же подходе. Комментарий в документе Word представляет собой Comment объект в Aspose.Words Модель объекта документа. Чтобы собрать все комментарии в документе, используйте GetChildNodes Метод с первым параметром, установленным для NodeType.Comment. Убедитесь, что второй параметр GetChildNodes метод устанавливается trueЭто заставляет GetChildNodes Рекурсивно выбирать из всех узлов ребенка, а не только собирать детей.

Чтобы проиллюстрировать, как извлечь и удалить комментарии из документа, мы рассмотрим следующие шаги:

  1. Откройте документ Word, используя Document класс
  2. Получить все комментарии из документа в сборник
  3. Чтобы извлечь комментарии: 1.Пройти сбор с помощью оператора foreach 2. Извлеките и перечислите имя автора, дату и время и текст всех комментариев 3. Извлеките и перечислите имя автора, дату и время и текст комментариев, написанных конкретным автором, в этом случае автор “k”
  4. Чтобы удалить комментарии: 1.Перейти назад через сбор с помощью оператора 2. Удалить комментарии
  5. Сохранить изменения

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

The GetChildNodes Метод очень полезен, и вы можете использовать его каждый раз, когда вам нужно получить список узлов документов любого типа. Полученная коллекция не создает непосредственных накладных расходов, потому что узлы выбираются в эту коллекцию только тогда, когда вы перечисляете или получаете доступ к элементам в ней.

Следующий пример кода показывает, как извлечь имя автора, дату и время и текст всех комментариев в документе:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
static ArrayList ExtractComments(Document doc)
{
ArrayList collectedComments = new ArrayList();
// Collect all comments in the document
NodeCollection comments = doc.GetChildNodes(NodeType.Comment, true);
// Look through all comments and gather information about them.
foreach (Comment comment in comments)
{
collectedComments.Add(comment.Author + " " + comment.DateTime + " " + comment.ToString(SaveFormat.Text));
}
return collectedComments;
}

Как извлечь комментарии конкретного автора

После того, как вы выбрали Comment Все, что вам нужно сделать, это извлечь необходимую информацию. В этом образце инициалы автора, дата, время и простой текст комментария объединены в одну строку; вместо этого вы можете сохранить его другими способами.

Перегруженный метод, который извлекает комментарии от конкретного автора, почти такой же, он просто проверяет имя автора, прежде чем добавлять информацию в массив.

Следующий пример кода показывает, как извлечь имя автора, дату и время и текст комментариев указанного автора:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
static ArrayList ExtractComments(Document doc, string authorName)
{
ArrayList collectedComments = new ArrayList();
// Collect all comments in the document
NodeCollection comments = doc.GetChildNodes(NodeType.Comment, true);
// Look through all comments and gather information about those written by the authorName author.
foreach (Comment comment in comments)
{
if (comment.Author == authorName)
collectedComments.Add(comment.Author + " " + comment.DateTime + " " + comment.ToString(SaveFormat.Text));
}
return collectedComments;
}

Как удалить комментарии

Если вы удаляете все комментарии, нет необходимости перемещаться по коллекции, удаляя комментарии один за другим. Вы можете удалить их, позвонив Clear метод сбора комментариев.

Следующий пример кода показывает, как удалить все комментарии в документе:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
static void RemoveComments(Document doc)
{
// Collect all comments in the document
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-.NET
static void RemoveComments(Document doc, string authorName)
{
// Collect all comments in the document
NodeCollection comments = doc.GetChildNodes(NodeType.Comment, true);
// Look through all comments and remove those written by the authorName author.
for (int i = comments.Count - 1; i >= 0; i--)
{
Comment comment = (Comment)comments[i];
if (comment.Author == authorName)
comment.Remove();
}
}

Главным моментом здесь является использование оператора. В отличие от простого извлечения, здесь вы хотите удалить комментарий. Подходящим трюком является повторение коллекции назад от последнего комментария к первому. Причина этого, если вы начинаете с конца и двигаетесь назад, индекс предыдущих пунктов остается неизменным, и вы можете вернуться к первому пункту в коллекции.

Следующий пример кода показывает методы извлечения и удаления комментариев:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithComments();
string fileName = "TestFile.doc";
// Open the document.
Document doc = new Document(dataDir + fileName);
// Extract the information about the comments of all the authors.
foreach (string comment in ExtractComments(doc))
Console.Write(comment);
// Remove comments by the "pm" author.
RemoveComments(doc, "pm");
Console.WriteLine("Comments from \"pm\" are removed!");
// Extract the information about the comments of the "ks" author.
foreach (string comment in ExtractComments(doc, "ks"))
Console.Write(comment);
//Read the comment's reply and resolve them.
CommentResolvedandReplies(doc);
// Remove all comments.
RemoveComments(doc);
Console.WriteLine("All comments are removed!");
dataDir = dataDir + RunExamples.GetOutputFilePath(fileName);
// Save the document.
doc.Save(dataDir);

Как удалить комментарий между 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-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithComments();
string fileName = "TestFile.doc";
// Open the document.
Document doc = new Document(dataDir + fileName);
CommentRangeStart commentStart = (CommentRangeStart)doc.GetChild(NodeType.CommentRangeStart, 0, true);
CommentRangeEnd commentEnd = (CommentRangeEnd)doc.GetChild(NodeType.CommentRangeEnd, 0, true);
Node currentNode = commentStart;
Boolean isRemoving = true;
while (currentNode != null && isRemoving)
{
if (currentNode.NodeType == NodeType.CommentRangeEnd)
isRemoving = false;
Node nextNode = currentNode.NextPreOrder(doc);
currentNode.Remove();
currentNode = nextNode;
}
dataDir = dataDir + "RemoveRegionText_out.doc";
// Save the document.
doc.Save(dataDir);

Добавить или удалить комментарий

The AddReply Метод добавляет ответ на этот комментарий. Обратите внимание, что благодаря существующему Microsoft В документе допускается ограничение только на 1 уровень ответов. Исключение из вида InvalidOperationException будет поднято, если этот метод будет вызван существующим комментарием Ответ.

Вы можете использовать RemoveReply Способ удаления указанного ответа на данный комментарий.

Следующий пример кода показывает, как добавить ответ на комментарий и удалить ответ комментария:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document(dataDir + "TestFile.doc");
Comment comment = (Comment)doc.GetChild(NodeType.Comment, 0, true);
//Remove the reply
comment.RemoveReply(comment.Replies[0]);
//Add a reply to comment
comment.AddReply("John Doe", "JD", new DateTime(2017, 9, 25, 12, 15, 0), "New reply");
dataDir = dataDir + "TestFile_Out.doc";
// Save the document to disk.
doc.Save(dataDir);

Read Comment’s Ответ

The Replies Имущество возвращает коллекцию Comment объекты, являющиеся непосредственными детьми указанного комментария.

Следующий пример кода показывает, как повторить ответы комментария и решить их:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
static void CommentResolvedandReplies(Document doc)
{
NodeCollection comments = doc.GetChildNodes(NodeType.Comment, true);
Comment parentComment = (Comment)comments[0];
foreach (Comment childComment in parentComment.Replies)
{
// Get comment parent and status.
Console.WriteLine(childComment.Ancestor.Id);
Console.WriteLine(childComment.Done);
// And update comment Done mark.
childComment.Done = true;
}
}