コメントの操作

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

次のコード例は、テキスト領域と CommentRangeStart クラスおよび CommentRangeEnd クラスを使用して段落にコメントを追加する方法を示しています。

# 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")

コメントの抽出または削除

Word 文書内で (変更の追跡に加えて) コメントを使用することは、文書をレビューするとき、特に複数のレビュー担当者がいる場合に一般的に行われます。ドキュメントに必要なものがコメントだけである場合があります。レビュー結果のリストを生成したいとします。あるいは、文書からすべての有用な情報を収集し、単に不要なコメントを削除したいとします。特定の査読者のコメントを表示または削除したい場合があります。

このサンプルでは、ドキュメント内のコメントから情報を収集する方法と、ドキュメントからコメントを削除する方法の両方を行う簡単な方法をいくつか見ていきます。具体的には次の方法について説明します。

  • ドキュメントからすべてのコメント、または特定の作成者によって作成されたコメントのみを抽出します。
  • ドキュメントからすべてのコメントを削除するか、特定の作成者からのみコメントを削除します。

コメントを抽出または削除する方法

このサンプルのコードは実際には非常に単純で、すべてのメソッドは同じアプローチに基づいています。 Word 文書内のコメントは、Aspose.Words 文書オブジェクト モデルの Comment オブジェクトによって表されます。ドキュメント内のすべてのコメントを収集するには、最初のパラメータを NodeType.COMMENT に設定して get_child_nodes メソッドを使用します。 get_child_nodes メソッドの 2 番目のパラメーターが true に設定されていることを確認します。これにより、get_child_nodes は直接の子だけを収集するのではなく、すべての子ノードから再帰的に選択するようになります。

ドキュメントからコメントを抽出および削除する方法を説明するために、次の手順を実行します。

  1. Document クラスを使用して Word 文書を開きます
  2. ドキュメントからすべてのコメントをコレクションに取得します
  3. コメントを抽出するには:
    1. foreach 演算子を使用してコレクションを調べます
    2. すべてのコメントの作成者名、日付と時刻、テキストを抽出してリストします。
    3. 特定の著者 (この場合は著者「ks」) が書いたコメントの著者名、日付と時刻、テキストを抽出してリストします。
  4. コメントを削除するには:
    1. for 演算子を使用してコレクションを逆方向に移動します。
    2. コメントを削除する
  5. 変更を保存します

すべてのコメントを抽出する方法

get_child_nodes メソッドは非常に便利で、あらゆる種類のドキュメント ノードのリストを取得する必要があるときはいつでも使用できます。このコレクション内の項目を列挙またはアクセスする場合にのみノードがこのコレクションに選択されるため、結果のコレクションでは直ちにオーバーヘッドが発生しません。

次のコード例は、ドキュメント内のすべてのコメントの作成者名、日付と時刻、テキストを抽出する方法を示しています。

# 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

指定した作成者のコメントを抽出する方法

コレクションに Comment ノードを選択したら、必要な情報を抽出するだけです。このサンプルでは、作成者のイニシャル、日付、時刻、およびコメントのプレーン テキストが 1 つの文字列に結合されます。代わりに、他の方法で保存することもできます。

特定の作成者からのコメントを抽出するオーバーロードされたメソッドはほぼ同じで、情報を配列に追加する前に作成者の名前をチェックするだけです。

次のコード例は、指定した作成者によるコメントの作成者名、日付と時刻、テキストを抽出する方法を示しています。

# 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

コメントを削除する方法

すべてのコメントを削除する場合は、コレクション内を移動してコメントを 1 つずつ削除する必要はありません。コメント コレクションで clear を呼び出すことで、それらを削除できます。

次のコード例は、ドキュメント内のすべてのコメントを削除する方法を示しています。

# 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()

コメントを選択的に削除する必要がある場合、そのプロセスはコメント抽出に使用したコードにより似たものになります。

次のコード例は、指定した作成者によるコメントを削除する方法を示しています。

# 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()

ここで強調すべき主な点は、for 演算子の使用です。単純な抽出とは異なり、ここではコメントを削除します。適切な方法は、最後の Comment から最初の Comment までコレクションを逆方向に反復することです。その理由は、最後から開始して後方に移動すると、前の項目のインデックスは変更されず、コレクション内の最初の項目に戻ることができるためです。

次のコード例は、コメントの抽出と削除のメソッドを示しています。

# 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")

CommentRangeStart と CommentRangeEnd の間のコメントを削除する方法

Aspose.Words を使用すると、CommentRangeStart ノードと CommentRangeEnd ノードの間のコメントを削除することもできます。

次のコード例は、CommentRangeStartCommentRangeEnd の間のテキストを削除する方法を示しています。

# 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")

コメントの返信を追加または削除する

add_reply メソッドは、このコメントに返信を追加します。 Microsoft Office の既存の制限により、ドキュメント内では 1 レベルの返信のみが許可されることに注意してください。このメソッドが既存の Reply コメントに対して呼び出された場合、InvalidOperationException 型の例外が発生します。

remove_reply メソッドを使用して、このコメントに対する指定された返信を削除できます。

次のコード例は、コメントに返信を追加し、コメントの返信を削除する方法を示しています。

# 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")

コメントの返信を読む

replies プロパティは、指定されたコメントの直接の子である Comment オブジェクトのコレクションを返します。

次のコード例は、コメントの返信を反復処理して解決する方法を示しています。

# 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