Работа с закладками
Закладки определяют места или фрагменты документа Microsoft Word, которые вы указываете и определяете для дальнейшего использования. Например, вы можете использовать закладку для определения текста, который хотите просмотреть позже. Вместо того чтобы прокручивать документ в поисках нужного текста, вы можете перейти к нему с помощью диалогового окна “Закладки”.
Действия, которые можно выполнить с закладками с помощью Aspose.Words, аналогичны тем, которые вы можете выполнить с помощью Microsoft Word. Вы можете вставить новую закладку, удалить, переместить в закладку, получить или задать название закладки, получить или задать текст, заключенный в ней. С помощью Aspose.Words вы также можете использовать закладки в отчетах или документах, чтобы вставить в них некоторые данные или применить специальное форматирование к их содержимому. Вы также можете использовать закладки для извлечения текста из определенного места в вашем документе.
Вставить закладку
Используйте StartBookmark и EndBookmark для создания закладки, отметив ее начало и конец соответственно. Не забудьте указать одинаковое имя закладки в обоих методах. Закладки в документе могут перекрываться и охватывать любой диапазон. Неправильно оформленные закладки или закладки с повторяющимися названиями будут проигнорированы при сохранении документа.
В следующем примере кода показано, как создать новую закладку:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
// The path to the documents directory. | |
System::String outputDataDir = GetOutputDataDir_WorkingWithBookmarks(); | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
builder->StartBookmark(u"My Bookmark"); | |
builder->Writeln(u"Text inside a bookmark."); | |
builder->StartBookmark(u"Nested Bookmark"); | |
builder->Writeln(u"Text inside a NestedBookmark."); | |
builder->EndBookmark(u"Nested Bookmark"); | |
builder->Writeln(u"Text after Nested Bookmark."); | |
builder->EndBookmark(u"My Bookmark"); | |
System::SharedPtr<PdfSaveOptions> options = System::MakeObject<PdfSaveOptions>(); | |
options->get_OutlineOptions()->get_BookmarksOutlineLevels()->Add(u"My Bookmark", 1); | |
options->get_OutlineOptions()->get_BookmarksOutlineLevels()->Add(u"Nested Bookmark", 2); | |
System::String outputPath = outputDataDir + u"CreateBookmark.pdf"; | |
doc->Save(outputPath, options); |
Получать закладки
Иногда необходимо получить коллекцию закладок для перебора закладок или для других целей. Используйте свойство Node.Range, предоставляемое любым узлом документа, которое возвращает объект Range, представляющий часть документа, содержащуюся в этом узле. Используйте этот объект для извлечения BookmarkCollection, а затем используйте индексатор коллекции, чтобы получить определенную закладку.
В следующем примере кода показано, как получить закладки из коллекции закладок:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
// The path to the documents directory. | |
System::String inputDataDir = GetInputDataDir_WorkingWithBookmarks(); | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"Bookmarks.doc"); | |
// By index. | |
System::SharedPtr<Bookmark> bookmark1 = doc->get_Range()->get_Bookmarks()->idx_get(0); | |
// By name. | |
System::SharedPtr<Bookmark> bookmark2 = doc->get_Range()->get_Bookmarks()->idx_get(u"Bookmark2"); |
В следующем примере кода показано, как получить или задать название закладки и текст:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
// The path to the documents directory. | |
System::String inputDataDir = GetInputDataDir_WorkingWithBookmarks(); | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"Bookmark.doc"); | |
// Use the indexer of the Bookmarks collection to obtain the desired bookmark. | |
System::SharedPtr<Bookmark> bookmark = doc->get_Range()->get_Bookmarks()->idx_get(u"MyBookmark"); | |
// Get the name and text of the bookmark. | |
System::String name = bookmark->get_Name(); | |
System::String text = bookmark->get_Text(); | |
// Set the name and text of the bookmark. | |
bookmark->set_Name(u"RenamedBookmark"); | |
bookmark->set_Text(u"This is a new bookmarked text."); |
В следующем примере кода показано, как добавить таблицу в закладки:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
// Create empty document | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
System::SharedPtr<Table> table = builder->StartTable(); | |
// Insert a cell | |
builder->InsertCell(); | |
// Start bookmark here after calling InsertCell | |
builder->StartBookmark(u"MyBookmark"); | |
builder->Write(u"This is row 1 cell 1"); | |
// Insert a cell | |
builder->InsertCell(); | |
builder->Write(u"This is row 1 cell 2"); | |
builder->EndRow(); | |
// Insert a cell | |
builder->InsertCell(); | |
builder->Writeln(u"This is row 2 cell 1"); | |
// Insert a cell | |
builder->InsertCell(); | |
builder->Writeln(u"This is row 2 cell 2"); | |
builder->EndRow(); | |
builder->EndTable(); | |
// End of bookmark | |
builder->EndBookmark(u"MyBookmark"); | |
System::String outputPath = outputDataDir + u"BookmarkTable.doc"; | |
doc->Save(outputPath); |
Если вы измените название закладки на имя, которое уже существует в документе, ошибка сгенерирована не будет, и при сохранении документа будет сохранена только первая закладка.
Перейти к закладке
Если вам нужно вставить расширенный контент (а не просто обычный текст) в закладку, вы должны использовать MoveToBookmark для перемещения курсора на закладку, а затем использовать методы и свойства DocumentBuilder’s для вставки содержимого.
Показывать и скрывать содержимое закладок
Вся закладка (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-C | |
typedef System::SharedPtr<System::Object> TObjectPtr; | |
System::String bookmarkName = u"Bookmark2"; | |
// The path to the documents directory. | |
System::String inputDataDir = GetInputDataDir_WorkingWithBookmarks(); | |
System::String outputDataDir = GetOutputDataDir_WorkingWithBookmarks(); | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"Bookmarks.doc"); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
System::SharedPtr<Bookmark> bm = doc->get_Range()->get_Bookmarks()->idx_get(bookmarkName); | |
builder->MoveToDocumentEnd(); | |
// {IF "{MERGEFIELD bookmark}" = "true" "" ""} | |
System::SharedPtr<Field> field = builder->InsertField(u"IF \"", nullptr); | |
builder->MoveTo(field->get_FieldStart()->get_NextSibling()); | |
builder->InsertField(System::String(u"MERGEFIELD ") + bookmarkName + u"", nullptr); | |
builder->Write(u"\" = \"true\" "); | |
builder->Write(u"\""); | |
builder->Write(u"\""); | |
builder->Write(u" \"\""); | |
System::SharedPtr<Node> currentNode = field->get_FieldStart(); | |
bool flag = true; | |
while (currentNode != nullptr && flag) | |
{ | |
if (currentNode->get_NodeType() == Aspose::Words::NodeType::Run) | |
{ | |
if (System::ObjectExt::Equals(currentNode->ToString(Aspose::Words::SaveFormat::Text).Trim(), u"\"")) | |
{ | |
flag = false; | |
} | |
} | |
System::SharedPtr<Node> nextNode = currentNode->get_NextSibling(); | |
bm->get_BookmarkStart()->get_ParentNode()->InsertBefore(currentNode, bm->get_BookmarkStart()); | |
currentNode = nextNode; | |
} | |
System::SharedPtr<Node> endNode = bm->get_BookmarkEnd(); | |
flag = true; | |
while (currentNode != nullptr && flag) | |
{ | |
if (currentNode->get_NodeType() == Aspose::Words::NodeType::FieldEnd) | |
{ | |
flag = false; | |
} | |
System::SharedPtr<Node> nextNode = currentNode->get_NextSibling(); | |
bm->get_BookmarkEnd()->get_ParentNode()->InsertAfter(currentNode, endNode); | |
endNode = currentNode; | |
currentNode = nextNode; | |
} | |
doc->get_MailMerge()->Execute(System::MakeArray<System::String>({bookmarkName}), System::MakeArray<TObjectPtr>({System::ObjectExt::Box<bool>(false)})); | |
//MailMerge can be avoided by using the following | |
//builder.MoveToMergeField(bookmarkName); | |
//builder.Write(showHide ? "true" : "false"); | |
doc->Save(outputDataDir + u"Updated_Document_out.doc"); |