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.
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.
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/header
estiver 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:
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.
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 });
}
}
}