Compartilhar via


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

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

Estrutura do Elemento de Referência de Cabeçalho

Neste exemplo, vai eliminar a parte do cabeçalho do ficheiro de destino e criar outra parte do cabeçalho. Também irá eliminar a referência ao cabeçalho existente e criar uma referência para o novo cabeçalho. Por conseguinte, é útil familiarizar-se com os cabeçalhos e o elemento de referência de cabeçalho. As seguintes informações da especificação ISO/IEC 29500 introduzem o elemento de referência de cabeçalho.

headerReference (Referência de Cabeçalho)

Este elemento especifica um único cabeçalho que deve ser associado à secção atual no documento. Este cabeçalho deve ser referenciado através do atributo ID , que especifica uma relação explícita com a parte cabeçalho adequada no pacote WordprocessingML.

Se o tipo de relação da relação especificada por este elemento não for , 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 secção de um documento, podem existir 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 par

O tipo de cabeçalho especificado pelo cabeçalho atualReferência é especificado através do atributo type .

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

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

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

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

Exemplo: considere um documento de três páginas com um cabeçalho de página diferente, ímpar e par definido da seguinte forma:

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 um ID de relação exclusivo, 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>

Estas relações são, em seguida, referenciadas nas propriedades da secção com 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 secção resultante deve utilizar a parte do cabeçalho com o ID de relação rId3 para a primeira página, a parte do cabeçalho com o ID de relação rId2 para todas as páginas pares subsequentes e a parte do cabeçalho com o id rId5 da relação para todas as páginas ímpares subsequentes. exemplo final

© ISO/IEC 29500: 2016

Código de exemplo

O seguinte exemplo de código mostra como substituir o cabeçalho num documento de processamento de palavras pelo cabeçalho de outro documento de processamento de palavras. Para chamar o método , AddHeaderFromTopode utilizar o seguinte segmento de código 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 });
        }
    }
}