Navigation avec le curseur

Lorsque vous travaillez avec un document, même s’il est court ou long, vous devrez naviguer dans votre document. La navigation avec un curseur virtuel représente la possibilité de naviguer entre différents nœuds d’un document.

Dans un document court, se déplacer dans un document est simple puisque vous pouvez déplacer le point d’insertion même en utilisant les touches fléchées du clavier ou en cliquant sur la souris pour localiser le point d’insertion où vous le souhaitez. Mais une fois que vous disposez d’un document volumineux comportant de nombreuses pages, ces techniques de base seront insuffisantes.

Cet article explique comment se déplacer dans un document et naviguer avec un curseur virtuel vers différentes parties de celui-ci.

Détection de la position actuelle du curseur

Avant de commencer le processus de navigation dans votre document, vous devrez obtenir le nœud actuellement sélectionné. Vous pouvez obtenir la position exacte du curseur sur un nœud sélectionné en utilisant la propriété current_node. De plus, au lieu d’obtenir le nœud actuel, vous pouvez obtenir le paragraphe ou la section actuellement sélectionné en utilisant les propriétés current_paragraph et current_section.

Toutes les opérations d’insertion que vous effectuez à l’aide du DocumentBuilder seront insérées avant le current_node. Lorsque le paragraphe actuel est vide ou que le curseur est positionné juste avant la fin du paragraphe, le current_node renvoie Aucun.

Lorsque vous modifiez du texte, il est important de savoir comment naviguer dans votre document et où vous déplacer exactement. Aspose.Words vous permet de vous déplacer dans un document et de naviguer vers ses différentes sections et parties – ceci est similaire à la fonctionnalité du volet de navigation dans Microsoft Word pour accéder à une page ou à un titre dans un document Word sans faire défiler.

La méthode principale est de pouvoir déplacer la position du curseur vers un nœud spécifique de votre document, vous pouvez y parvenir en utilisant la méthode move_to.

L’exemple de code suivant montre comment déplacer le DocumentBuilder vers différents nœuds dans un document:

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

Mais outre la méthode de base move_to, il en existe des plus spécifiques.

Accédez au début ou à la fin d’un document

Vous pouvez aller au début ou à la fin de votre document en utilisant les méthodes move_to_document_start et move_to_document_end.

L’exemple de code suivant montre comment déplacer la position du curseur au début ou à la fin d’un document:

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

Vous pouvez marquer un endroit que vous souhaitez trouver et vous y déplacer facilement. Vous pouvez insérer autant de signets que vous le souhaitez dans votre document, puis les parcourir en identifiant les signets avec des noms uniques. Vous pouvez accéder à un signet en utilisant la méthode move_to_bookmark.

Les exemples de code suivants montrent comment déplacer la position du curseur vers un signet:

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

Accédez aux cellules du tableau

Vous pouvez accéder à une cellule du tableau en utilisant la méthode move_to_cell. Cette méthode vous permettra de naviguer avec votre curseur dans n’importe quelle cellule d’un tableau spécifique. De plus, vous pouvez spécifier un index pour déplacer le curseur vers n’importe quelle position ou caractère spécifié dans une cellule dans la méthode move_to_cell.

L’exemple de code suivant montre comment déplacer la position d’un curseur vers une cellule de tableau spécifiée:

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

Accédez à un champ

Vous pouvez accéder à un champ spécifique de votre document en utilisant la méthode move_to_field. De plus, vous pouvez accéder à un champ de fusion spécifique en utilisant la méthode move_to_merge_field.

L’exemple de code suivant montre comment déplacer le curseur du générateur de documents vers un champ spécifique:

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

Accédez à un en-tête ou un pied de page

Vous pouvez vous déplacer au début d’un en-tête ou d’un pied de page en utilisant la méthode move_to_header_footer

L’exemple de code suivant montre comment déplacer le curseur du générateur de documents vers un en-tête ou un pied de page de document:

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

Accédez à une section ou un paragraphe

Vous pouvez accéder à une section ou à un paragraphe spécifique en utilisant les méthodes move_to_paragraph ou move_to_section. De plus, vous pouvez spécifier un index pour déplacer le curseur vers n’importe quelle position ou un caractère spécifié dans un paragraphe au sein de la méthode move_to_paragraph.

L’exemple de code suivant montre comment accéder à une section spécifique et à un paragraphe spécifique dans un document:

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