Praca z komentarzami

Aspose.Words umożliwia użytkownikom pracę z komentarzami – komentarze w dokumencie w Aspose.Words są reprezentowane przez klasę Comment. Użyj także klas CommentRangeStart i CommentRangeEnd, aby określić region tekstu, który powinien być powiązany z komentarzem.

Dodaj komentarz

Aspose.Words umożliwia dodawanie komentarzy na kilka sposobów:

  1. Korzystanie z klasy Comment
  2. Wykorzystanie klas CommentRangeStart i CommentRangeEnd

Poniższy przykład kodu pokazuje, jak dodać komentarz do akapitu przy użyciu klasy 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")

Poniższy przykład kodu pokazuje, jak dodać komentarz do akapitu przy użyciu obszaru tekstu oraz klas CommentRangeStart i 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")

Wyodrębnij lub usuń komentarze

Używanie komentarzy w dokumencie programu Word (oprócz funkcji śledzenia zmian) jest powszechną praktyką podczas przeglądania dokumentów, zwłaszcza gdy jest wielu recenzentów. Mogą zaistnieć sytuacje, w których jedyne, czego potrzebujesz z dokumentu, to komentarze. Załóżmy, że chcesz wygenerować listę wyników przeglądu, a może zebrałeś wszystkie przydatne informacje z dokumentu i po prostu chcesz usunąć niepotrzebne komentarze. Możesz wyświetlić lub usunąć komentarze konkretnego recenzenta.

W tym przykładzie przyjrzymy się prostym metodom gromadzenia informacji z komentarzy w dokumencie i usuwania komentarzy z dokumentu. W szczególności omówimy, jak:

  • Wyodrębnij wszystkie komentarze z dokumentu lub tylko te, które dodał konkretny autor.
  • Usuń wszystkie komentarze z dokumentu lub tylko od konkretnego autora.

Jak wyodrębnić lub usunąć komentarze

Kod w tym przykładzie jest w rzeczywistości dość prosty i wszystkie metody opierają się na tym samym podejściu. Komentarz w dokumencie Word jest reprezentowany przez obiekt Comment w modelu obiektowym dokumentu Aspose.Words. Aby zebrać wszystkie komentarze w dokumencie, użyj metody get_child_nodes z pierwszym parametrem ustawionym na NodeType.COMMENT. Upewnij się, że drugi parametr metody get_child_nodes jest ustawiony na true: zmusza to get_child_nodes do rekurencyjnego wybierania wszystkich węzłów podrzędnych, a nie tylko zbierania bezpośrednich węzłów podrzędnych.

Aby zilustrować, jak wyodrębnić i usunąć komentarze z dokumentu, wykonamy następujące kroki:

  1. Otwórz dokument Word, korzystając z klasy Document
  2. Pobierz wszystkie komentarze z dokumentu do kolekcji
  3. Aby wyodrębnić komentarze:
    1. Przejrzyj kolekcję za pomocą operatora fore
    2. Wyodrębnij i podaj nazwisko autora, datę i godzinę oraz treść wszystkich komentarzy
    3. Wyodrębnij i wypisz nazwisko autora, datę i godzinę oraz treść komentarzy napisanych przez konkretnego autora, w tym przypadku autora “ks”
  4. Aby usunąć komentarze:
    1. Przejdź wstecz przez kolekcję, używając operatora for
    2. Usuń komentarze
  5. Zapisz zmiany

Jak wyodrębnić wszystkie komentarze

Metoda get_child_nodes jest bardzo przydatna i można z niej skorzystać za każdym razem, gdy trzeba uzyskać listę węzłów dokumentu dowolnego typu. Powstała kolekcja nie powoduje natychmiastowego narzutu, ponieważ węzły są wybierane do tej kolekcji tylko wtedy, gdy wyliczasz zawarte w niej elementy lub uzyskujesz do nich dostęp.

Poniższy przykład kodu pokazuje, jak wyodrębnić nazwisko autora, datę i godzinę oraz tekst wszystkich komentarzy w dokumencie:

# 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

Jak wyodrębnić komentarze określonego autora

Po wybraniu węzłów Comment do kolekcji wystarczy wyodrębnić potrzebne informacje. W tym przykładzie inicjały autora, data, godzina i zwykły tekst komentarza są połączone w jeden ciąg; zamiast tego możesz zapisać go w inny sposób.

Przeciążona metoda, która wyodrębnia komentarze konkretnego autora, jest prawie taka sama, po prostu sprawdza nazwisko autora przed dodaniem informacji do tablicy.

Poniższy przykład kodu pokazuje, jak wyodrębnić nazwisko autora, datę i godzinę oraz tekst komentarzy określonego autora:

# 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

Jak usunąć komentarze

Jeśli usuwasz wszystkie komentarze, nie ma potrzeby przeglądania kolekcji, usuwając komentarze jeden po drugim; możesz je usunąć, wywołując clear w kolekcji komentarzy.

Poniższy przykład kodu pokazuje, jak usunąć wszystkie komentarze z dokumentu:

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

Kiedy musisz selektywnie usuwać komentarze, proces staje się bardziej podobny do kodu, którego używaliśmy do wyodrębniania komentarzy.

Poniższy przykład kodu pokazuje, jak usunąć komentarze określonego autora:

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

Najważniejszą kwestią, którą należy tutaj podkreślić, jest użycie operatora for. W przeciwieństwie do prostego wyodrębniania, tutaj chcesz usunąć komentarz. Odpowiednią sztuczką jest iteracja kolekcji wstecz od ostatniego Comment do pierwszego. Dzieje się tak dlatego, że jeśli zaczniesz od końca i będziesz się cofać, indeks poprzednich pozycji pozostanie niezmieniony i będziesz mógł wrócić do pierwszej pozycji w kolekcji.

Poniższy przykład kodu pokazuje metody wyodrębniania i usuwania komentarzy:

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

Jak usunąć komentarz pomiędzy CommentRangeStart i CommentRangeEnd

Za pomocą Aspose.Words możesz także usuwać komentarze pomiędzy węzłami CommentRangeStart i CommentRangeEnd.

Poniższy przykład kodu pokazuje, jak usunąć tekst między CommentRangeStart i CommentRangeEnd:

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

Dodaj lub usuń odpowiedź na komentarz

Metoda add_reply dodaje odpowiedź na ten komentarz. Należy pamiętać, że ze względu na istniejące ograniczenia Microsoft Office w dokumencie dozwolony jest tylko 1 poziom odpowiedzi. Jeśli ta metoda zostanie wywołana w istniejącym komentarzu odpowiedzi, zostanie zgłoszony wyjątek typu InvalidOperationException.

Możesz użyć metody remove_reply, aby usunąć określoną odpowiedź na ten komentarz.

Poniższy przykład kodu pokazuje, jak dodać odpowiedź do komentarza i usunąć odpowiedź komentarza:

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

Przeczytaj odpowiedź na komentarz

Właściwość replies zwraca kolekcję obiektów Comment, które są bezpośrednimi dziećmi określonego komentarza.

Poniższy przykład kodu pokazuje, jak przeglądać odpowiedzi na komentarze i je rozwiązywać:

# 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