Lavorare con i segnalibri

I segnalibri identificano in un documento Microsoft Word le posizioni o i frammenti che si nominano e identificano per riferimento futuro. Ad esempio, è possibile utilizzare un segnalibro per identificare il testo che si desidera rivedere in seguito. Invece di scorrere il documento per individuare il testo, è possibile accedervi utilizzando la finestra di dialogo Segnalibro.

Con Aspose.Words, è possibile utilizzare i segnalibri in report o documenti per inserire alcuni dati nel segnalibro o applicare una formattazione speciale al suo contenuto. È inoltre possibile utilizzare i segnalibri per recuperare il testo da una determinata posizione nel documento.

Le azioni che possono essere eseguite con i segnalibri usando Aspose.Words sono le stesse che puoi eseguire usando Microsoft Word. È possibile inserire un nuovo segnalibro, eliminare, passare a un segnalibro, ottenere o impostare un nome segnalibro, ottenere o impostare il testo racchiuso in esso.

Inserisci un segnalibro

Utilizzare startBookmark e endBookmark per creare un segnalibro contrassegnandone rispettivamente l’inizio e la fine. Non dimenticare di passare lo stesso nome del segnalibro a entrambi i metodi. I segnalibri in un documento possono sovrapporsi e coprire qualsiasi intervallo. Segnalibri mal formati o segnalibri con nomi duplicati verranno ignorati quando il documento viene salvato.

Il seguente esempio di codice mostra come creare un nuovo segnalibro:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(CreateBookmark.class);
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.startBookmark("MyBookmark");
builder.writeln("Text inside a bookmark.");
builder.endBookmark("MyBookmark");
builder.startBookmark("Nested Bookmark");
builder.writeln("Text inside a NestedBookmark.");
builder.endBookmark("Nested Bookmark");
builder.writeln("Text after Nested Bookmark.");
builder.endBookmark("My Bookmark");
PdfSaveOptions options = new PdfSaveOptions();
options.getOutlineOptions().setDefaultBookmarksOutlineLevel(1);
options.getOutlineOptions().setDefaultBookmarksOutlineLevel(2);
doc.save(dataDir + "output.pdf", options);
System.out.println("\nBookmark created successfully.");

Ottenere segnalibri

A volte è necessario ottenere una raccolta di segnalibri per scorrere i segnalibri o per altri scopi. Utilizzare la proprietà Node.getRange esposta da qualsiasi nodo documento che restituisce un oggetto Range che rappresenta la porzione del documento contenuta in questo nodo. Utilizzare questo oggetto per recuperare un BookmarkCollection e quindi utilizzare l’indicizzatore di raccolta per ottenere un segnalibro specifico.

L’esempio di codice seguente mostra come ottenere segnalibri da una raccolta di segnalibri:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(AccessBookmarks.class);
Document doc = new Document(dataDir + "Bookmark.doc");
Bookmark bookmark1 = doc.getRange().getBookmarks().get(0);
Bookmark bookmark = doc.getRange().getBookmarks().get("MyBookmark");
doc.save(dataDir + "output.doc");
System.out.println("\nTable bookmarked successfully.\nFile saved at " + dataDir);

L’esempio di codice seguente mostra come ottenere o impostare un nome e un testo del segnalibro:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(BookmarkNameAndText.class);
Document doc = new Document(dataDir + "Bookmark.doc");
// Use the indexer of the Bookmarks collection to obtain the desired bookmark.
Bookmark bookmark = doc.getRange().getBookmarks().get("MyBookmark");
// Get the name and text of the bookmark.
String name = bookmark.getName();
String text = bookmark.getText();
// Set the name and text of the bookmark.
bookmark.setName("RenamedBookmark");
bookmark.setText("This is a new bookmarked text.");
System.out.println("\nBookmark name and text set successfully.");

Il seguente esempio di codice mostra come aggiungere un segnalibro a una tabella:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
//Create empty document
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// We call this method to start building the table.
builder.startTable();
builder.insertCell();
// Start bookmark here after calling InsertCell
builder.startBookmark("MyBookmark");
builder.write("Row 1, Cell 1 Content.");
// Build the second cell
builder.insertCell();
builder.write("Row 1, Cell 2 Content.");
// Call the following method to end the row and start a new row.
builder.endRow();
// Build the first cell of the second row.
builder.insertCell();
builder.write("Row 2, Cell 1 Content");
// Build the second cell.
builder.insertCell();
builder.write("Row 2, Cell 2 Content.");
builder.endRow();
// Signal that we have finished building the table.
builder.endTable();
//End of bookmark
builder.endBookmark("MyBookmark");
doc.save(dataDir + "output.doc");
System.out.println("\nTable bookmarked successfully.\nFile saved at " + dataDir);

