Ler em inglês

Compartilhar via


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

Este tópico mostra como usar as classes no SDK Open XML para Office para substituir o cabeçalho no documento de processamento de palavras de forma programática.

Estrutura do Elemento de Referência de Cabeçalho

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

headerReference (referência de cabeçalho)

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

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

Em 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

  • Até mesmo cabeçalho de página

O tipo de cabeçalho especificado pelo cabeçalho atualReference é especificado por meio do atributo de tipo .

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

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

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

  • Se nenhum cabeçalhoReferência para o cabeçalho de página ímpar for especificado, o cabeçalho de página uniforme será herdado da seção anterior ou, se esta for a primeira seção no documento, um novo cabeçalho em branco será criado.

Exemplo: considere um documento de três páginas com um cabeçalho de página diferente primeiro, ímpar e até mesmo definido 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=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>

Essas relações são entã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 de cabeçalho com id de relação rId3 para a primeira página, a parte de cabeçalho com id de relação rId2 para todas as páginas par subsequentes e a parte de cabeçalho com id de relação rId5 para todas as páginas ímpares subsequentes. exemplo final]

© ISO/IEC29500: 2008.

Código de exemplo

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

    string filepathFrom = @"C:\Users\Public\Documents\Word15a.docx";
    string filepathTo=@"C:\Users\Public\Documents\Word15b.docx";
    AddHeaderFromTo(filepathFrom, filepathTo);

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;

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