Remplacer l’en-tête d’un document de traitement de texte
Cette rubrique montre comment utiliser les classes du Kit de développement logiciel (SDK) Open XML pour Office pour remplacer l’en-tête dans le document de traitement de texte par programmation.
Structure de l’élément de référence d’en-tête
Dans cet exemple, vous allez supprimer la partie d’en-tête du fichier cible et créer un autre composant d’en-tête. Vous allez également supprimer la référence à l’en-tête existant et créer une référence au nouvel en-tête. Par conséquent, il est utile de vous familiariser avec les en-têtes et l’élément de référence d’en-tête. Les informations suivantes de la spécification ISO/IEC 29500 introduisent l’élément de référence d’en-tête.
headerReference (Référence d’en-tête)
Cet élément spécifie un en-tête unique qui doit être associé à la section active du document. Cet en-tête doit être référencé via l’attribut id, qui spécifie une relation explicite au composant En-tête approprié dans le package WordprocessingML.
Si le type de relation de la relation spécifiée par cet élément n’est pas https://schemas.openxmlformats.org/officeDocument/2006/header
, n’est pas présent ou n’a pas de valeur d’attribut TargetModeInterne, le document est considéré comme non conforme.
Dans chaque section d’un document, il peut y avoir jusqu’à trois types d’en-têtes différents :
Premier en-tête de page
En-tête de page impaire
En-tête de page paire
Le type d’en-tête spécifié par le headerReference actif est spécifié via l’attribut type.
Si un type d’en-tête est omis pour une section donnée, les règles suivantes s’appliquent.
Si aucun en-tête headerReference n’est spécifié pour le premier en-tête de page et que l’élément titlePg est spécifié, le premier en-tête de page est hérité de la section précédente ou, s’il s’agit de la première section du document, un nouvel en-tête vide est créé. Si l’élément titlePg n’est pas spécifié, aucun premier en-tête de page ne doit être affiché et l’en-tête de page impair doit être utilisé à sa place.
Si aucun headerReference n’est spécifié pour l’en-tête de page paire et que l’élément evenAndOddHeaders est spécifié, l’en-tête de page paire est hérité de la section précédente ou, s’il s’agit de la première section du document, un nouvel en-tête vide est créé. Si l’élément evenAndOddHeaders n’est pas spécifié, aucun en-tête de page pair ne doit être affiché et l’en-tête de page impair doit être utilisé à sa place.
Si aucun headerReference n’est spécifié pour l’en-tête de page impaire, l’en-tête de page paire doit être hérité de la section antérieure. Toutefois, s’il s’agit de la première section du document, un en-tête vide doit être créé.
Exemple : Considérez un document de trois pages avec un en-tête de page différent premier, impair et pair défini comme suit :
Ce document définit trois en-têtes, qui ont chacun une relation par rapport au composant Document avec un ID de relation unique, comme illustré dans le balisage de package suivant :
<Relationships xmlns=https://schemas.openxmlformats.org/package/2006/relationships>
…
<Relationship Id="rId2" Type="https://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header1.xml" />
<Relationship Id="rId3" Type="https://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header2.xml" />
<Relationship Id="rId5" Type="https://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header3.xml" />
…
</Relationships>
Ces relations sont ensuite référencées dans les propriétés de la section à l’aide de la syntaxe WordprocessingML suivante :
<w:sectPr>
…
<w:headerReference r:id="rId3" w:type="first" />
<w:headerReference r:id="rId5" w:type="default" />
<w:headerReference r:id="rId2" w:type="even" />
…
</w:sectPr>
La section résultante doit utiliser le composant En-tête avec l’ID de relation rId3 pour la première page, le composant En-tête avec l’ID de relation rId2 pour toutes les pages paires ultérieures, et le composant En-tête avec l’ID de relation rId5 pour toutes les pages impaires ultérieures. Fin de l’exemple]
© ISO/IEC29500: 2008.
Exemple de code
L’exemple de code suivant montre comment remplacer l’en-tête dans un document de traitement de texte par l’en-tête d’un autre document de traitement de texte. Pour appeler la méthode AddHeaderFromTo, vous pouvez utiliser le segment de code suivant en tant qu’exemple.
string filepathFrom = @"C:\Users\Public\Documents\Word15a.docx";
string filepathTo=@"C:\Users\Public\Documents\Word15b.docx";
AddHeaderFromTo(filepathFrom, filepathTo);
Voici un exemple de code complet en C# et Visual Basic.
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
using System.Collections.Generic;
using System.Linq;
AddHeaderFromTo(args[0], args[1]);
static void AddHeaderFromTo(string filepathFrom, string filepathTo)
{
// Replace header in target document with header of source document.
using (WordprocessingDocument wdDoc = WordprocessingDocument.Open(filepathTo, true))
using (WordprocessingDocument wdDocSource = WordprocessingDocument.Open(filepathFrom, true))
{
if (wdDocSource.MainDocumentPart is null || wdDocSource.MainDocumentPart.HeaderParts is null)
{
throw new ArgumentNullException("MainDocumentPart and/or HeaderParts is null.");
}
if (wdDoc.MainDocumentPart is null)
{
throw new ArgumentNullException("MainDocumentPart is null.");
}
MainDocumentPart mainPart = wdDoc.MainDocumentPart;
// Delete the existing header part.
mainPart.DeleteParts(mainPart.HeaderParts);
// Create a new header part.
DocumentFormat.OpenXml.Packaging.HeaderPart headerPart = mainPart.AddNewPart<HeaderPart>();
// Get Id of the headerPart.
string rId = mainPart.GetIdOfPart(headerPart);
// Feed target headerPart with source headerPart.
DocumentFormat.OpenXml.Packaging.HeaderPart? firstHeader = wdDocSource.MainDocumentPart.HeaderParts.FirstOrDefault();
wdDocSource.MainDocumentPart.HeaderParts.FirstOrDefault();
if (firstHeader is not null)
{
headerPart.FeedData(firstHeader.GetStream());
}
if (mainPart.Document.Body is null)
{
throw new ArgumentNullException("Body is null.");
}
// Get SectionProperties and Replace HeaderReference with new Id.
IEnumerable<DocumentFormat.OpenXml.Wordprocessing.SectionProperties> sectPrs = mainPart.Document.Body.Elements<SectionProperties>();
foreach (var sectPr in sectPrs)
{
// Delete existing references to headers.
sectPr.RemoveAllChildren<HeaderReference>();
// Create the new header reference node.
sectPr.PrependChild<HeaderReference>(new HeaderReference() { Id = rId });
}
}
}