Arbeiten mit Kommentaren

Aspose.Words ermöglicht Benutzern das Arbeiten mit Kommentaren – Kommentare in einem Dokument in Aspose.Words werden durch die Comment-Klasse dargestellt. Verwenden Sie außerdem die CommentRangeStart- und CommentRangeEnd-Klassen, um den Textbereich anzugeben, der einem Kommentar zugeordnet werden soll.

Einen Kommentar hinzufügen

Mit Aspose.Words können Sie Kommentare auf verschiedene Arten hinzufügen:

  1. Verwendung der Comment-Klasse
  2. Verwendung der CommentRangeStart- und CommentRangeEnd-Klassen

Das folgende Codebeispiel zeigt, wie Sie mithilfe der Comment-Klasse einen Kommentar zu einem Absatz hinzufügen:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
builder.write("Some text is added.")
comment = aw.Comment(doc, "Awais Hafeez", "AH", datetime.today())
builder.current_paragraph.append_child(comment)
comment.paragraphs.add(aw.Paragraph(doc))
comment.first_paragraph.runs.add(aw.Run(doc, "Comment text."))
doc.save(docs_base.artifacts_dir + "WorkingWithComments.add_comments.docx")

Das folgende Codebeispiel zeigt, wie Sie mithilfe eines Textbereichs und der CommentRangeStart- und CommentRangeEnd-Klassen einen Kommentar zu einem Absatz hinzufügen:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
para1 = aw.Paragraph(doc)
run1 = aw.Run(doc, "Some ")
run2 = aw.Run(doc, "text ")
para1.append_child(run1)
para1.append_child(run2)
doc.first_section.body.append_child(para1)
para2 = aw.Paragraph(doc)
run3 = aw.Run(doc, "is ")
run4 = aw.Run(doc, "added ")
para2.append_child(run3)
para2.append_child(run4)
doc.first_section.body.append_child(para2)
comment = aw.Comment(doc, "Awais Hafeez", "AH", datetime.today())
comment.paragraphs.add(aw.Paragraph(doc))
comment.first_paragraph.runs.add(aw.Run(doc, "Comment text."))
commentRangeStart = aw.CommentRangeStart(doc, comment.id)
commentRangeEnd = aw.CommentRangeEnd(doc, comment.id)
run1.parent_node.insert_after(commentRangeStart, run1)
run3.parent_node.insert_after(commentRangeEnd, run3)
commentRangeEnd.parent_node.insert_after(comment, commentRangeEnd)
doc.save(docs_base.artifacts_dir + "WorkingWithComments.anchor_comment.doc")

Kommentare extrahieren oder entfernen

Die Verwendung von Kommentaren in einem Word-Dokument (zusätzlich zum Verfolgen von Änderungen) ist eine gängige Vorgehensweise bei der Überprüfung von Dokumenten, insbesondere wenn es mehrere Prüfer gibt. Es kann Situationen geben, in denen das Einzige, was Sie von einem Dokument benötigen, die Kommentare sind. Angenommen, Sie möchten eine Liste mit Überprüfungsergebnissen erstellen oder Sie haben alle nützlichen Informationen aus dem Dokument gesammelt und möchten einfach unnötige Kommentare entfernen. Möglicherweise möchten Sie die Kommentare eines bestimmten Rezensenten anzeigen oder entfernen.

In diesem Beispiel werden wir uns einige einfache Methoden zum Sammeln von Informationen aus den Kommentaren in einem Dokument und zum Entfernen von Kommentaren aus einem Dokument ansehen. Im Einzelnen behandeln wir Folgendes:

  • Extrahieren Sie alle Kommentare aus einem Dokument oder nur die von einem bestimmten Autor.
  • Entfernen Sie alle Kommentare aus einem Dokument oder nur von einem bestimmten Autor.

So extrahieren oder entfernen Sie Kommentare

Der Code in diesem Beispiel ist eigentlich recht einfach und alle Methoden basieren auf dem gleichen Ansatz. Ein Kommentar in einem Word-Dokument wird durch ein Comment-Objekt im Aspose.Words-Dokumentobjektmodell dargestellt. Um alle Kommentare in einem Dokument zu sammeln, verwenden Sie die get_child_nodes-Methode, wobei der erste Parameter auf NodeType.COMMENT eingestellt ist. Stellen Sie sicher, dass der zweite Parameter der get_child_nodes-Methode auf true eingestellt ist: Dadurch wird get_child_nodes gezwungen, rekursiv aus allen untergeordneten Knoten auszuwählen, anstatt nur die unmittelbar untergeordneten Knoten zu sammeln.

