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
- Ajouter la table des matières dans un document Word
- Extraire la table des matières d’un document Word
- Mettre à jour la table des matières dans un document Word
- Supprimer la table des matières d’un document Word
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.
- Chargez le fichier Word à l’aide de la classe Document.
- Créez une instance de la classe DocumentBuilder à l’aide de l’objet Document créé précédemment.
- Insérez la table des matières à l’aide de la méthode DocumentBuilder->InsertTableOfContents(System::String switchs).
- Remplissez la table des matières à l’aide de la méthode Document->UpdateFields().
- Enregistrez le document Word en utilisant la méthode Document->Save(System::String fileName).
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);
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.
- Chargez le fichier Word à l’aide de la classe Document.
- Récupérez et stockez une liste des nœuds FieldStart.
- Parcourez les nœuds jusqu’à atteindre le nœud de type NodeType::FieldEnd qui désigne la fin de la table des matières.
- Supprimez la table des matières à l’aide de la méthode Node->Remove().
- Enregistrez le document Word à l’aide de la méthode Document->Save(System::String fileName).
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.