Поделиться через


Удалить верхние и нижние колонтитулы из документа обработки текста

В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для программного удаления всех верхних и нижних колонтитулов в текстовом документе. Он содержит пример RemoveHeadersAndFooters метода для иллюстрации этой задачи.

Метод RemoveHeadersAndFooters

Метод можно использовать для RemoveHeadersAndFooters удаления всех данных верхнего и нижнего колонтитулов из текстового документа. Помните, что нужно не только удалить верхние и нижние колонтитулы из хранилища документа, но и удалить из документа все ссылки на них. Пример кода иллюстрирует оба этапа операции. Метод RemoveHeadersAndFooters принимает один параметр — строку, указывающую путь к файлу, который требуется изменить.

static void RemoveHeadersAndFooters(string filename)

Полный листинг кода метода можно найти в разделе Пример кода.

Вызов примера метода

Чтобы вызвать пример метода, передайте в качестве первого параметра строку с именем документа, как показано в следующем примере кода.

string filename = args[0];

RemoveHeadersAndFooters(filename);

Принципы работы кода

Метод RemoveHeadersAndFooters работает с указанным документом, удаляя все части верхнего и нижнего колонтитулов и ссылки на них. Код начинается с открытия документа с помощью Open метода и указания, что документ должен быть открыт для чтения и записи (последний параметр true). Учитывая открытый документ, код использует MainDocumentPart свойство для перехода к документу main, сохраняя ссылку в переменной с именем docPart.

// 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 метод свойств HeaderParts и FooterParts части документа, и если любой из этих элементов возвращает значение больше 0, код продолжается. Имейте в HeaderParts виду, что свойства и FooterParts возвращают IEnumerable<T>HeaderPart объекты или FooterPart соответственно.

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

Учитывая коллекцию ссылок на части верхнего и нижнего колонтитулов, можно написать код для удаления каждой отдельно, но это необязательно из-за пакета SDK Open XML. Вместо этого можно вызвать DeleteParts метод , передав коллекцию удаляемых частей . Этот простой метод предоставляет ярлык для удаления коллекции частей. Следовательно, приведенные ниже строки кода заменяют цикл, который вам пришлось бы писать самостоятельно.

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

На этом этапе код удалил верхние и нижние колонтитулы, но документ еще содержит ссылки на эти части. Прежде чем удалить заброшенные ссылки, код должен получить ссылку на содержимое документа (то есть XML-содержимое основной части документа).

Чтобы удалить цепочки ссылок, код сначала извлекает коллекцию элементов HeaderReference, преобразует коллекцию в List, а затем циклически проходит по коллекции, вызывая Remove() метод для каждого найденного элемента. Обратите внимание, что код преобразует IEnumerable объект , возвращенный методом Descendants() , в , List чтобы можно было удалять элементы из списка, а HeaderReference тип, предоставляемый пакетом SDK Open XML, позволяет легко ссылаться на элементы типа HeaderReference в XML-содержимом. Удалив все верхние колонтитулы, код повторяет операцию с нижними.

// 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();
}

Пример кода

Ниже приведен полный RemoveHeadersAndFooters пример кода на C# и Visual Basic.

// 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();
            }
        }
    }
}