La table des matières (TOC) est une partie importante d’un document Word. Il fournit un aperçu du contenu du document et vous permet de naviguer rapidement vers la section souhaitée. Vous pouvez vous retrouver dans des scénarios où vous devez ajouter, extraire, mettre à jour ou supprimer la table des matières des documents Word par programmation. À cette fin, cet article vous apprendra à utiliser la table des matières dans les fichiers Word à l’aide de C++.

API C++ pour travailler avec la table des matières dans les documents Word

Aspose.Words for C++ est une bibliothèque C++ native qui vous permet de créer, lire, modifier et convertir des documents Microsoft Word. En outre, il prend également en charge le travail avec la table des matières dans les fichiers Word. Vous pouvez soit installer l’API via NuGet ou la télécharger directement à partir de la section Téléchargements.

PM> Install-Package Aspose.Words.Cpp

Ajouter la table des matières dans un document Word

Voici les étapes pour ajouter une table des matières dans un document Word.

L’exemple de code suivant montre comment ajouter une table des matières dans un document Word à l’aide de C++.

// Chemins des répertoires source et de sortie.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";

// Charger le fichier Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"Sample 5.docx");

// Créer une instance de la classe DocumentBuilder
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);

// Insérer une table des matières au début du document.
builder->InsertTableOfContents(u"\\o \"1-3\" \\h \\z \\u");

// La table des matières nouvellement insérée sera initialement vide.
// Il doit être rempli en mettant à jour les champs du document.
doc->UpdateFields();

// Chemin du fichier de sortie
System::String outputPath = outputDataDir + u"AddTOC.docx";

// Enregistrez le fichier Word
doc->Save(outputPath);
Fichier Word de sortie contenant la table des matières

Fichier Word de sortie contenant la table des matières

Extraire la table des matières d’un document Word

Voici les étapes pour extraire la table des matières d’un document Word.

  • Chargez le fichier Word à l’aide de la classe Document.
  • Récupérez les champs à l’aide de la méthode Document->getRange()->getFields() et faites une boucle dessus.
  • Vérifiez si le champ est du type FieldType::FieldHyperlink.
  • Vérifiez si le champ appartient à la table des matières.
  • Récupérez et imprimez les informations du champ.

L’exemple de code suivant montre comment extraire la table des matières d’un document Word à l’aide de C++.

// Répertoire source
System::String inputDataDir = u"SourceDirectory\\";

// Charger le fichier Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleTOC.docx");

// Boucle à travers les champs
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
	// Obtenir les champs FieldHyperlink
	if (field->get_Type() == FieldType::FieldHyperlink)
	{
		System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);

		// Vérifier si le champ appartient à 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());

				// Obtenir l'emplacement vers lequel cet élément de la table des matières pointe
				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;
			}
		}
	}
}

Mettre à jour la table des matières dans un document Word

Si le contenu du document a été mis à jour et que vous devez refléter ces modifications dans la table des matières, il vous suffit de charger le fichier Word et d’appeler la méthode Document->UpdateFields(). Cette méthode mettra à jour la table des matières en fonction du contenu modifié. Après cela, enregistrez le document Word mis à jour.

Supprimer la table des matières d’un document Word

Voici les étapes pour supprimer la table des matières d’un document Word.

L’exemple de code suivant montre comment supprimer la table des matières d’un document Word à l’aide de C++.

void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
	// Stockez les nœuds FieldStart des champs TOC dans le document pour un accès rapide.
	std::vector<System::SharedPtr<FieldStart>> fieldStarts;
	// Il s'agit d'une liste pour stocker les nœuds trouvés dans la table des matières spécifiée. Ils seront supprimés
	// à la fin de cette méthode.
	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)
		{
			// Ajoutez tous les FieldStarts qui sont de type FieldTOC.
			fieldStarts.push_back(start);
		}
	}

	// Assurez-vous que la table des matières spécifiée par l'index transmis existe.
	if (index > fieldStarts.size() - 1)
	{
		throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
	}

	bool isRemoving = true;

	// Obtenez le FieldStart de la table des matières spécifiée.
	System::SharedPtr<Node> currentNode = fieldStarts[index];

	while (isRemoving)
	{
		// Il est plus sûr de stocker ces nœuds et de les supprimer tous en même temps plus tard.
		nodeList.push_back(currentNode);
		currentNode = currentNode->NextPreOrder(doc);

		// Une fois que nous rencontrons un nœud FieldEnd de type FieldTOC, nous savons que nous sommes à la fin
		// de la table des matières actuelle et nous pouvons nous arrêter ici.
		if (currentNode->get_NodeType() == NodeType::FieldEnd)
		{
			System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
			if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
			{
				isRemoving = false;
			}
		}
	}

	// Supprimez tous les nœuds trouvés dans la table des matières spécifiée.
	for (System::SharedPtr<Node> node : nodeList)
	{
		node->Remove();
	}
}

int main()
{
	// Chemins des répertoires source et de sortie.
	System::String sourceDataDir = u"SourceDirectory\\";
	System::String outputDataDir = u"OutputDirectory\\";

	// Ouvrir un document Word
	System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"SampleTOC.docx");

	// Supprimez la première table des matières du document.
	RemoveTableOfContents(doc, 0);

	// Chemin du fichier de sortie
	System::String outputPath = outputDataDir + u"RemoveTOC.docx";

	// Enregistrez le fichier Word
	doc->Save(outputPath);
}

Obtenez une licence gratuite

Vous pouvez essayer l’API sans limitation d’évaluation en demandant une licence temporaire gratuite.

Conclusion

Dans cet article, vous avez appris à utiliser la table des matières dans les documents Word à l’aide de C++. Vous avez vu les étapes et l’exemple de code requis pour ajouter, extraire, mettre à jour et supprimer la table des matières des documents Word. Aspose.Words for C++ fournit de nombreuses fonctionnalités supplémentaires pour travailler avec des fichiers Word. Vous pouvez explorer l’API en détail en visitant la documentation officielle. En cas de questions, n’hésitez pas à nous contacter sur notre forum d’assistance gratuit.

Voir également