Se si modifica il nome di un segnalibro in un nome già esistente nel documento, non verrà generato alcun errore e verrà memorizzato solo il primo segnalibro quando si salva il documento.

Si noti che alcuni segnalibri nel documento sono assegnati ai campi modulo. Passando a tale segnalibro e inserendo il testo, il testo viene inserito nel codice del campo del modulo. Anche se questo non invaliderà il campo modulo, il testo inserito non sarà visibile perché diventa parte del codice del campo.

L’esempio di codice seguente mostra come accedere alle colonne della tabella contrassegnata con segnalibri:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Create empty document
Document doc = new Document(dataDir + "Bookmark.Table_out.doc");
for (Bookmark bookmark : doc.getRange().getBookmarks())
{
System.out.printf("Bookmark: {0}{1}", bookmark.getName(), bookmark.isColumn() ? " (Column)" : "");
if (bookmark.isColumn())
{
Row row = (Row) bookmark.getBookmarkStart().getAncestor(NodeType.ROW);
if (row != null && bookmark.getFirstColumn() < row.getCells().getCount())
System.out.print(row.getCells().get(bookmark.getFirstColumn()).getText());
}
}

Passare a un segnalibro

Se è necessario inserire contenuti ricchi (non solo testo normale) in un segnalibro, è necessario utilizzare moveToBookmark per spostare il cursore sul segnalibro e quindi utilizzare i metodi e le proprietà DocumentBuilder per inserire il contenuto.

Mostra Nascondi contenuto segnalibro

L’intero segnalibro (including the bookmarked content) può essere incapsulato all’interno della parte Vera del campo IF usando Aspose.Words. Può essere in modo tale che il campoIF contenga un campo Unione nidificato nell’espressione (Left of Operator) e, a seconda del valore del campo Unione, il campo IF mostra o nasconde il contenuto del segnalibro nel documento Word.

Il seguente esempio di codice mostra come mostrare / nascondere i segnalibri.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(ShowHideBookmarks.class);
Document doc = new Document(dataDir + "Bookmark.doc");
showHideBookmarkedContent(doc,"MyBookmark",false);
doc.save(dataDir + "Updated_Document.docx");
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
public static void showHideBookmarkedContent(Document doc, String bookmarkName, boolean showHide) throws Exception {
DocumentBuilder builder = new DocumentBuilder(doc);
Bookmark bm = doc.getRange().getBookmarks().get(bookmarkName);
builder.moveToDocumentEnd();
// {IF "{MERGEFIELD bookmark}" = "true" "" ""}
Field field = builder.insertField("IF \"", null);
builder.moveTo(field.getStart().getNextSibling().getNextSibling());
builder.insertField("MERGEFIELD " + bookmarkName + "", null);
builder.write("\" = \"true\" ");
builder.write("\"");
builder.write("\"");
builder.write(" \"\"");
Node currentNode = field.getStart();
boolean flag = true;
while (currentNode != null && flag) {
if (currentNode.getNodeType() == NodeType.RUN)
if (currentNode.toString(SaveFormat.TEXT).trim().equals("\""))
flag = false;
Node nextNode = currentNode.getNextSibling();
bm.getBookmarkStart().getParentNode().insertBefore(currentNode, bm.getBookmarkStart());
currentNode = nextNode;
}
Node endNode = bm.getBookmarkEnd();
flag = true;
while (currentNode != null && flag) {
if (currentNode.getNodeType() == NodeType.FIELD_END)
flag = false;
Node nextNode = currentNode.getNextSibling();
bm.getBookmarkEnd().getParentNode().insertAfter(currentNode, endNode);
endNode = currentNode;
currentNode = nextNode;
}
doc.getMailMerge().execute(new String[]{bookmarkName}, new Object[]{showHide});
//In case, you do not want to use MailMerge then you may use the following lines of code.
//builder.moveToMergeField(bookmarkName);
//builder.write(showHide ? "true" : "false");
}