Share via


Eliminar los encabezados y los pies de página de un documento de procesamiento de texto

En este tema se muestra cómo usar las clases del SDK de Open XML para Office para quitar mediante programación todos los encabezados y pies de página de un documento de procesamiento de texto. Contiene un ejemplo del método RemoveHeadersAndFooters para ilustrar esta tarea.

Método RemoveHeadersAndFooters

Puede usar el método RemoveHeadersAndFooters para quitar toda la información de encabezados y pies de página de un documento de procesamiento de texto. Tenga en cuenta que no solo debe eliminar los elementos del encabezado y el pie de página del almacenamiento de documentos, también debe eliminar las referencias a dichos elementos del documento. El código de ejemplo demuestra ambos pasos en la operación. El método RemoveHeadersAndFooters acepta un solo parámetro, una cadena que indica la ruta de acceso al archivo que desea modificar.

    public static void RemoveHeadersAndFooters(string filename)

Encontrará el listado completo de códigos para el método en la sección Código de ejemplo.

Llamar al método de ejemplo

Para llamar al método de ejemplo, pase una cadena para el primera parámetro que contenga el nombre de archivo del documento que desea modificar tal como se muestra en el siguiente ejemplo de código.

    RemoveHeadersAndFooters(@"C:\Users\Public\Documents\Headers.docx");

Funcionamiento del código

El método RemoveHeadersAndFooters funciona con el documento que especifique y elimina todos los elementos de encabezamiento y pie de página y todas las referencias a dichos elementos. El código comienza abriendo el documento, usando el método Open e indicando que el documento debe abrirse para el acceso de lectura y escritura (el parámetro true final). Dado el documento abierto, el código usa la propiedad MainDocumentPart para navegar al documento principal y almacenar la referencia en una variable denominada docPart.

    // Given a document name, remove all of the headers and footers
    // from the document.
    using (WordprocessingDocument doc = 
        WordprocessingDocument.Open(filename, true))
    {
        // Code removed here...
    }

Confirmar la existencia de encabezado/pie de página

Una vez se tiene una referencia al elemento del documento, el código determina a continuación si tiene alguna tarea que realizar; es decir, si el documento contiene encabezados o pies de página. Para decidir, el código llama al método Count de las propiedades HeaderParts y FooterParts del elemento de documento y, si devuelve un valor mayor que 0, el código continúa. Tenga en cuenta que las propiedades HeaderParts y FooterParts devuelven un IEnumerable de los objetos HeaderPart o FooterPart , respectivamente.

    // Get a reference to the main document part.
    var docPart = doc.MainDocumentPart;

    // Count the header and footer parts and continue if there 
    // are any.
    if (docPart.HeaderParts.Count() > 0 || 
        docPart.FooterParts.Count() > 0)
    {
        // Code removed here...
    }

Dada una colección de referencias a los elementos de encabezado y pie de página, puede escribir código para eliminar cada una de ellas individualmente, pero eso no es necesario debido al SDK de Open XML. En su lugar, puede llamar al método DeleteParts<T> , pasando la colección de elementos que se van a eliminar─ este método simple proporciona un acceso directo para eliminar una colección de elementos. Por lo tanto, las siguientes líneas de código toman el lugar del bucle que debería escribir manualmente.

    // Remove the header and footer parts.
    docPart.DeleteParts(docPart.HeaderParts);
    docPart.DeleteParts(docPart.FooterParts);

Trabajar con el contenido del documento

Llegados a este punto, el código ha eliminado los elementos de encabezado y pie de página, pero el documento sigue conteniendo referencias a dichos elementos. Antes de que se quiten las referencias huérfanas, el código debe recuperar una referencia al contenido del documento (es decir, al contenido XML incluido en el elemento del documento principal). Más tarde, tras realizar los cambios, el código debe garantizar que persistan guardándolos explícitamente. Entre estas dos operaciones, el código debe eliminar referencias huérfanas, como se muestra en la sección que sigue a este ejemplo de código.

    // Get a reference to the root element of the main
    // document part.
    Document document = docPart.Document;
        // Code removed here...
    // Save the changes.
    document.Save();

Para quitar las referencias encalladas, primero el código recupera una colección de elementos HeaderReference, convierte la colección en una lista y, a continuación, realiza un bucle en la colección, con lo que se llama al método Remove para cada elemento encontrado. Tenga en cuenta que el código convierte el IEnumerable devuelto por el método Descendants en una lista para que pueda eliminar elementos de la lista y que el tipo HeaderReference proporcionado por el SDK de Open XML facilita la referencia a elementos de tipo HeaderReference en el contenido XML. (Sin esa ayuda adicional, tendría que trabajar con los detalles del contenido XML directamente.) Una vez ha quitado todos los encabezados, el código repite la operación con los elementos de pie de página.

    // Remove all references to the headers and footers.

    // First, create a list of all descendants of type
    // HeaderReference. Then, navigate the list and call
    // Remove on each item to delete the reference.
    var headers =
      document.Descendants<HeaderReference>().ToList();
    foreach (var header in headers)
    {
        header.Remove();
    }

    // First, create a list of all descendants of type
    // FooterReference. Then, navigate the list and call
    // Remove on each item to delete the reference.
    var footers =
      document.Descendants<FooterReference>().ToList();
    foreach (var footer in footers)
    {
        footer.Remove();
    }

Código de ejemplo

A continuación, se incluye el código de ejemplo completo RemoveHeadersAndFooters en C# y Visual Basic.

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
using System.Linq;

RemoveHeadersAndFooters(args[0]);

// Remove all of the headers and footers from a document.
static void RemoveHeadersAndFooters(string filename)
{
    // Given a document name, remove all of the headers and footers
    // from the document.
    using (WordprocessingDocument doc = WordprocessingDocument.Open(filename, true))
    {
        if (doc.MainDocumentPart is null)
        {
            throw new ArgumentNullException("MainDocumentPart is null.");
        }

        // Get a reference to the main document part.
        var docPart = doc.MainDocumentPart;

        // Count the header and footer parts and continue if there 
        // are any.
        if (docPart.HeaderParts.Count() > 0 ||
            docPart.FooterParts.Count() > 0)
        {
            // Remove the header and footer parts.
            docPart.DeleteParts(docPart.HeaderParts);
            docPart.DeleteParts(docPart.FooterParts);

            // Get a reference to the root element of the main
            // document part.
            Document document = docPart.Document;

            // Remove all references to the headers and footers.

            // First, create a list of all descendants of type
            // HeaderReference. Then, navigate the list and call
            // Remove on each item to delete the reference.
            var headers =
              document.Descendants<HeaderReference>().ToList();
            foreach (var header in headers)
            {
                header.Remove();
            }

            // First, create a list of all descendants of type
            // FooterReference. Then, navigate the list and call
            // Remove on each item to delete the reference.
            var footers =
              document.Descendants<FooterReference>().ToList();
            foreach (var footer in footers)
            {
                footer.Remove();
            }

            // Save the changes.
            document.Save();
        }
    }
}