Navegação com Cursor
Ao trabalhar com um documento, mesmo que seja curto ou longo, você precisará navegar pelo documento. A navegação com um cursor virtual representa a capacidade de navegar entre diferentes nós em um documento.
Dentro de um documento curto, mover-se em um documento é simples, pois você pode mover o ponto de inserção usando as teclas de seta do teclado ou clicando com o mouse para localizar o ponto de inserção onde desejar. Mas quando você tiver um documento grande com muitas páginas, essas técnicas básicas serão insuficientes.
Este artigo explica como navegar em um documento e navegar com um cursor virtual para diferentes partes dele.
Detectando a posição atual do cursor
Antes de iniciar o processo de navegação pelo seu documento, você precisará obter o nó que está selecionado no momento. Você pode obter a posição exata do cursor em um nó selecionado usando a propriedade current_node. Além disso, em vez de obter o nó atual, você pode obter o parágrafo atualmente selecionado ou a seção atualmente selecionada usando as propriedades current_paragraph e current_section.
Quaisquer operações de inserção executadas usando o DocumentBuilder serão inseridas antes do current_node. Quando o parágrafo atual está vazio ou o cursor está posicionado logo antes do final do parágrafo, o current_node retorna None.
Navegando pelos métodos em um documento
Ao editar texto, é importante saber como navegar no documento e para onde exatamente se mover nele. Aspose.Words permite que você se mova em um documento e navegue por suas diferentes seções e partes – isso é semelhante à funcionalidade do Painel de Navegação no Microsoft Word para ir para uma página ou título em um documento do Word sem rolar.
O método principal é poder mover a posição do cursor para um nó específico em seu documento. Você pode conseguir isso usando o método move_to.
O exemplo de código a seguir mostra como mover o DocumentBuilder para nós diferentes em um 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) |
Mas além do método move_to básico, existem outros mais específicos.
Navegue até o início ou fim de um documento
Você pode ir para o início ou final do seu documento usando os métodos move_to_document_start e move_to_document_end.
O exemplo de código a seguir mostra como mover a posição do cursor para o início ou final de um 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.") |
Navegue com marcadores
Você pode marcar um local que deseja encontrar e movê-lo novamente com facilidade. Você pode inserir quantos marcadores desejar em seu documento e navegar por eles identificando os marcadores com nomes exclusivos. Você pode ir para um marcador usando o método move_to_bookmark.
Os exemplos de código a seguir mostram como mover a posição do cursor para um marcador:
# 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]) |
Navegue até as células da tabela
Você pode mover para uma célula da tabela usando o método move_to_cell. Este método permitirá que você navegue com o cursor em qualquer célula de uma tabela específica. Além disso, você pode especificar um índice para mover o cursor para qualquer posição ou caractere especificado em uma célula dentro do método move_to_cell.
O exemplo de código a seguir mostra como mover a posição do cursor para uma célula especificada da tabela:
# 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()) |
Navegue até um campo
Você pode ir para um campo específico em seu documento usando o método move_to_field. Além disso, você pode passar para um campo de mesclagem específico usando o método move_to_merge_field.
O exemplo de código a seguir mostra como mover o cursor do construtor de documentos para um campo específico:
# 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.") |
Navegue até um cabeçalho ou rodapé
Você pode ir para o início de um cabeçalho ou rodapé usando o método move_to_header_footer
O exemplo de código a seguir mostra como mover o cursor do construtor de documentos para um cabeçalho ou rodapé de documento:
Navegue até uma seção ou parágrafo
Você pode ir para uma seção ou parágrafo específico usando os métodos move_to_paragraph ou move_to_section. Além disso, você pode especificar um índice para mover o cursor para qualquer posição ou caractere especificado em um parágrafo dentro do método move_to_paragraph.
O exemplo de código a seguir mostra como mover para uma seção específica e um parágrafo específico em um 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)) |