Оглавление (TOC) является важной частью документа Word. Он обеспечивает обзор содержимого документа и позволяет быстро перейти к нужному разделу. Вы можете столкнуться с ситуациями, когда вам нужно программно добавлять, извлекать, обновлять или удалять оглавление из документов Word. С этой целью эта статья научит вас работать с оглавлением в файлах Word с помощью C++.
- C++ API для работы с оглавлением в документах Word
- Добавить оглавление в документ Word
- Извлечь оглавление из документа Word
- Обновить оглавление в документе Word
- Удалить оглавление из документа Word
C++ API для работы с оглавлением в документах Word
Aspose.Words for C++ — это собственная библиотека C++, позволяющая создавать, читать, изменять и преобразовывать документы Microsoft Word. Кроме того, он также поддерживает работу с оглавлением в файлах Word. Вы можете либо установить API через NuGet, либо загрузить его напрямую из раздела Загрузки.
PM> Install-Package Aspose.Words.Cpp
Добавить оглавление в документ Word
Ниже приведены шаги для добавления оглавления в документ Word.
- Загрузите файл Word, используя класс Document.
- Создайте экземпляр класса DocumentBuilder, используя ранее созданный объект Document.
- Вставьте оглавление с помощью метода DocumentBuilder->InsertTableOfContents(System::String Switches).
- Заполните оглавление с помощью метода Document->UpdateFields().
- Сохраните документ Word, используя метод Документ->Сохранить(System::String fileName).
В следующем примере кода показано, как добавить оглавление в документ Word с помощью C++.
// Пути к исходному и выходному каталогу.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// Загрузите файл Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"Sample 5.docx");
// Создайте экземпляр класса DocumentBuilder
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);
// Вставьте оглавление в начале документа.
builder->InsertTableOfContents(u"\\o \"1-3\" \\h \\z \\u");
// Вновь вставленное оглавление изначально будет пустым.
// Его необходимо заполнить, обновив поля в документе.
doc->UpdateFields();
// Путь к выходному файлу
System::String outputPath = outputDataDir + u"AddTOC.docx";
// Сохраните файл Word
doc->Save(outputPath);
Извлечь оглавление из документа Word
Ниже приведены шаги для извлечения оглавления из документа Word.
- Загрузите файл Word, используя класс Document.
- Получите поля с помощью метода Document->get_Range()->get_Fields() и выполните цикл по ним.
- Проверьте, имеет ли поле тип FieldType::FieldHyperlink.
- Проверьте, принадлежит ли поле оглавлению.
- Получите и распечатайте информацию о поле.
В следующем примере кода показано, как извлечь оглавление из документа Word с помощью C++.
// Исходный каталог
System::String inputDataDir = u"SourceDirectory\\";
// Загрузите файл Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleTOC.docx");
// Пройтись по полям
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
// Получить поля FieldHyperlink
if (field->get_Type() == FieldType::FieldHyperlink)
{
System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);
// Проверить, принадлежит ли поле оглавлению
if (hyperlink->get_SubAddress() != nullptr && hyperlink->get_SubAddress().StartsWith(u"_Toc"))
{
System::SharedPtr<Paragraph> tocItem = System::DynamicCast<Paragraph>(field->get_FieldStart()->GetAncestor(NodeType::Paragraph));
std::cout << System::StaticCast<Node>(tocItem)->ToString(SaveFormat::Text).Trim().ToUtf8String() << std::endl;
std::cout << "------------------" << std::endl;
if (tocItem != nullptr)
{
System::SharedPtr<Bookmark> bm = doc->get_Range()->get_Bookmarks()->idx_get(hyperlink->get_SubAddress());
// Получить местоположение, на которое указывает этот элемент TOC
System::SharedPtr<Paragraph> pointer = System::DynamicCast<Paragraph>(bm->get_BookmarkStart()->GetAncestor(NodeType::Paragraph));
std::cout << System::StaticCast<Node>(pointer)->ToString(SaveFormat::Text).ToUtf8String() << std::endl;
}
}
}
}
Обновить оглавление в документе Word
Если содержимое документа было обновлено и вам необходимо отразить эти изменения в оглавлении, вам просто нужно загрузить файл Word и вызвать метод Document->UpdateFields(). Этот метод обновит оглавление в соответствии с измененным содержимым. После этого сохраните обновленный документ Word.
Удалить оглавление из документа Word
Ниже приведены шаги по удалению оглавления из документа Word.
- Загрузите файл Word, используя класс Document.
- Получите и сохраните список узлов FieldStart.
- Перебирайте узлы, пока не достигнете узла типа NodeType::FieldEnd, обозначающего конец оглавления.
- Удалите оглавление с помощью метода Node->Remove().
- Сохраните документ Word, используя метод Документ->Сохранить(System::String fileName).
В следующем примере кода показано, как удалить оглавление из документа Word с помощью C++.
void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
// Сохраните узлы FieldStart полей TOC в документе для быстрого доступа.
std::vector<System::SharedPtr<FieldStart>> fieldStarts;
// Это список для хранения узлов, найденных внутри указанного TOC. они будут удалены
// в конце этого метода.
std::vector<System::SharedPtr<Node>> nodeList;
for (System::SharedPtr<FieldStart> start : System::IterateOver<System::SharedPtr<FieldStart>>(doc->GetChildNodes(NodeType::FieldStart, true)))
{
if (start->get_FieldType() == FieldType::FieldTOC)
{
// Добавьте все FieldStarts типа FieldTOC.
fieldStarts.push_back(start);
}
}
// Убедитесь, что оглавление, указанное переданным индексом, существует.
if (index > fieldStarts.size() - 1)
{
throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
}
bool isRemoving = true;
// Получите FieldStart указанного TOC.
System::SharedPtr<Node> currentNode = fieldStarts[index];
while (isRemoving)
{
// Безопаснее хранить эти узлы и потом удалить их все сразу.
nodeList.push_back(currentNode);
currentNode = currentNode->NextPreOrder(doc);
// Как только мы встречаем узел FieldEnd типа FieldTOC, мы знаем, что находимся в конце.
// текущей TOC, и мы можем остановиться здесь.
if (currentNode->get_NodeType() == NodeType::FieldEnd)
{
System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
{
isRemoving = false;
}
}
}
// Удалить все узлы, найденные в указанном TOC.
for (System::SharedPtr<Node> node : nodeList)
{
node->Remove();
}
}
int main()
{
// Пути к исходному и выходному каталогу.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// Откройте документ Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"SampleTOC.docx");
// Удалите первое оглавление из документа.
RemoveTableOfContents(doc, 0);
// Путь к выходному файлу
System::String outputPath = outputDataDir + u"RemoveTOC.docx";
// Сохраните файл Word
doc->Save(outputPath);
}
Получить бесплатную лицензию
Вы можете попробовать API без ограничений по ознакомительной версии, запросив бесплатную временную лицензию.
Вывод
В этой статье вы узнали, как работать с оглавлением в документах Word с помощью C++. Вы видели шаги и пример кода, необходимые для добавления, извлечения, обновления и удаления оглавления из документов Word. Aspose.Words для C++ предоставляет множество дополнительных возможностей для работы с файлами Word. Вы можете подробно изучить API, посетив официальную документацию. Если у вас возникнут вопросы, свяжитесь с нами на нашем бесплатном форуме поддержки.