Nawigacja za pomocą kursora

Podczas pracy z dokumentem, nawet jeśli jest on krótki lub długi, będziesz musiał poruszać się po dokumencie. Nawigacja za pomocą wirtualnego kursora reprezentuje możliwość poruszania się pomiędzy różnymi węzłami w dokumencie.

W krótkim dokumencie poruszanie się po dokumencie jest proste, ponieważ punkt wstawiania można przesuwać nawet za pomocą klawiszy strzałek na klawiaturze lub klikając myszą, aby umieścić punkt wstawiania w dowolnym miejscu. Ale gdy masz duży dokument, który ma wiele stron, te podstawowe techniki okażą się niewystarczające.

W tym artykule wyjaśniono, jak poruszać się po dokumencie i nawigować wirtualnym kursorem do różnych jego części.

Wykrywanie aktualnej pozycji kursora

Przed rozpoczęciem procesu nawigacji po dokumencie musisz uzyskać aktualnie wybrany węzeł. Dokładną pozycję kursora w wybranym węźle można uzyskać za pomocą właściwości current_node. Ponadto zamiast pobierać bieżący węzeł, można uzyskać aktualnie wybrany akapit lub aktualnie wybraną sekcję, korzystając z właściwości current_paragraph i current_section.

Wszelkie operacje wstawiania wykonane przy użyciu DocumentBuilder zostaną wstawione przed current_node. Gdy bieżący akapit jest pusty lub kursor znajduje się tuż przed końcem akapitu, funkcja current_node zwraca Brak.

Nawigowanie po metodach w dokumencie

Podczas edycji tekstu ważne jest, aby wiedzieć, jak poruszać się po dokumencie i gdzie dokładnie się w nim poruszać. Aspose.Words umożliwia poruszanie się po dokumencie i przechodzenie do jego różnych sekcji i części – jest to podobne do funkcjonalności okienka nawigacji w Microsoft Word, umożliwiającego przejście do strony lub nagłówka w dokumencie Word bez przewijania.

Główną metodą jest możliwość przeniesienia pozycji kursora do określonego węzła w dokumencie. Można to osiągnąć za pomocą metody move_to.

Poniższy przykład kodu pokazuje, jak przenieść DocumentBuilder do różnych węzłów w dokumencie:

# 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)
# Start a bookmark and add content to it using a DocumentBuilder.
builder.start_bookmark("MyBookmark")
builder.writeln("Bookmark contents.")
builder.end_bookmark("MyBookmark")
# The node that the DocumentBuilder is currently at is past the boundaries of the bookmark.
self.assertEqual(doc.range.bookmarks[0].bookmark_end, builder.current_paragraph.first_child)
# If we wish to revise the content of our bookmark with the DocumentBuilder, we can move back to it like this.
builder.move_to_bookmark("MyBookmark")
# Now we're located between the bookmark's BookmarkStart and BookmarkEnd nodes, so any text the builder adds will be within it.
self.assertEqual(doc.range.bookmarks[0].bookmark_start, builder.current_paragraph.first_child)
# We can move the builder to an individual node,
# which in this case will be the first node of the first paragraph, like this.
builder.move_to(doc.first_section.body.first_paragraph.get_child_nodes(aw.NodeType.ANY, False)[0])
self.assertEqual(aw.NodeType.BOOKMARK_START, builder.current_node.node_type)
self.assertTrue(builder.is_at_start_of_paragraph)
# A shorter way of moving the very start/end of a document is with these methods.
builder.move_to_document_end()
self.assertTrue(builder.is_at_end_of_paragraph)
builder.move_to_document_start()
self.assertTrue(builder.is_at_start_of_paragraph)

Ale oprócz podstawowej metody move_to istnieją bardziej szczegółowe.

Przejdź do początku lub końca dokumentu

Możesz przejść na początek lub na koniec dokumentu, korzystając z metod move_to_document_start i move_to_document_end.

Poniższy przykład kodu pokazuje, jak przenieść pozycję kursora na początek lub na koniec dokumentu:

# 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)
# Move the cursor position to the beginning of your document.
builder.move_to_document_start()
print("\nThis is the beginning of the document.")
# Move the cursor position to the end of your document.
builder.move_to_document_end()
print("\nThis is the end of the document.")

Nawiguj za pomocą zakładek

Możesz zaznaczyć miejsce, które chcesz znaleźć i łatwo do niego ponownie przenieść. Możesz wstawić do dokumentu dowolną liczbę zakładek, a następnie przeglądać je, identyfikując zakładki za pomocą unikalnych nazw. Do zakładki można przejść metodą move_to_bookmark.

Poniższy przykład kodu pokazuje, jak przenieść pozycję kursora do zakładki:

