Ajouter ou supprimer un en-tête et un pied de page dans des documents Word à l'aide de C++

Les en-têtes et pieds de page dans les documents Word sont utilisés pour mettre en forme et afficher des informations importantes telles que le sujet, le chapitre, le numéro de page, la rédaction, etc. Lorsque vous travaillez avec des documents Word par programmation, vous devrez peut-être ajouter ou supprimer des en-têtes et des pieds de page. À cette fin, cet article vous apprendra comment ajouter et supprimer des en-têtes et des pieds de page dans des documents Word à l’aide de C++.

Pour ajouter des en-têtes et des pieds de page dans des documents Word, nous utiliserons l’API Aspose.Words for C++. Il s’agit d’une API C++ native qui prend en charge la création, la lecture et la modification de documents Word sans nécessiter l’installation de Microsoft 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

Les en-têtes et pieds de page d’un document Word sont divisés en trois sections, la page de titre, les pages paires et les pages impaires. Vous pouvez ajouter différents en-têtes et pieds de page pour ces sections. De plus, vous pouvez également ajouter des éléments tels que des images et des tableaux dans les en-têtes et les pieds de page.

Dans cet exemple, nous allons créer un nouveau document Word et ajouter un en-tête différent pour la page de titre. Nous ajouterons un en-tête avec une image et un pied de page avec un tableau aux pages suivantes. Voici les étapes pour ajouter des en-têtes et des pieds de page dans des documents Word.

  • Créez une instance de la classe Document pour représenter le document Word.
  • Créez une instance de la classe DocumentBuilder à l’aide de l’objet Document créé précédemment.
  • Spécifiez que vous souhaitez un en-tête et un pied de page différents pour la page de titre à l’aide de la méthode PageSetup->setDifferentFirstPageHeaderFooter(bool value).
  • Définissez les propriétés de la police pour le texte de l’en-tête.
  • Créez l’en-tête et le pied de page des pages suivantes.
  • Ajoutez une image dans l’en-tête à l’aide de DocumentBuilder->InsertImage(System::SharedPtrSystem::Drawing::Image image, Aspose::Words::Drawing::RelativeHorizontalPosition horzPos, double gauche, Aspose::Words::Drawing::RelativeVerticalPosition vertPos, double top, double largeur, double hauteur, Aspose::Words::Drawing::WrapType wrapType) méthode.
  • Ajouter un tableau dans le pied de page.
  • Enregistrez le document Word en utilisant la méthode Document->Save(System::String fileName).

L’exemple de code suivant montre comment ajouter des en-têtes et des pieds de page dans des documents Word à l’aide de C++.

