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

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.

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);
Ausgabe einer Word Datei mit dem Inhaltsverzeichnis

Ausgabe einer Word Datei mit dem Inhaltsverzeichnis

Extrahieren Sie das Inhaltsverzeichnis aus einem Word Dokument

Im Folgenden finden Sie die Schritte zum Extrahieren des Inhaltsverzeichnisses aus einem Word Dokument.

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.

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.

Siehe auch