Удалить верхние и нижние колонтитулы из документа обработки текста
В этом разделе показано, как использовать классы в пакете 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();
}
}
}
}