Partager via


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 :

Document à trois pages délimitées par des en-têtes différents

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 });
        }
    }
}