Lavorare con i segnalibri

I segnalibri identificano in un documento Microsoft Word le posizioni o i frammenti che nomini e identifichi per riferimento futuro. Ad esempio, potresti utilizzare un segnalibro per identificare il testo che desideri rivedere in seguito. Invece di scorrere il documento per individuare il testo, puoi accedervi utilizzando la finestra di dialogo Segnalibro.

Le azioni che possono essere eseguite con i segnalibri utilizzando Aspose.Words sono le stesse che puoi eseguire utilizzando Microsoft Word. È possibile inserire un nuovo segnalibro, eliminare, spostarsi in un segnalibro, ottenere o impostare il nome di un segnalibro, ottenere o impostare il testo racchiuso al suo interno.

Inserisci un segnalibro

Utilizza 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 estendersi su qualsiasi intervallo. I segnalibri formati in modo errato o i segnalibri con nomi duplicati verranno ignorati quando il documento viene salvato.

L’esempio di codice seguente mostra come creare un nuovo segnalibro:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithBookmarks();
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.StartBookmark("My Bookmark");
builder.Writeln("Text inside a bookmark.");
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.OutlineOptions.BookmarksOutlineLevels.Add("My Bookmark", 1);
options.OutlineOptions.BookmarksOutlineLevels.Add("Nested Bookmark", 2);
dataDir = dataDir + "Create.Bookmark_out.pdf";
doc.Save(dataDir, options);

Ottieni segnalibri

A volte è necessario ottenere una raccolta di segnalibri per scorrere i segnalibri o per altri scopi. Utilizza la proprietà Node.Range esposta da qualsiasi nodo di documento che restituisce un oggetto Range che rappresenta la parte del documento contenuta in questo nodo. Utilizzare questo oggetto per recuperare un BookmarkCollection e quindi utilizzare l’indicizzatore della 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-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithBookmarks();
Document doc = new Document(dataDir + "Bookmarks.doc");
// By index.
Bookmark bookmark1 = doc.Range.Bookmarks[0];
// By name.
Bookmark bookmark2 = doc.Range.Bookmarks["Bookmark2"];

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithBookmarks();
Document doc = new Document(dataDir + "Bookmark.doc");
// Use the indexer of the Bookmarks collection to obtain the desired bookmark.
Bookmark bookmark = doc.Range.Bookmarks["MyBookmark"];
// Get the name and text of the bookmark.
string name = bookmark.Name;
string text = bookmark.Text;
// Set the name and text of the bookmark.
bookmark.Name = "RenamedBookmark";
bookmark.Text = "This is a new bookmarked text.";

L’esempio di codice seguente 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-.NET
// Create empty document
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Table table = builder.StartTable();
// Insert a cell
builder.InsertCell();
// Start bookmark here after calling InsertCell
builder.StartBookmark("MyBookmark");
builder.Write("This is row 1 cell 1");
// Insert a cell
builder.InsertCell();
builder.Write("This is row 1 cell 2");
builder.EndRow();
// Insert a cell
builder.InsertCell();
builder.Writeln("This is row 2 cell 1");
// Insert a cell
builder.InsertCell();
builder.Writeln("This is row 2 cell 2");
builder.EndRow();
builder.EndTable();
// End of bookmark
builder.EndBookmark("MyBookmark");
dataDir = dataDir + "Bookmark.Table_out.doc";
doc.Save(dataDir);

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

Tieni presente che alcuni segnalibri nel documento sono assegnati a campi modulo. Passando a un segnalibro di questo tipo e inserendovi del testo, il testo viene inserito nel codice del campo del modulo. Sebbene ciò non invaliderà il campo del 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 con segnalibro:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// Create empty document
Document doc = new Document(dataDir + "Bookmark.Table_out.doc");
foreach (Bookmark bookmark in doc.Range.Bookmarks)
{
Console.WriteLine("Bookmark: {0}{1}", bookmark.Name, bookmark.IsColumn ? " (Column)" : "");
if (bookmark.IsColumn)
{
Row row = bookmark.BookmarkStart.GetAncestor(NodeType.Row) as Row;
if (row != null && bookmark.FirstColumn < row.Cells.Count)
Console.WriteLine(row.Cells[bookmark.FirstColumn].GetText().TrimEnd(ControlChar.CellChar));
}
}

Passare a un segnalibro

Se è necessario inserire contenuto avanzato (non solo testo semplice) in un segnalibro, è necessario utilizzare MoveToBookmark per spostare il cursore sul segnalibro e quindi utilizzare i metodi e le proprietà DocumentBuilder’s per inserire il contenuto.

Mostra Nascondi contenuto segnalibro

L’intero segnalibro (incluso il contenuto aggiunto ai segnalibri) può essere incapsulato nella parte vera del campo IF utilizzando Aspose.Words. Può succedere che il campo IF contenga un campo Unisci nidificato nell’espressione (A sinistra dell’operatore) e, a seconda del valore del Campo unisci, il campo IF mostra o nasconde il contenuto del Segnalibro nel documento di 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-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithBookmarks();
Document doc = new Document(dataDir + "Bookmarks.doc");
ShowHideBookmarkedContent(doc, "Bookmark2", false);
doc.Save(dataDir + "Updated_Document.doc");
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
public static void ShowHideBookmarkedContent(Document doc, String bookmarkName, bool showHide)
{
DocumentBuilder builder = new DocumentBuilder(doc);
Bookmark bm = doc.Range.Bookmarks[bookmarkName];
builder.MoveToDocumentEnd();
// {IF "{MERGEFIELD bookmark}" = "true" "" ""}
Field field = builder.InsertField("IF \"", null);
builder.MoveTo(field.Start.NextSibling);
builder.InsertField("MERGEFIELD " + bookmarkName + "", null);
builder.Write("\" = \"true\" ");
builder.Write("\"");
builder.Write("\"");
builder.Write(" \"\"");
Node currentNode = field.Start;
bool flag = true;
while (currentNode != null && flag)
{
if (currentNode.NodeType == NodeType.Run)
if (currentNode.ToString(SaveFormat.Text).Trim().Equals("\""))
flag = false;
Node nextNode = currentNode.NextSibling;
bm.BookmarkStart.ParentNode.InsertBefore(currentNode, bm.BookmarkStart);
currentNode = nextNode;
}
Node endNode = bm.BookmarkEnd;
flag = true;
while (currentNode != null && flag)
{
if (currentNode.NodeType == NodeType.FieldEnd)
flag = false;
Node nextNode = currentNode.NextSibling;
bm.BookmarkEnd.ParentNode.InsertAfter(currentNode, endNode);
endNode = currentNode;
currentNode = nextNode;
}
doc.MailMerge.Execute(new String[] { bookmarkName }, new Object[] { showHide });
//MailMerge can be avoided by using the following
//builder.MoveToMergeField(bookmarkName);
//builder.Write(showHide ? "true" : "false");
}