Um zu veranschaulichen, wie Kommentare aus einem Dokument extrahiert und entfernt werden, führen wir die folgenden Schritte durch:

  1. Öffnen Sie ein Word-Dokument mit der Document-Klasse
  2. Holen Sie sich alle Kommentare aus dem Dokument in eine Sammlung
  3. So extrahieren Sie Kommentare:
    1. Gehen Sie die Sammlung mit dem foreach-Operator durch
    2. Extrahieren und listen Sie den Namen des Autors, Datum und Uhrzeit sowie den Text aller Kommentare auf
    3. Extrahieren und listen Sie den Namen des Autors, Datum und Uhrzeit sowie den Text von Kommentaren auf, die von einem bestimmten Autor verfasst wurden, in diesem Fall dem Autor “ks”
  4. So entfernen Sie Kommentare:
    1. Gehen Sie mit dem for-Operator rückwärts durch die Sammlung
    2. Kommentare entfernen
  5. Speichern Sie die Änderungen

So extrahieren Sie alle Kommentare

Die get_child_nodes-Methode ist sehr nützlich und Sie können sie jedes Mal verwenden, wenn Sie eine Liste von Dokumentknoten jeglicher Art benötigen. Die resultierende Sammlung verursacht keinen unmittelbaren Mehraufwand, da die Knoten nur dann in dieser Sammlung ausgewählt werden, wenn Sie Elemente darin aufzählen oder darauf zugreifen.

Das folgende Codebeispiel zeigt, wie der Name des Autors, Datum und Uhrzeit sowie der Text aller Kommentare im Dokument extrahiert werden:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
@staticmethod
def extract_comments(doc) :
collectedComments = []
comments = doc.get_child_nodes(aw.NodeType.COMMENT, True)
for node in comments :
comment = node.as_comment()
collectedComments.append(comment.author + " " + comment.date_time.strftime("%Y-%m-%d %H:%M:%S") + " " + comment.to_string(aw.SaveFormat.TEXT))
return collectedComments

So extrahieren Sie Kommentare eines bestimmten Autors

Nachdem Sie Comment-Knoten in einer Sammlung ausgewählt haben, müssen Sie nur noch die benötigten Informationen extrahieren. In diesem Beispiel werden die Initialen des Autors, Datum, Uhrzeit und der Klartext des Kommentars in einer Zeichenfolge zusammengefasst. Sie könnten es stattdessen auch auf andere Weise speichern.

Die überladene Methode, die die Kommentare eines bestimmten Autors extrahiert, ist fast identisch. Sie überprüft lediglich den Namen des Autors, bevor die Informationen zum Array hinzugefügt werden.

Das folgende Codebeispiel zeigt, wie der Name des Autors, Datum und Uhrzeit sowie der Text der Kommentare des angegebenen Autors extrahiert werden:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
@staticmethod
def extract_comments_by_author(doc, authorName) :
collectedComments = []
comments = doc.get_child_nodes(aw.NodeType.COMMENT, True)
for node in comments :
comment = node.as_comment()
if (comment.author == authorName) :
collectedComments.append(comment.author + " " + comment.date_time.strftime("%Y-%m-%d %H:%M:%S") + " " + comment.to_string(aw.SaveFormat.TEXT))
return collectedComments

So entfernen Sie Kommentare

Wenn Sie alle Kommentare entfernen, ist es nicht nötig, durch die Sammlung zu blättern und die Kommentare einzeln zu löschen. Sie können sie entfernen, indem Sie clear in der Kommentarsammlung aufrufen.

Das folgende Codebeispiel zeigt, wie alle Kommentare im Dokument entfernt werden:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
@staticmethod
def remove_comments(doc) :
comments = doc.get_child_nodes(aw.NodeType.COMMENT, True)
comments.clear()

Wenn Sie Kommentare selektiv entfernen müssen, ähnelt der Vorgang eher dem Code, den wir zum Extrahieren von Kommentaren verwendet haben.

Das folgende Codebeispiel zeigt, wie Kommentare des angegebenen Autors entfernt werden:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
@staticmethod
def remove_comments_by_author(doc, authorName) :
comments = doc.get_child_nodes(aw.NodeType.COMMENT, True)
# Look through all comments and remove those written by the authorName.
for i in range(comments.count, 0) :
print(i)
comment = comments[i].as_comment()
if (comment.author == authorName) :
comment.remove()

