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

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-Java
String dataDir = Utils.getDataDir(AddComments.class);
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.write("Some text is added.");
Comment comment = new Comment(doc, "Awais Hafeez", "AH", new Date());
builder.getCurrentParagraph().appendChild(comment);
comment.getParagraphs().add(new Paragraph(doc));
comment.getFirstParagraph().getRuns().add(new Run(doc, "Comment text."));
doc.save(dataDir + "output.doc");

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
String dataDir = Utils.getDataDir(AnchorComment.class);
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.getFirstSection().getBody().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.getFirstSection().getBody().appendChild(para2);
Comment comment = new Comment(doc, "Awais Hafeez", "AH", new Date());
comment.getParagraphs().add(new Paragraph(doc));
comment.getFirstParagraph().getRuns().add(new Run(doc, "Comment text."));
CommentRangeStart commentRangeStart = new CommentRangeStart(doc, comment.getId());
CommentRangeEnd commentRangeEnd = new CommentRangeEnd(doc, comment.getId());
run1.getParentNode().insertAfter(commentRangeStart, run1);
run3.getParentNode().insertAfter(commentRangeEnd, run3);
commentRangeEnd.getParentNode().insertAfter(comment, commentRangeEnd);
doc.save(dataDir + "output.doc");

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

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

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

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

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

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

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

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

Для этого упражнения мы будем использовать следующий документ Word:

extract-remove-comments-aspose-words-java-1

Как вы можете видеть, он содержит несколько комментариев от двух авторов с инициалами “pm” и “ks”.

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

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

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
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.
for (Comment comment : (Iterable<Comment>) comments) {
collectedComments.add(comment.getAuthor() + " " + comment.getDateTime() + " " + comment.toString(SaveFormat.TEXT));
}
return collectedComments;

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

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

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

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
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.
for (Comment comment : (Iterable<Comment>) comments) {
if (comment.getAuthor().equals(authorName))
collectedComments.add(comment.getAuthor() + " " + comment.getDateTime() + " " + comment.toString(SaveFormat.TEXT));
}
return collectedComments;

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

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

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// 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-Java
// 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.getCount() - 1; i >= 0; i--) {
Comment comment = (Comment) comments.get(i);
if (comment.getAuthor().equals(authorName))
comment.remove();
}
}

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

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(ProcessComments.class);
// Open the document.
Document doc = new Document(dataDir + "TestFile.doc");
for (String comment : (Iterable<String>) extractComments(doc))
System.out.print(comment);
// Remove comments by the "pm" author.
removeComments(doc, "pm");
System.out.println("Comments from \"pm\" are removed!");
// Extract the information about the comments of the "ks" author.
for (String comment : (Iterable<String>) extractComments(doc, "ks"))
System.out.print(comment);
//Read the comment's reply and resolve them.
System.out.println("Read the comment's reply and resolve them.");
CommentResolvedandReplies(doc);
// Remove all comments.
removeComments(doc);
System.out.println("All comments are removed!");
// Save the document.
doc.save(dataDir + "output.doc");

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

extract-remove-comments-aspose-words-java-2

Теперь из выходного документа Word удалены комментарии:

extract-remove-comments-aspose-words-java-3

Как удалить текст между 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-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(RemoveCommentRegionText.class);
// Open the document.
Document doc = new Document(dataDir + "TestFile.doc");
CommentRangeStart commentStart = (CommentRangeStart) doc.getChild(NodeType.COMMENT_RANGE_START, 0, true);
CommentRangeEnd commentEnd = (CommentRangeEnd) doc.getChild(NodeType.COMMENT_RANGE_END, 0, true);
Node currentNode = commentStart;
Boolean isRemoving = true;
while (currentNode != null && isRemoving) {
if (currentNode.getNodeType() == NodeType.COMMENT_RANGE_END)
isRemoving = false;
Node nextNode = currentNode.nextPreOrder(doc);
currentNode.remove();
currentNode = nextNode;
}
doc.save(dataDir + "output.doc");

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

Метод addReply добавляет ответ к этому комментарию. Пожалуйста, обратите внимание, что из-за существующих ограничений MS Office в документе разрешен только один (1) уровень ответов. Если этот метод будет вызван для существующего комментария к ответу, возникнет исключение типа InvalidOperationException.

Вы можете использовать метод removeReply, чтобы удалить указанный ответ на этот комментарий.

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document(dataDir + "TestFile.doc");
Comment comment = (Comment) doc.getChild(NodeType.COMMENT, 0, true);
//Remove the reply
comment.removeReply(comment.getReplies().get(0));
//Add a reply to comment
comment.addReply("John Doe", "JD", new Date(), "New reply");
dataDir = dataDir + "TestFile_Out.doc";
// Save the document to disk.
doc.save(dataDir);

Прочитайте ответ на комментарий

Aspose.Words поддержка чтения ответа на комментарий. Свойство Replies возвращает коллекцию объектов Comment, которые являются непосредственными дочерними элементами указанного комментария.

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
static void CommentResolvedandReplies(Document doc) {
NodeCollection<Comment> comments = doc.getChildNodes(NodeType.COMMENT, true);
Comment parentComment = (Comment) comments.get(0);
for (Comment childComment : parentComment.getReplies()) {
// Get comment parent and status.
System.out.println(childComment.getAncestor().getId());
System.out.println(childComment.getDone());
// And update comment Done mark.
childComment.setDone(true);
}
}