Работа с закладками
Закладки определяют в документе Microsoft Word местоположения или фрагменты, которые вы указываете и идентифицируете для дальнейшего использования. Например, вы можете использовать закладку для определения текста, который хотите просмотреть позже. Вместо того чтобы прокручивать документ в поисках нужного текста, вы можете перейти к нему с помощью диалогового окна “Закладки”.
С помощью Aspose.Words вы можете использовать закладки в отчетах или документах, чтобы вставить в них некоторые данные или применить специальное форматирование к их содержимому. Вы также можете использовать закладки для извлечения текста из определенного места в вашем документе.
Действия, которые можно выполнить с закладками с помощью Aspose.Words, аналогичны тем, которые вы можете выполнить с помощью Microsoft Word. Вы можете вставить новую закладку, удалить, переместить в закладку, получить или задать название закладки, получить или задать текст, заключенный в ней.
Вставить закладку
Используйте startBookmark и endBookmark для создания закладки, отметив ее начало и конец соответственно. Не забудьте указать одинаковое название закладки в обоих методах. Закладки в документе могут перекрываться и охватывать любой диапазон. Неправильно оформленные закладки или закладки с повторяющимися названиями будут проигнорированы при сохранении документа.
В следующем примере кода показано, как создать новую закладку:
// 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."); |
Получать закладки
Иногда необходимо получить коллекцию закладок для перебора закладок или для других целей. Используйте свойство Node.getRange, предоставляемое любым узлом документа, которое возвращает объект Range, представляющий часть документа, содержащуюся в этом узле. Используйте этот объект для извлечения BookmarkCollection, а затем используйте индексатор коллекции, чтобы получить определенную закладку.
В следующем примере кода показано, как получить закладки из коллекции закладок:
// 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); | |
В следующем примере кода показано, как получить или задать название закладки и текст:
// 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."); | |
В следующем примере кода показано, как добавить таблицу в закладки:
// 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); |
Если вы измените название закладки на имя, которое уже существует в документе, ошибка сгенерирована не будет, и при сохранении документа будет сохранена только первая закладка.
Обратите внимание, что некоторые закладки в документе назначены полям формы. При переходе к такой закладке и вставке текста в нее текст будет вставлен в код поля формы. Хотя это не приведет к аннулированию поля формы, вставленный текст не будет виден, поскольку он станет частью кода поля.
В следующем примере кода показано, как получить доступ к столбцам таблицы с закладками:
// 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()); | |
} | |
} |
Перейти к закладке
Если вам нужно вставить расширенный контент (не только обычный текст) в закладку, вы должны использовать moveToBookmark для перемещения курсора на закладку, а затем использовать DocumentBuilder методы и свойства для вставки содержимого.
Показывать и скрывать содержимое закладок
Вся закладка (including the bookmarked content) может быть заключена в истинную часть поля IF
с помощью Aspose.Words. Это может быть сделано таким образом, что поле IF
содержит вложенное поле объединения в выражении (Left of Operator), и в зависимости от значения поля объединения поле IF
отображает или скрывает содержимое закладки в документе Word.
В следующем примере кода показано, как показывать/ скрывать закладки.
// 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"); | |
} |