void CopyHeadersFootersFromPreviousSection(const System::SharedPtr<Section>& section)
{
	System::SharedPtr<Section> previousSection = System::DynamicCast<Section>(section->get_PreviousSibling());

	if (previousSection == nullptr)
	{
		return;
	}

	section->get_HeadersFooters()->Clear();

	for (System::SharedPtr<Node> headerFooterNode : System::IterateOver(previousSection->get_HeadersFooters()))
	{
		section->get_HeadersFooters()->Add(headerFooterNode->Clone(true));
	}
}

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

	System::SharedPtr<Document> doc = System::MakeObject<Document>();
	System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);

	System::SharedPtr<Section> currentSection = builder->get_CurrentSection();
	System::SharedPtr<PageSetup> pageSetup = currentSection->get_PageSetup();

	// Spécifiez si nous voulons que les en-têtes/pieds de page de la première page soient différents des autres pages.
	// Vous pouvez également utiliser la propriété PageSetup.OddAndEvenPagesHeaderFooter pour spécifier
	// Différents en-têtes/pieds de page pour les pages paires et impaires.
	pageSetup->set_DifferentFirstPageHeaderFooter(true);

	// --- Créer un en-tête pour la première page. ---
	pageSetup->set_HeaderDistance(20);
	builder->MoveToHeaderFooter(HeaderFooterType::HeaderFirst);
	builder->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Center);

	// Définissez les propriétés de la police pour le texte de l'en-tête.
	builder->get_Font()->set_Name(u"Arial");
	builder->get_Font()->set_Bold(true);
	builder->get_Font()->set_Size(14);

	// Spécifiez le titre de l'en-tête pour la première page.
	builder->Write(u"Aspose.Words Header/Footer Creation Primer - Title Page.");

	// --- Créer un en-tête pour les pages autres que la première page. ---
	pageSetup->set_HeaderDistance(20);
	builder->MoveToHeaderFooter(HeaderFooterType::HeaderPrimary);

	// Insérez l'image en position absolue dans le coin supérieur/gauche de l'en-tête.
	// La distance des bords supérieur/gauche de la page est définie sur 10 points.
	System::String imageFileName = inputDataDir + u"Desert.jpg";
	builder->InsertImage(imageFileName, RelativeHorizontalPosition::Page, 10, RelativeVerticalPosition::Page, 10, 50, 50, WrapType::Through);

	builder->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Right);

	// Spécifiez le titre de l'en-tête pour les autres pages.
	builder->Write(u"Aspose.Words Header/Footer Creation Primer.");

	// --- Créer un pied de page pour les pages autres que la première page. ---
	builder->MoveToHeaderFooter(HeaderFooterType::FooterPrimary);

	// Nous utilisons un tableau à deux cellules pour faire une partie du texte sur la ligne (avec numérotation des pages)
	// A aligner à gauche, et l'autre partie du texte (avec copyright) à aligner à droite.
	builder->StartTable();

	// Effacer les bordures du tableau.
	builder->get_CellFormat()->ClearFormatting();

	builder->InsertCell();

	// Définissez la première cellule sur 1/3 de la largeur de la page.
	builder->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 / 3));

	// Insérez ici le texte de numérotation des pages.
	// Il utilise les champs PAGE et NUMPAGES pour calculer automatiquement le numéro de page actuel et le nombre total de pages.
	builder->Write(u"Page ");
	builder->InsertField(u"PAGE", u"");
	builder->Write(u" of ");
	builder->InsertField(u"NUMPAGES", u"");

	// Alignez ce texte à gauche.
	builder->get_CurrentParagraph()->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Left);

	builder->InsertCell();

	// Définissez la deuxième cellule sur les 2/3 de la largeur de la page.
	builder->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 * 2 / 3));

	builder->Write(u"(C) 2001 Aspose Pty Ltd. All rights reserved.");

	// Alignez ce texte à droite.
	builder->get_CurrentParagraph()->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Right);

	builder->EndRow();
	builder->EndTable();

	builder->MoveToDocumentEnd();

	// Ajoutez un saut de page pour créer une deuxième page sur laquelle les principaux en-têtes/pieds de page seront visibles.
	builder->InsertBreak(BreakType::PageBreak);

	// Ajoutez un saut de section pour créer une troisième page avec une orientation de page différente.
	builder->InsertBreak(BreakType::SectionBreakNewPage);

	// Obtenez la nouvelle section et sa mise en page.
	currentSection = builder->get_CurrentSection();
	pageSetup = currentSection->get_PageSetup();

	// Définissez l'orientation de la page de la nouvelle section sur paysage.
	pageSetup->set_Orientation(Orientation::Landscape);

	// Cette section n'a pas besoin d'un en-tête/pied de page différent pour la première page.
	// Nous n'avons besoin que d'une seule page de titre dans le document. L'en-tête/pied de page de cette page
	// a déjà été défini dans la section précédente
	pageSetup->set_DifferentFirstPageHeaderFooter(false);

	// Cette section affiche par défaut les en-têtes/pieds de page de la section précédente.
	// Appelez currentSection.HeadersFooters.LinkToPrevious(false) pour annuler ce comportement.
	// La largeur de la page est différente pour la nouvelle section et nous devons donc définir 
	// différentes largeurs de cellule pour un tableau de pied de page.
	currentSection->get_HeadersFooters()->LinkToPrevious(false);

	// Si nous voulons utiliser l'ensemble d'en-tête/pied de page déjà existant pour cette section 
	// mais avec quelques modifications mineures, il peut être opportun de copier les en-têtes/pieds de page
	// de la section précédente et appliquez les modifications nécessaires là où vous le souhaitez.
	CopyHeadersFootersFromPreviousSection(currentSection);

	// Trouvez le pied de page que nous voulons changer.
	System::SharedPtr<HeaderFooter> primaryFooter = currentSection->get_HeadersFooters()->idx_get(HeaderFooterType::FooterPrimary);

	System::SharedPtr<Row> row = primaryFooter->get_Tables()->idx_get(0)->get_FirstRow();
	row->get_FirstCell()->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 / 3));
	row->get_LastCell()->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 * 2 / 3));

	System::String outputPath = outputDataDir + u"CreateHeaderFooter.docx";

	// Enregistrez le document obtenu.
	doc->Save(outputPath);
}
Aperçu avant impression de la sortie générée par l'exemple de code

