Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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="http://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. exemple de fin
© ISO/IEC 29500 : 2016
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 , AddHeaderFromTovous pouvez utiliser le segment de code suivant comme exemple.
string fromFile = args[0];
string toFile = args[1];
AddHeaderFromTo(fromFile, toFile);
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;
static void AddHeaderFromTo(string fromFile, string toFile)
{
// Replace header in target document with header of source document.
using (WordprocessingDocument wdDoc = WordprocessingDocument.Open(toFile, true))
using (WordprocessingDocument wdDocSource = WordprocessingDocument.Open(fromFile, 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 });
}
}
}