Der wichtigste hier hervorzuhebende Punkt ist die Verwendung des for-Operators. Im Gegensatz zur einfachen Extraktion möchten Sie hier einen Kommentar löschen. Ein geeigneter Trick besteht darin, die Sammlung rückwärts vom letzten Comment zum ersten zu iterieren. Der Grund dafür: Wenn Sie am Ende beginnen und rückwärts gehen, bleibt der Index der vorhergehenden Elemente unverändert und Sie können sich zum ersten Element in der Sammlung zurückarbeiten.

Das folgende Codebeispiel zeigt die Methoden zum Extrahieren und Entfernen von Kommentaren:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document(docs_base.my_dir + "Comments.docx")
# Extract the information about the comments of all the authors.
for comment in self.extract_comments(doc) :
print(comment)
# Remove comments by the "pm" author.
self.remove_comments_by_author(doc, "pm")
print("Comments from \"pm\" are removed!")
# Extract the information about the comments of the "ks" author.
for comment in self.extract_comments_by_author(doc, "ks") :
print(comment)
# Read the comment's reply and resolve them.
self.comment_resolved_and_replies(doc)
# Remove all comments.
self.remove_comments(doc)
print("All comments are removed!")
doc.save(docs_base.artifacts_dir + "WorkingWithComments.process_comments.docx")

So entfernen Sie einen Kommentar zwischen CommentRangeStart und CommentRangeEnd

Mit Aspose.Words können Sie auch Kommentare zwischen den CommentRangeStart- und CommentRangeEnd-Knoten entfernen.

Das folgende Codebeispiel zeigt, wie Text zwischen CommentRangeStart und CommentRangeEnd entfernt wird:

# Open the document.
doc = aw.Document(docs_base.my_dir + "Comments.docx")

commentStart = doc.get_child(aw.NodeType.COMMENT_RANGE_START, 0, True).as_comment_range_start()
commentEnd = doc.get_child(aw.NodeType.COMMENT_RANGE_END, 0, True).as_comment_range_end()

currentNode = commentStart
isRemoving = True
while (currentNode != None and isRemoving) :
    if (currentNode.node_type == aw.NodeType.COMMENT_RANGE_END) :
        isRemoving = False

    nextNode = currentNode.next_pre_order(doc)
    currentNode.remove()
    currentNode = nextNode

# Save the document.
doc.save(docs_base.artifacts_dir + "WorkingWithComments.remove_region_text.docx")

Kommentarantwort hinzufügen oder entfernen

Die add_reply-Methode fügt eine Antwort auf diesen Kommentar hinzu. Bitte beachten Sie, dass aufgrund der bestehenden Microsoft Office-Einschränkungen nur eine Antwortebene im Dokument zulässig ist. Eine Ausnahme vom Typ InvalidOperationException wird ausgelöst, wenn diese Methode für den vorhandenen Antwortkommentar aufgerufen wird.

Sie können die remove_reply-Methode verwenden, um die angegebene Antwort auf diesen Kommentar zu entfernen.

Das folgende Codebeispiel zeigt, wie man einem Kommentar eine Antwort hinzufügt und die Antwort des Kommentars entfernt:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document(docs_base.my_dir + "Comments.docx")
comment = doc.get_child(aw.NodeType.COMMENT, 0, True).as_comment()
comment.remove_reply(comment.replies[0])
comment.add_reply("John Doe", "JD", datetime(2017, 9, 25, 12, 15, 0), "New reply")
doc.save(docs_base.artifacts_dir + "WorkingWithComments.add_remove_comment_reply.docx")

Lesen Sie die Antwort des Kommentars

Die replies-Eigenschaft gibt eine Sammlung von Comment-Objekten zurück, die unmittelbar untergeordnete Elemente des angegebenen Kommentars sind.

Das folgende Codebeispiel zeigt, wie Sie die Antworten eines Kommentars durchlaufen und diese auflösen:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
@staticmethod
def comment_resolved_and_replies(doc) :
comments = doc.get_child_nodes(aw.NodeType.COMMENT, True)
parentComment = comments[0].as_comment()
for child in parentComment.replies :
childComment = child.as_comment()
# Get comment parent and status.
print(childComment.ancestor.id)
print(childComment.done)
# And update comment Done mark.
childComment.done = True