Nawigacja kursorem

Podczas pracy z dokumentem, nawet jeśli jest krótki lub długi, trzeba będzie przejść przez dokument. Nawigacja z wirtualnym kursorem reprezentuje zdolność do nawigacji między różnymi węzłami w dokumencie.

W krótkim dokumencie, poruszanie się w dokumencie jest proste, ponieważ można przenieść punkt wprowadzania nawet za pomocą klawiszy strzałek klawiatury lub klikając myszką, aby zlokalizować punkt wprowadzania, gdzie chcesz. Ale kiedy masz duży dokument, który ma wiele stron, te podstawowe techniki będą niewystarczające.

Ten artykuł wyjaśnia jak poruszać się w dokumencie i poruszać się z wirtualnym kursorem do różnych jego części.

Wykrywanie bieżącej pozycji kursora

Przed rozpoczęciem procesu nawigacji przez dokument, trzeba będzie uzyskać węzeł, który jest aktualnie wybrany. Możesz uzyskać dokładną pozycję kursora w wybranym węźle za pomocą CurrentNode nieruchomości. Ponadto, zamiast uzyskania bieżącego węzła, można uzyskać wybrany obecnie akapit lub aktualnie wybraną sekcję za pomocą CurrentParagraph oraz CurrentSection nieruchomości.

Wszelkie operacje wstawiania wykonywane przy użyciu DocumentBuilder zostaną wprowadzone przed CurrentNode. Gdy bieżący akapit jest pusty lub kursor jest umieszczony tuż przed końcem akapitu, CurrentNode zwraca null.

Metody nawigacji w dokumencie

Podczas edycji tekstu ważne jest, aby wiedzieć, jak poruszać się po dokumencie i gdzie dokładnie przenieść się w nim. Aspose.Words pozwala poruszać się w dokumencie i poruszać się do różnych sekcji i części - jest to podobne do funkcjonalności panela nawigacyjnego w Microsoft Word przejść do strony lub nagłówka w dokumencie Word bez przewijania.

Głównym sposobem jest możliwość przesunięcia pozycji kursora do określonego węzła w dokumencie, można to osiągnąć za pomocą MoveTo Metoda.

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-Java
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Start a bookmark and add content to it using a DocumentBuilder.
builder.startBookmark("MyBookmark");
builder.writeln("Bookmark contents.");
builder.endBookmark("MyBookmark");
// The node that the DocumentBuilder is currently at is past the boundaries of the bookmark.
Assert.assertEquals(doc.getRange().getBookmarks().get(0).getBookmarkEnd(), builder.getCurrentParagraph().getFirstChild());
// If we wish to revise the content of our bookmark with the DocumentBuilder, we can move back to it like this.
builder.moveToBookmark("MyBookmark");
// Now we're located between the bookmark's BookmarkStart and BookmarkEnd nodes, so any text the builder adds will be within it.
Assert.assertEquals(doc.getRange().getBookmarks().get(0).getBookmarkStart(), builder.getCurrentParagraph().getFirstChild());
// 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.moveTo(doc.getFirstSection().getBody().getFirstParagraph().getChildNodes(NodeType.ANY, false).get(0));
Assert.assertEquals(NodeType.BOOKMARK_START, builder.getCurrentNode().getNodeType());
Assert.assertTrue(builder.isAtStartOfParagraph());
// A shorter way of moving the very start/end of a document is with these methods.
builder.moveToDocumentEnd();
Assert.assertTrue(builder.isAtEndOfParagraph());
builder.moveToDocumentStart();
Assert.assertTrue(builder.isAtStartOfParagraph());

Ale poza podstawowymi MoveTo Metoda, są bardziej konkretne.

Przejdź do początku lub końca dokumentu

Można przejść do początku lub końca dokumentu za pomocą MoveToDocumentStart oraz MoveToDocumentEnd metody.

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
String dataDir = Utils.getDataDir(DocumentBuilderMoveToDocumentStartEnd.class);
Document doc = new Document(dataDir + "Document.docx");
DocumentBuilder builder = new DocumentBuilder(doc);
// Move the cursor position to the beginning of your document.
builder.moveToDocumentStart();
builder.writeln("This is the beginning of the document.");
// Move the cursor position to the end of your document.
builder.moveToDocumentEnd();
builder.writeln("This is the end of the document.");

Nawigacja z zakładkami

Możesz zaznaczyć miejsce, które chcesz znaleźć i przejść do niego ponownie łatwo. Można umieścić w dokumencie tyle zakładek, ile chcesz, a następnie przejść przez nie poprzez identyfikację zakładek o unikalnych nazwach. Można przejść do zakładki za pomocą MoveToBookmark Metoda.

