Navigazione con il cursore

Mentre lavori con un documento, anche se è breve o lungo, dovrai navigare all’interno del documento. La navigazione con un cursore virtuale rappresenta la possibilità di navigare tra diversi nodi in un documento.

All’interno di un documento breve, spostarsi all’interno di un documento è semplice poiché puoi spostare il punto di inserimento anche utilizzando i tasti freccia della tastiera o facendo clic con il mouse per posizionare il punto di inserimento dove preferisci. Ma una volta che hai un documento di grandi dimensioni con molte pagine, queste tecniche di base saranno insufficienti.

Questo articolo spiega come spostarsi all’interno di un documento e navigare con un cursore virtuale nelle diverse parti di esso.

Rilevamento della posizione corrente del cursore

Prima di iniziare il processo di navigazione nel documento, dovrai ottenere il nodo attualmente selezionato. Puoi ottenere la posizione esatta del cursore su un nodo selezionato utilizzando la proprietà current_node. Inoltre, invece di ottenere il nodo corrente, puoi ottenere il paragrafo o la sezione attualmente selezionati utilizzando le proprietà current_paragraph e current_section.

Qualsiasi operazione di inserimento eseguita utilizzando DocumentBuilder verrà inserita prima di current_node. Quando il paragrafo corrente è vuoto o il cursore è posizionato appena prima della fine del paragrafo, il current_node restituisce None.

Metodi di navigazione in un documento

Quando modifichi il testo, è importante sapere come navigare nel documento e dove spostarti esattamente al suo interno. Aspose.Words ti consente di spostarti in un documento e navigare nelle sue diverse sezioni e parti: è simile alla funzionalità del riquadro di spostamento in Microsoft Word per andare a una pagina o un’intestazione in un documento Word senza scorrere.

Il metodo principale è poter spostare la posizione del cursore su un nodo specifico nel documento, puoi ottenerlo utilizzando il metodo move_to.

Il seguente esempio di codice mostra come spostare il DocumentBuilder su diversi nodi in un documento:

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

Ma oltre al metodo move_to di base, ce ne sono altri più specifici.

Passare all’inizio o alla fine di un documento

Puoi andare all’inizio o alla fine del tuo documento utilizzando i metodi move_to_document_start e move_to_document_end.

L’esempio di codice seguente mostra come spostare la posizione del cursore all’inizio o alla fine di un documento:

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

Puoi contrassegnare un luogo che desideri trovare e spostarti di nuovo facilmente. Puoi inserire tutti i segnalibri che desideri nel tuo documento, quindi spostarti al loro interno identificando i segnalibri con nomi univoci. È possibile spostarsi su un segnalibro utilizzando il metodo move_to_bookmark.

I seguenti esempi di codice mostrano come spostare la posizione del cursore su un segnalibro:

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

Passare a Celle della tabella

Puoi spostarti in una cella della tabella utilizzando il metodo move_to_cell. Questo metodo ti consentirà di spostare il cursore in qualsiasi cella di una tabella specifica. Inoltre, puoi specificare un indice per spostare il cursore in qualsiasi posizione o carattere specificato in una cella all’interno del metodo move_to_cell.

L’esempio di codice seguente mostra come spostare la posizione del cursore su una cella di tabella specificata:

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

Passare a un campo

Puoi spostarti in un campo specifico nel tuo documento utilizzando il metodo move_to_field. Inoltre, puoi spostarti in un campo unione specifico utilizzando il metodo move_to_merge_field.

Il seguente esempio di codice mostra come spostare il cursore del generatore di documenti su un campo specifico:

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

Passare a un’intestazione o a un piè di pagina

Puoi spostarti all’inizio di un’intestazione o di un piè di pagina utilizzando il metodo move_to_header_footer

Il seguente esempio di codice mostra come spostare il cursore del generatore di documenti sull’intestazione o sul piè di pagina del documento:

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

Passare a una sezione o un paragrafo

Puoi spostarti a una sezione o paragrafo specifico utilizzando i metodi move_to_paragraph o move_to_section. Inoltre, puoi specificare un indice per spostare il cursore in qualsiasi posizione o carattere specificato in un paragrafo all’interno del metodo move_to_paragraph.

L’esempio di codice seguente mostra come spostarsi a una sezione specifica e a un paragrafo specifico in un documento:

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