Innehållsförteckning (TOC) är en viktig del av ett Word-dokument. Den ger en översikt över dokumentets innehåll och låter dig snabbt navigera till önskat avsnitt. Du kan hamna i scenarier där du behöver lägga till, extrahera, uppdatera eller ta bort innehållsförteckningen från Word-dokument programmatiskt. För detta ändamål kommer den här artikeln att lära dig hur du arbetar med innehållsförteckningen i Word-filer med C++.
- C++ API för att arbeta med innehållsförteckning i Word-dokument
- Lägg till innehållsförteckningen i ett Word-dokument
- Extrahera innehållsförteckningen från ett Word-dokument
- Uppdatera innehållsförteckningen i ett Word-dokument
- Ta bort innehållsförteckningen från ett Word-dokument
C++ API för att arbeta med innehållsförteckning i Word-dokument
Aspose.Words for C++ är ett inbyggt C++-bibliotek som låter dig skapa, läsa, ändra och konvertera Microsoft Word-dokument. Dessutom stöder den också arbete med innehållsförteckningen i Word-filer. Du kan antingen installera API:t genom NuGet eller ladda ner det direkt från avsnittet Nedladdningar.
PM> Install-Package Aspose.Words.Cpp
Lägg till innehållsförteckningen i ett Word-dokument
Följande är stegen för att lägga till en innehållsförteckning i ett Word-dokument.
- Ladda Word-filen med klassen Document.
- Skapa en instans av klassen DocumentBuilder med hjälp av objektet Document som skapats tidigare.
- Infoga innehållsförteckningen med metoden DocumentBuilder->InsertTableOfContents(System::String switches).
- Fyll i innehållsförteckningen med metoden Document->UpdateFields().
- Spara Word-dokumentet med metoden Dokument->Spara(System::String filnamn).
Följande exempelkod visar hur man lägger till en innehållsförteckning i ett Word-dokument med C++.
// Käll- och utdatakatalogvägar.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// Ladda Word-filen
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"Sample 5.docx");
// Skapa en instans av klassen DocumentBuilder
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);
// Infoga en innehållsförteckning i början av dokumentet.
builder->InsertTableOfContents(u"\\o \"1-3\" \\h \\z \\u");
// Den nyligen infogade innehållsförteckningen kommer till en början att vara tom.
// Den måste fyllas i genom att uppdatera fälten i dokumentet.
doc->UpdateFields();
// Utdatafilens sökväg
System::String outputPath = outputDataDir + u"AddTOC.docx";
// Spara Word-filen
doc->Save(outputPath);
Extrahera innehållsförteckningen från ett Word-dokument
Följande är stegen för att extrahera innehållsförteckningen från ett Word-dokument.
- Ladda Word-filen med klassen Dokument.
- Hämta fälten med metoden Document->getRange()->getFields() och loop över dem.
- Kontrollera om fältet är av typen FieldType::FieldHyperlink.
- Kontrollera om fältet hör till innehållsförteckningen.
- Hämta och skriv ut fältinformationen.
Följande exempelkod visar hur man extraherar innehållsförteckningen från ett Word-dokument med C++.
// Källkatalog
System::String inputDataDir = u"SourceDirectory\\";
// Ladda Word-filen
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleTOC.docx");
// Slinga genom fälten
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
// Hämta FieldHyperlink-fält
if (field->get_Type() == FieldType::FieldHyperlink)
{
System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);
// Kontrollera om fältet tillhör TOC
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());
// Hämta platsen som den här innehållsförteckningen pekar på
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;
}
}
}
}
Uppdatera innehållsförteckningen i ett Word-dokument
Om dokumentets innehåll har uppdaterats och du behöver återspegla dessa ändringar i innehållsförteckningen behöver du helt enkelt ladda Word-filen och anropa metoden Document->UpdateFields(). Denna metod kommer att uppdatera innehållsförteckningen enligt det ändrade innehållet. Efter detta sparar du det uppdaterade Word-dokumentet.
Ta bort innehållsförteckningen från ett Word-dokument
Följande är stegen för att ta bort innehållsförteckningen från ett Word-dokument.
- Ladda Word-filen med klassen Document.
- Hämta och lagra en lista över FieldStart-noderna.
- Gå igenom noderna tills du når noden av typen NodeType::FieldEnd som anger slutet av innehållsförteckningen.
- Ta bort innehållsförteckningen med metoden Node->Remove().
- Spara Word-dokumentet med metoden Dokument->Spara(System::String filnamn).
Följande exempelkod visar hur man tar bort innehållsförteckningen från ett Word-dokument med C++.
void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
// Lagra FieldStart-noderna för innehållsförteckningsfält i dokumentet för snabb åtkomst.
std::vector<System::SharedPtr<FieldStart>> fieldStarts;
// Detta är en lista för att lagra noderna som finns i den angivna innehållsförteckningen. De kommer att tas bort
// i slutet av denna metod.
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)
{
// Lägg till alla FieldStarts som är av typen FieldTOC.
fieldStarts.push_back(start);
}
}
// Se till att innehållsförteckningen som anges av det godkända indexet finns.
if (index > fieldStarts.size() - 1)
{
throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
}
bool isRemoving = true;
// Hämta FieldStart för den angivna innehållsförteckningen.
System::SharedPtr<Node> currentNode = fieldStarts[index];
while (isRemoving)
{
// Det är säkrare att lagra dessa noder och ta bort dem alla på en gång senare.
nodeList.push_back(currentNode);
currentNode = currentNode->NextPreOrder(doc);
// När vi väl stöter på en FieldEnd-nod av typen FieldTOC vet vi att vi är i slutet
// av nuvarande innehållsförteckning och vi kan sluta här.
if (currentNode->get_NodeType() == NodeType::FieldEnd)
{
System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
{
isRemoving = false;
}
}
}
// Ta bort alla noder som finns i den angivna innehållsförteckningen.
for (System::SharedPtr<Node> node : nodeList)
{
node->Remove();
}
}
int main()
{
// Käll- och utdatakatalogsökvägar.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// Öppna ett Word-dokument
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"SampleTOC.docx");
// Ta bort den första innehållsförteckningen från dokumentet.
RemoveTableOfContents(doc, 0);
// Utdatafilens sökväg
System::String outputPath = outputDataDir + u"RemoveTOC.docx";
// Spara Word-filen
doc->Save(outputPath);
}
Skaffa en gratis licens
Du kan prova API:et utan utvärderingsbegränsningar genom att begära en gratis tillfällig licens.
Slutsats
I den här artikeln har du lärt dig hur du arbetar med innehållsförteckningen i Word-dokument med C++. Du har sett stegen och exempelkoden som krävs för att lägga till, extrahera, uppdatera och ta bort innehållsförteckningen från Word-dokument. Aspose.Words för C++ tillhandahåller många ytterligare funktioner för att arbeta med Word-filer. Du kan utforska API:et i detalj genom att besöka den officiella dokumentationen. Om du har några frågor är du välkommen att kontakta oss på vårt gratis supportforum.