Substituir o cabeçalho em um documento de processamento de texto

Este tópico mostra como usar as classes no Open XML SDK for Office para substituir o cabeçalho no documento de processamento de texto programaticamente.

Estrutura do elemento de referência de cabeçalho

Neste exemplo, você excluirá a parte do cabeçalho do arquivo de destino e criará outra parte do cabeçalho. Você também excluirá a referência ao cabeçalho existente e criará uma referência ao novo cabeçalho. Portanto, é útil familiarizar-se com os cabeçalhos e o elemento de referência do cabeçalho. As seguintes informações da especificação ISO/IEC 29500 introduzem o elemento de referência do cabeçalho.

headerReference (referência de cabeçalho)

Esse elemento especifica um único cabeçalho que deve ser associado à seção atual do documento. Esse cabeçalho deve ser referenciado por meio do atributo id , que especifica uma relação explícita com a parte do cabeçalho apropriada no pacote WordprocessingML.

Se o tipo de relação da relação especificado por esse elemento não https://schemas.openxmlformats.org/officeDocument/2006/headerfor , não estiver presente ou não tiver um valor de atributo TargetMode de Internal, o documento será considerado não conforme.

Dentro de cada seção de um documento, pode haver até três tipos diferentes de cabeçalhos:

  • Cabeçalho da primeira página

  • Cabeçalho de página ímpar

  • Cabeçalho de página uniforme

O tipo de cabeçalho especificado pelo headerReference atual é especificado por meio do atributo type .

Se qualquer tipo de cabeçalho for omitido para uma determinada seção, as seguintes regras serão aplicadas.

  • Se nenhum headerReference para o cabeçalho da primeira página for especificado e o elemento titlePg for especificado, o cabeçalho da primeira página deverá ser herdado da seção anterior ou, se esta for a primeira seção do documento, um novo cabeçalho em branco deverá ser criado. Se o elemento titlePg não for especificado, nenhum cabeçalho de primeira página deverá ser mostrado e o cabeçalho de página ímpar deverá ser usado em seu lugar.

  • Se nenhum headerReference para o cabeçalho de página par for especificado e o elemento evenAndOddHeaders for especificado, o cabeçalho de página par deverá ser herdado da seção anterior ou, se esta for a primeira seção do documento, um novo cabeçalho em branco deverá ser criado. Se o elemento evenAndOddHeaders não for especificado, nenhum cabeçalho de página par deverá ser mostrado e o cabeçalho de página ímpar deverá ser usado em seu lugar.

  • Se nenhum headerReference para o cabeçalho de página ímpar for especificado, o cabeçalho de página par deverá ser herdado da seção anterior ou, se esta for a primeira seção do documento, um novo cabeçalho em branco deverá ser criado.

Exemplo: considere um documento de três páginas com diferentes cabeçalhos de página primeiro, ímpar e par definidos da seguinte maneira:

Three page document with different headers

Este documento define três cabeçalhos, cada um dos quais tem uma relação da parte do documento com uma ID de relação exclusiva, conforme mostrado na seguinte marcação de empacotamento:

    <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>

Essas relações são referenciadas nas propriedades da seção usando o seguinte WordprocessingML:

    <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>  

A seção resultante deve usar a parte do cabeçalho com a id do relacionamento rId3 para a primeira página, a parte do cabeçalho com a id do relacionamento rId2 para todas as páginas pares subsequentes e a parte do cabeçalho com a id do relacionamento rId5 para todas as páginas ímpares subsequentes. exemplo de término

© ISO/IEC 29500: 2016

Código de exemplo

O exemplo de código a seguir mostra como substituir o cabeçalho em um documento de processamento de texto pelo cabeçalho de outro documento de processamento de texto. Para chamar o método, AddHeaderFromTo, você pode usar o segmento de código a seguir como exemplo.

string fromFile = args[0];
string toFile = args[1];

AddHeaderFromTo(fromFile, toFile);

A seguir está o código de exemplo completo em C# e em 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 });
        }
    }
}