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/header
estiver 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:
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 , AddHeaderFromTo
pode 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 });
}
}
}