# 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)
# Start a bookmark and add content to it using a DocumentBuilder.
builder.start_bookmark("MyBookmark")
builder.writeln("Bookmark contents.")
builder.end_bookmark("MyBookmark")
# The node that the DocumentBuilder is currently at is past the boundaries of the bookmark.
self.assertEqual(doc.range.bookmarks[0].bookmark_end, builder.current_paragraph.first_child)
# If we wish to revise the content of our bookmark with the DocumentBuilder, we can move back to it like this.
builder.move_to_bookmark("MyBookmark")
# Now we're located between the bookmark's BookmarkStart and BookmarkEnd nodes, so any text the builder adds will be within it.
self.assertEqual(doc.range.bookmarks[0].bookmark_start, builder.current_paragraph.first_child)
# We can move the builder to an individual node,
# which in this case will be the first node of the first paragraph, like this.
builder.move_to(doc.first_section.body.first_paragraph.get_child_nodes(aw.NodeType.ANY, False)[0])

Przejdź do komórek tabeli

Do komórki tabeli można przejść za pomocą metody move_to_cell. Ta metoda umożliwia nawigację kursorem do dowolnej komórki w określonej tabeli. Ponadto można określić indeks, aby przenieść kursor do dowolnej pozycji lub określonego znaku w komórce w ramach metody move_to_cell.

Poniższy przykład kodu pokazuje, jak przenieść pozycję kursora do określonej komórki tabeli:

# 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 + "Tables.docx")
builder = aw.DocumentBuilder(doc)
# Move the builder to row 3, cell 4 of the first table.
builder.move_to_cell(0, 2, 3, 0)
builder.write("\nCell contents added by DocumentBuilder")
table = doc.get_child(aw.NodeType.TABLE, 0, True).as_table()
self.assertEqual(table.rows[2].cells[3], builder.current_node.parent_node.parent_node)
self.assertEqual("Cell contents added by DocumentBuilderCell 3 contents\a", table.rows[2].cells[3].get_text().strip())

Przejdź do pola

Do konkretnego pola w dokumencie możesz przejść korzystając z metody move_to_field. Ponadto możesz przejść do konkretnego pola scalania, korzystając z metody move_to_merge_field.

Poniższy przykład kodu pokazuje, jak przenieść kursor narzędzia do tworzenia dokumentów do określonego pola:

# 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)
# Insert a field using the DocumentBuilder and add a run of text after it.
field = builder.insert_field("MERGEFIELD field")
builder.write(" Text after the field.")
# The builder's cursor is currently at end of the document.
self.assertIsNone(builder.current_node)
# We can move the builder to a field like this, placing the cursor at immediately after the field.
builder.move_to_field(field, True)
# Note that the cursor is at a place past the FieldEnd node of the field, meaning that we are not actually inside the field.
# If we wish to move the DocumentBuilder to inside a field,
# we will need to move it to a field's FieldStart or FieldSeparator node using the DocumentBuilder.move_to() method.
self.assertEqual(field.end, builder.current_node.previous_sibling)
builder.write(" Text immediately after the field.")

Przejdź do nagłówka lub stopki

Możesz przejść na początek nagłówka lub stopki, korzystając z metody move_to_header_footer

Poniższy przykład kodu pokazuje, jak przenieść kursor narzędzia do tworzenia dokumentów do nagłówka lub stopki dokumentu:

# 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)
# Specify that we want headers and footers different for first, even and odd pages.
builder.page_setup.different_first_page_header_footer = True
builder.page_setup.odd_and_even_pages_header_footer = True
# Create the headers.
builder.move_to_header_footer(aw.HeaderFooterType.HEADER_FIRST)
builder.write("Header for the first page")
builder.move_to_header_footer(aw.HeaderFooterType.HEADER_EVEN)
builder.write("Header for even pages")
builder.move_to_header_footer(aw.HeaderFooterType.HEADER_PRIMARY)
builder.write("Header for all other pages")
# Create two pages in the document.
builder.move_to_section(0)
builder.writeln("Page1")
builder.insert_break(aw.BreakType.PAGE_BREAK)
builder.writeln("Page2")
doc.save(docs_base.artifacts_dir + "AddContentUsingDocumentBuilder.move_to_headers_footers.docx")

Przejdź do sekcji lub akapitu

Możesz przejść do określonej sekcji lub akapitu, korzystając z metod move_to_paragraph lub move_to_section. Ponadto możesz określić indeks, aby przenieść kursor do dowolnej pozycji lub określonego znaku w akapicie w ramach metody move_to_paragraph.

Poniższy przykład kodu pokazuje, jak przejść do określonej sekcji i konkretnego akapitu w dokumencie:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
doc.append_child(aw.Section(doc))
# Move a DocumentBuilder to the second section and add text.
builder = aw.DocumentBuilder(doc)
builder.move_to_section(1)
builder.writeln("Text added to the 2nd section.")
# Create document with paragraphs.
doc = aw.Document(docs_base.my_dir + "Paragraphs.docx")
paragraphs = doc.first_section.body.paragraphs
self.assertEqual(22, paragraphs.count)
# When we create a DocumentBuilder for a document, its cursor is at the very beginning of the document by default,
# and any content added by the DocumentBuilder will just be prepended to the document.
builder = aw.DocumentBuilder(doc)
self.assertEqual(0, paragraphs.index_of(builder.current_paragraph))
# You can move the cursor to any position in a paragraph.
builder.move_to_paragraph(2, 10)
self.assertEqual(2, paragraphs.index_of(builder.current_paragraph))
builder.writeln("This is a new third paragraph. ")
self.assertEqual(3, paragraphs.index_of(builder.current_paragraph))