Aperçu avant impression de la sortie générée par l’exemple de code

Dans la section précédente, vous avez appris à ajouter des en-têtes et des pieds de page dans des documents Word. Semblable à l’ajout, vous pouvez supprimer les en-têtes et les pieds de page du titre, des pages paires et impaires en fonction de vos besoins. Voici les étapes pour supprimer tous les en-têtes et pieds de page dans un document Word.

L’exemple de code suivant montre comment supprimer tous les en-têtes et pieds de page dans un document Word à l’aide de C++.

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

System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleHeaderFooter.docx");

for (System::SharedPtr<Section> section : System::IterateOver<System::SharedPtr<Section>>(doc))
{
	// Jusqu'à trois en-têtes et pieds de page différents sont possibles dans une section (pour les premières pages, paires et impaires).
	// Nous les vérifions et les supprimons tous.
	System::SharedPtr<HeaderFooter> header;
	System::SharedPtr<HeaderFooter> footer;

	header = section->get_HeadersFooters()->idx_get(HeaderFooterType::HeaderFirst);
	footer = section->get_HeadersFooters()->idx_get(HeaderFooterType::FooterFirst);
	if (header != nullptr)
	{
		header->Remove();
	}
	if (footer != nullptr)
	{
		footer->Remove();
	}

	// L'en-tête et le pied de page principaux sont utilisés pour les pages impaires.
	header = section->get_HeadersFooters()->idx_get(HeaderFooterType::HeaderPrimary);
	footer = section->get_HeadersFooters()->idx_get(HeaderFooterType::FooterPrimary);
	if (header != nullptr)
	{
		header->Remove();
	}
	if (footer != nullptr)
	{
		footer->Remove();
	}

	header = section->get_HeadersFooters()->idx_get(HeaderFooterType::HeaderEven);
	footer = section->get_HeadersFooters()->idx_get(HeaderFooterType::FooterEven);
	if (header != nullptr)
	{
		header->Remove();
	}
	if (footer != nullptr)
	{
		footer->Remove();
	}
}

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

// Enregistrez le document.
doc->Save(outputPath);

Obtenez une licence gratuite

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

Conclusion

Travailler avec des en-têtes et des pieds de page dans des documents Word est un cas d’utilisation courant et fréquent. Dans cet article, vous avez appris à utiliser les en-têtes et les pieds de page dans les documents Word à l’aide de C++. Plus précisément, vous avez appris à ajouter et à supprimer des en-têtes et des pieds de page dans des documents Word à l’aide de l’API Aspose.Words for C++. L’API fournit un ensemble de fonctionnalités supplémentaires pour travailler avec des documents Word que vous pouvez explorer 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