Compartir a través de


Reemplazar el encabezado en un documento de procesamiento de texto

En este tema se muestra cómo usar las clases del SDK de Open XML para Office para reemplazar el encabezado del documento de procesamiento de texto mediante programación.

Estructura del elemento de referencia de encabezado

En este ejemplo se elimina la parte de encabezado del archivo de destino y se crea otra. También se elimina la referencia al encabezado existente y se crea una referencia al nuevo encabezado. Por este motivo, se recomienda que se familiarice con los encabezados y con los elementos de referencia de encabezado. La información siguiente sobre la especificación ISO/IEC 29500 presenta el elemento de referencia de encabezado.

headerReference (referencia de encabezado)

Este elemento especifica un único encabezado, que se debe asociar con la sección actual del documento. Se debe hacer referencia a este encabezado a través del atributo id, que especifica una relación explícita a la parte de encabezado adecuada en el paquete WordprocessingML.

Si el tipo de relación de la relación especificada por este elemento no es , no https://schemas.openxmlformats.org/officeDocument/2006/headerestá presente o no tiene un valor de atributo TargetModede Internal, el documento se considerará no conforme.

Dentro de cada sección de un documento, podría haber hasta tres tipos distintos de encabezado:

  • Encabezado en primera página

  • Encabezado en página impar

  • Encabezado en página par

El tipo de encabezado que indica el elemento headerReference actual se especifica a través del atributo type.

Si se omite un tipo de encabezado en una sección determinada, se deben aplicar las siguientes reglas.

  • Si no se especifica ningún elemento headerReference para el encabezado en primera página y el elemento titlePg está especificado, el encabezado en primera página debe heredarse de la sección anterior; o bien, si se trata de la primera sección del documento, se deberá crear un nuevo encabezado en blanco. Si no se especifica el elemento titlePg, no se mostrará ningún encabezado en la primera página y se usará el encabezado de las páginas pares en su lugar.

  • Si no se especifica ningún elemento headerReference para el encabezado en página par y el elemento evenAndOddHeaders está especificado, el encabezado en página par debe heredarse de la sección anterior; o bien, si se trata de la primera sección del documento, se deberá crear un nuevo encabezado en blanco. Si no se especifica el elemento evenAndOddHeaders, no se mostrará ningún encabezado en las páginas pares y se usará el encabezado de las páginas impares en su lugar.

  • Si no se especifica ningún elemento headerReference para el encabezado en página impar, el encabezado en página par debe heredarse de la sección anterior; o bien, si se trata de la primera sección del documento, se deberá crear un nuevo encabezado en blanco.

Ejemplo: considere la posibilidad de un documento de tres páginas con un encabezado de página diferente en primer lugar, impar e incluso definido como se indica a continuación:

Documento de tres páginas con distintos encabezados

Este documento define tres encabezados, cada uno de los cuales tiene una relación desde la parte de documento con un identificador de relación único, como se muestra en el siguiente marcado de paquete:

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

A continuación, se hace referencia a estas relaciones en las propiedades de la sección mediante el siguiente 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>  

La sección resultante usará la parte de encabezado con identificador de relación rId3 para la primera página, la parte de encabezado con identificador de relación rId2 para todas las páginas pares subsiguientes y la parte de encabezado con identificador de relación rId5 para todas las páginas impares subsiguientes. Fin del ejemplo]

© ISO/IEC29500: 2008.

Código de ejemplo

En el siguiente ejemplo de código se muestra cómo reemplazar el encabezado en un documento de procesamiento de texto con el encabezado de otro documento de procesamiento de texto. Para llamar al método AddHeaderFromTo, puede usar el siguiente segmento de código como un ejemplo.

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

A continuación se incluye el código de ejemplo completo en C# y 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 });
        }
    }
}