Das Inhaltsverzeichnis (TOC) ist ein wichtiger Bestandteil eines Word Dokuments. Es bietet einen Überblick über den Inhalt des Dokuments und ermöglicht Ihnen, schnell zum gewünschten Abschnitt zu navigieren. Möglicherweise befinden Sie sich in Situationen, in denen Sie das Inhaltsverzeichnis programmgesteuert aus Word Dokumenten hinzufügen, extrahieren, aktualisieren oder entfernen müssen. Zu diesem Zweck lernen Sie in diesem Artikel, wie Sie mit dem Inhaltsverzeichnis in Word Dateien mit C++ arbeiten.
- C++-API zum Arbeiten mit Inhaltsverzeichnissen in Word Dokumenten
- Fügen Sie das Inhaltsverzeichnis in ein Word Dokument ein
- Extrahieren Sie das Inhaltsverzeichnis aus einem Word Dokument
- Aktualisieren Sie das Inhaltsverzeichnis in einem Word Dokument
- Entfernen Sie das Inhaltsverzeichnis aus einem Word Dokument
C++-API zum Arbeiten mit Inhaltsverzeichnissen in Word Dokumenten
Aspose.Words for C++ ist eine native C++ Bibliothek, mit der Sie Microsoft Word Dokumente erstellen, lesen, ändern und konvertieren können. Darüber hinaus unterstützt es auch das Arbeiten mit dem Inhaltsverzeichnis in Word Dateien. Sie können die API entweder über NuGet installieren oder direkt aus dem Abschnitt Downloads herunterladen.
PM> Install-Package Aspose.Words.Cpp
Fügen Sie das Inhaltsverzeichnis in ein Word Dokument ein
Im Folgenden finden Sie die Schritte zum Hinzufügen eines Inhaltsverzeichnisses zu einem Word Dokument.
- Laden Sie die Word Datei mit der Klasse Document.
- Erstellen Sie mithilfe des zuvor erstellten Objekts Document eine Instanz der Klasse DocumentBuilder.
- Fügen Sie das Inhaltsverzeichnis mit der methode DocumentBuilder->InsertTableOfContents(System::String switchs) ein.
- Füllen Sie das Inhaltsverzeichnis mit der methode Document->UpdateFields() aus.
- Speichern Sie das Word Dokument mit der methode Document->Save(System::String fileName).
Der folgende Beispielcode zeigt, wie Sie mit C++ ein Inhaltsverzeichnis in ein Word Dokument einfügen.
// Quell und Ausgabeverzeichnispfade.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// Laden Sie die Word Datei
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"Sample 5.docx");
// Erstellen Sie eine Instanz der DocumentBuilder Klasse
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);
// Fügen Sie am Anfang des Dokuments ein Inhaltsverzeichnis ein.
builder->InsertTableOfContents(u"\\o \"1-3\" \\h \\z \\u");
// Das neu eingefügte Inhaltsverzeichnis ist zunächst leer.
// Es muss ausgefüllt werden, indem die Felder im Dokument aktualisiert werden.
doc->UpdateFields();
// Pfad der Ausgabedatei
System::String outputPath = outputDataDir + u"AddTOC.docx";
// Speichern Sie die Word Datei
doc->Save(outputPath);
Extrahieren Sie das Inhaltsverzeichnis aus einem Word Dokument
Im Folgenden finden Sie die Schritte zum Extrahieren des Inhaltsverzeichnisses aus einem Word Dokument.
- Laden Sie die Word Datei mit der Klasse Document.
- Rufen Sie die Felder mit der methode Document->getRange()->getFields() ab und durchlaufen Sie sie.
- Prüfen Sie, ob das Feld vom Typ FieldType::FieldHyperlink ist.
- Überprüfen Sie, ob das Feld zum Inhaltsverzeichnis gehört.
- Abrufen und Drucken der Feldinformationen.
Der folgende Beispielcode veranschaulicht, wie das Inhaltsverzeichnis mithilfe von C++ aus einem Word Dokument extrahiert wird.
// Quellenverzeichnis
System::String inputDataDir = u"SourceDirectory\\";
// Laden Sie die Word Datei
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleTOC.docx");
// Schleife durch die Felder
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
// Holen Sie sich FieldHyperlink-Felder
if (field->get_Type() == FieldType::FieldHyperlink)
{
System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);
// Überprüfen Sie, ob das Feld zum Inhaltsverzeichnis gehört
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());
// Rufen Sie den Speicherort ab, auf den dieses Inhaltsverzeichniselement zeigt
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;
}
}
}
}
Aktualisieren Sie das Inhaltsverzeichnis in einem Word Dokument
Wenn der Inhalt des Dokuments aktualisiert wurde und Sie diese Änderungen im Inhaltsverzeichnis widerspiegeln müssen, müssen Sie einfach die Word Datei laden und die Methode Document->UpdateFields() aufrufen. Diese Methode aktualisiert das Inhaltsverzeichnis gemäß dem geänderten Inhalt. Speichern Sie danach das aktualisierte Word Dokument.
Entfernen Sie das Inhaltsverzeichnis aus einem Word Dokument
Im Folgenden sind die Schritte zum Entfernen des Inhaltsverzeichnisses aus einem Word Dokument aufgeführt.
- Laden Sie die Word Datei mit der Klasse Document.
- Rufen Sie eine Liste der FieldStart-Knoten ab und speichern Sie sie.
- Durchlaufen Sie die Knoten, bis Sie den Knoten vom Typ NodeType::FieldEnd erreichen, der das Ende des Inhaltsverzeichnisses bezeichnet.
- Entfernen Sie das Inhaltsverzeichnis mit der methode Node->Remove().
- Speichern Sie das Word Dokument mit der methode Document->Save(System::String fileName).
Der folgende Beispielcode zeigt, wie das Inhaltsverzeichnis mithilfe von C++ aus einem Word Dokument entfernt wird.
void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
// Speichern Sie die FieldStart-Knoten von TOC-Feldern im Dokument für einen schnellen Zugriff.
std::vector<System::SharedPtr<FieldStart>> fieldStarts;
// Dies ist eine Liste zum Speichern der Knoten, die innerhalb des angegebenen Inhaltsverzeichnisses gefunden werden. Sie werden entfernt
// am Ende dieser Methode.
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)
{
// Fügen Sie alle FieldStarts hinzu, die vom Typ FieldTOC sind.
fieldStarts.push_back(start);
}
}
// Stellen Sie sicher, dass das vom übergebenen Index angegebene Inhaltsverzeichnis vorhanden ist.
if (index > fieldStarts.size() - 1)
{
throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
}
bool isRemoving = true;
// Holen Sie sich den FieldStart des angegebenen Inhaltsverzeichnisses.
System::SharedPtr<Node> currentNode = fieldStarts[index];
while (isRemoving)
{
// Es ist sicherer, diese Knoten zu speichern und später alle auf einmal zu löschen.
nodeList.push_back(currentNode);
currentNode = currentNode->NextPreOrder(doc);
// Sobald wir auf einen FieldEnd-Knoten vom Typ FieldTOC stoßen, wissen wir, dass wir am Ende sind
// des aktuellen Inhaltsverzeichnisses und wir können hier aufhören.
if (currentNode->get_NodeType() == NodeType::FieldEnd)
{
System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
{
isRemoving = false;
}
}
}
// Entfernt alle im angegebenen Inhaltsverzeichnis gefundenen Knoten.
for (System::SharedPtr<Node> node : nodeList)
{
node->Remove();
}
}
int main()
{
// Quell und Ausgabeverzeichnispfade.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// Öffnen Sie ein Word Dokument
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"SampleTOC.docx");
// Entfernen Sie das erste Inhaltsverzeichnis aus dem Dokument.
RemoveTableOfContents(doc, 0);
// Pfad der Ausgabedatei
System::String outputPath = outputDataDir + u"RemoveTOC.docx";
// Speichern Sie die Word Datei
doc->Save(outputPath);
}
Holen Sie sich eine kostenlose Lizenz
Sie können die API ohne Evaluierungseinschränkungen testen, indem Sie eine kostenlose temporäre Lizenz anfordern.
Fazit
In diesem Artikel haben Sie gelernt, wie Sie mit C++ mit dem Inhaltsverzeichnis in Word Dokumenten arbeiten. Sie haben die Schritte und den Beispielcode gesehen, die zum Hinzufügen, Extrahieren, Aktualisieren und Entfernen des Inhaltsverzeichnisses aus Word Dokumenten erforderlich sind. Aspose.Words for C++ bietet viele zusätzliche Funktionen für die Arbeit mit Word Dateien. Sie können die API im Detail erkunden, indem Sie die offizielle Dokumentation besuchen. Bei Fragen können Sie uns gerne in unserem kostenlosen Support-Forum erreichen.