Poniższe przykłady kodowe pokazują jak przenieść pozycję kursora do zakładki:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Start a bookmark and add content to it using a DocumentBuilder.
builder.startBookmark("MyBookmark");
builder.writeln("Bookmark contents.");
builder.endBookmark("MyBookmark");
// If we wish to revise the content of our bookmark with the DocumentBuilder, we can move back to it like this.
builder.moveToBookmark("MyBookmark");
// Now we're located between the bookmark's BookmarkStart and BookmarkEnd nodes, so any text the builder adds will be within it.
Assert.assertEquals(doc.getRange().getBookmarks().get(0).getBookmarkStart(), builder.getCurrentParagraph().getFirstChild());
// 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.moveTo(doc.getFirstSection().getBody().getFirstParagraph().getChildNodes(NodeType.ANY, false).get(0));
Assert.assertEquals(NodeType.BOOKMARK_START, builder.getCurrentNode().getNodeType());

Nawigacja do komórek tabeli

Można przenieść się do komórki tabeli za pomocą MoveToCell Metoda. Metoda ta pozwala na nawigację kursora do dowolnej komórki w określonej tabeli. Dodatkowo, możesz określić indeks, aby przenieść kursor do dowolnej pozycji lub określonego znaku w komórce wewnątrz MoveToCell Metoda.

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-Java
String dataDir = Utils.getDataDir(DocumentBuilderMoveToTableCell.class);
Document doc = new Document(dataDir + "Tables.docx");
DocumentBuilder builder = new DocumentBuilder(doc);
// Move the builder to row 3, cell 4 of the first table.
builder.moveToCell(0, 2, 3, 0);
builder.write("\nCell contents added by DocumentBuilder");
Table table = (Table)doc.getChild(NodeType.TABLE, 0, true);
Assert.assertEquals(table.getRows().get(2).getCells().get(3), builder.getCurrentNode().getParentNode().getParentNode());
Assert.assertEquals("Cell contents added by DocumentBuilderCell 3 contents\u0007", table.getRows().get(2).getCells().get(3).getText().trim());

Przejdź na pole

Można przenieść się do określonego pola w dokumencie za pomocą MoveToField Metoda. Dodatkowo, można przejść do konkretnego pola połączenia za pomocą MoveToMergeField Metoda.

Poniższy przykład kodu pokazuje jak przenieść kursor konstruktora dokumentu do określonego pola:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Insert a field using the DocumentBuilder and add a run of text after it.
Field field = builder.insertField("MERGEFIELD field");
builder.write(" Text after the field.");
// The builder's cursor is currently at end of the document.
Assert.assertNull(builder.getCurrentNode());
// We can move the builder to a field like this, placing the cursor at immediately after the field.
builder.moveToField(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.MoveTo() method.
Assert.assertEquals(field.getEnd(), builder.getCurrentNode().getPreviousSibling());
builder.write(" Text immediately after the field.");

Przejdź do nagłówka lub footera

Można przejść do początku nagłówka lub stopki za pomocą MoveToHeaderFooter Metoda

Poniższy przykład kodu pokazuje jak przenieść kursor builder dokumentu do nagłówka lub stopki dokumentu:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
String dataDir = Utils.getDataDir(DocumentBuilderHeadersAndFooters.class);
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Specify that we want headers and footers different for first, even and odd pages.
builder.getPageSetup().setDifferentFirstPageHeaderFooter(true);
builder.getPageSetup().setOddAndEvenPagesHeaderFooter(true);
// Create the headers.
builder.moveToHeaderFooter(HeaderFooterType.HEADER_FIRST);
builder.write("Header for the first page");
builder.moveToHeaderFooter(HeaderFooterType.HEADER_EVEN);
builder.write("Header for even pages");
builder.moveToHeaderFooter(HeaderFooterType.HEADER_PRIMARY);
builder.write("Header for all other pages");
// Create two pages in the document.
builder.moveToSection(0);
builder.writeln("Page1");
builder.insertBreak(BreakType.PAGE_BREAK);
builder.writeln("Page2");
doc.save(dataDir + "DocumentBuilder.HeadersAndFooters.docx");

Przejdź do sekcji lub ustępu

Można przejść do określonej sekcji lub paragrafu za pomocą MoveToParagraph lub MoveToSection metody. Dodatkowo, możesz określić indeks, aby przenieść kursor do dowolnej pozycji lub określonego znaku w akapicie w MoveToParagraph Metoda.

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
String dataDir = Utils.getDataDir(DocumentBuilderMoveToSectionParagraph.class);
// Create a blank document and append a section to it, giving it two sections.
Document doc = new Document();
doc.appendChild(new Section(doc));
// Move a DocumentBuilder to the second section and add text.
DocumentBuilder builder = new DocumentBuilder(doc);
builder.moveToSection(1);
builder.writeln("Text added to the 2nd section.");
// Create document with paragraphs.
doc = new Document(dataDir + "Paragraphs.docx");
ParagraphCollection paragraphs = doc.getFirstSection().getBody().getParagraphs();
Assert.assertEquals(22, paragraphs.getCount());
// 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 = new DocumentBuilder(doc);
Assert.assertEquals(0, paragraphs.indexOf(builder.getCurrentParagraph()));
// You can move the cursor to any position in a paragraph.
builder.moveToParagraph(0, 14);
Assert.assertEquals(2, paragraphs.indexOf(builder.getCurrentParagraph()));
builder.writeln("This is a new third paragraph. ");
Assert.assertEquals(3, paragraphs.indexOf(builder.getCurrentParagraph()));