Добавить или удалить верхний и нижний колонтитулы в документах Word с помощью C++

Верхние и нижние колонтитулы в документах Word используются для форматирования и отображения важной информации, такой как тема, глава, номер страницы, копирайтинг и т. д. При программной работе с документами Word может потребоваться добавить или удалить верхние и нижние колонтитулы. С этой целью в этой статье вы узнаете, как добавлять и удалять верхние и нижние колонтитулы в документах Word с помощью C++.

Чтобы добавить верхние и нижние колонтитулы в документы Word, мы будем использовать API Aspose.Words for C++. Это собственный API C++, который поддерживает создание, чтение и изменение документов Word без установки Microsoft Word. Вы можете либо установить API через NuGet, либо загрузить его напрямую из раздела Загрузки.

PM> Install-Package Aspose.Words.Cpp

Верхние и нижние колонтитулы в документе Word разделены на три части: титульный лист, четные страницы и нечетные страницы. Вы можете добавить разные верхние и нижние колонтитулы для этих разделов. Кроме того, вы также можете добавлять такие элементы, как изображения и таблицы, в верхние и нижние колонтитулы.

В этом примере мы создадим новый документ Word и добавим другой заголовок для титульного листа. На последующие страницы мы добавим заголовок с изображением и нижний колонтитул с таблицей. Ниже приведены шаги для добавления верхних и нижних колонтитулов в документы Word.

  • Создайте экземпляр класса Document для представления документа Word.
  • Создайте экземпляр класса DocumentBuilder, используя ранее созданный объект Document.
  • Укажите, что вы хотите другой верхний и нижний колонтитулы для титульной страницы, используя метод PageSetup->set_DifferentFirstPageHeaderFooter(bool value).
  • Установите свойства шрифта для текста заголовка.
  • Создайте верхний и нижний колонтитулы для последующих страниц.
  • Добавьте изображение в заголовок с помощью DocumentBuilder->InsertImage(System::SharedPtrSystem::Drawing::Image изображение, Aspose::Words::Drawing::RelativeHorizontalPosition horzPos, двойное левое, Aspose::Words::Drawing::RelativeVerticalPosition vertPos, двойное верхнее, двойная ширина, двойная высота, Aspose::Words::Drawing::WrapType wrapType) метод.
  • Добавьте таблицу в нижний колонтитул.
  • Сохраните документ Word, используя метод Документ->Сохранить(System::String fileName).

В следующем примере кода показано, как добавлять верхние и нижние колонтитулы в документы Word с помощью C++.

void CopyHeadersFootersFromPreviousSection(const System::SharedPtr<Section>& section)
{
	System::SharedPtr<Section> previousSection = System::DynamicCast<Section>(section->get_PreviousSibling());

	if (previousSection == nullptr)
	{
		return;
	}

	section->get_HeadersFooters()->Clear();

	for (System::SharedPtr<Node> headerFooterNode : System::IterateOver(previousSection->get_HeadersFooters()))
	{
		section->get_HeadersFooters()->Add(headerFooterNode->Clone(true));
	}
}

int main()
{
	// Пути к исходному и выходному каталогу.
	System::String inputDataDir = u"SourceDirectory\\";
	System::String outputDataDir = u"OutputDirectory\\";

	System::SharedPtr<Document> doc = System::MakeObject<Document>();
	System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);

	System::SharedPtr<Section> currentSection = builder->get_CurrentSection();
	System::SharedPtr<PageSetup> pageSetup = currentSection->get_PageSetup();

	// Укажите, хотим ли мы, чтобы верхние/нижние колонтитулы первой страницы отличались от других страниц.
	// Вы также можете использовать свойство PageSetup.OddAndEvenPagesHeaderFooter, чтобы указать
	// Разные верхние/нижние колонтитулы для нечетных и четных страниц.
	pageSetup->set_DifferentFirstPageHeaderFooter(true);

	// --- Создать заголовок для первой страницы. ---
	pageSetup->set_HeaderDistance(20);
	builder->MoveToHeaderFooter(HeaderFooterType::HeaderFirst);
	builder->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Center);

	// Установите свойства шрифта для текста заголовка.
	builder->get_Font()->set_Name(u"Arial");
	builder->get_Font()->set_Bold(true);
	builder->get_Font()->set_Size(14);

	// Укажите заголовок заголовка для первой страницы.
	builder->Write(u"Aspose.Words Header/Footer Creation Primer - Title Page.");

	// --- Создать заголовок для страниц, отличных от первой страницы. ---
	pageSetup->set_HeaderDistance(20);
	builder->MoveToHeaderFooter(HeaderFooterType::HeaderPrimary);

	// Вставьте абсолютно позиционированное изображение в верхний/левый угол заголовка.
	// Расстояние от верхнего/левого края страницы устанавливается равным 10 точкам.
	System::String imageFileName = inputDataDir + u"Desert.jpg";
	builder->InsertImage(imageFileName, RelativeHorizontalPosition::Page, 10, RelativeVerticalPosition::Page, 10, 50, 50, WrapType::Through);

	builder->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Right);

	// Укажите заголовок заголовка для других страниц.
	builder->Write(u"Aspose.Words Header/Footer Creation Primer.");

	// --- Создать нижний колонтитул для страниц, отличных от первой страницы. ---
	builder->MoveToHeaderFooter(HeaderFooterType::FooterPrimary);

	// Мы используем таблицу с двумя ячейками, чтобы сделать одну часть текста на строке (с нумерацией страниц)
	// Выровнять по левому краю, а остальную часть текста (с копирайтом) по правому краю.
	builder->StartTable();

	// Очистить границы таблицы.
	builder->get_CellFormat()->ClearFormatting();

	builder->InsertCell();

	// Установите первую ячейку на 1/3 ширины страницы.
	builder->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 / 3));

	// Вставьте сюда текст нумерации страниц.
	// Он использует поля PAGE и NUMPAGES для автоматического вычисления номера текущей страницы и общего количества страниц.
	builder->Write(u"Page ");
	builder->InsertField(u"PAGE", u"");
	builder->Write(u" of ");
	builder->InsertField(u"NUMPAGES", u"");

	// Выровняйте этот текст по левому краю.
	builder->get_CurrentParagraph()->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Left);

	builder->InsertCell();

	// Установите вторую ячейку на 2/3 ширины страницы.
	builder->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 * 2 / 3));

	builder->Write(u"(C) 2001 Aspose Pty Ltd. All rights reserved.");

	// Выровняйте этот текст по правому краю.
	builder->get_CurrentParagraph()->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Right);

	builder->EndRow();
	builder->EndTable();

	builder->MoveToDocumentEnd();

	// Добавьте разрыв страницы, чтобы создать вторую страницу, на которой будут видны основные верхние/нижние колонтитулы.
	builder->InsertBreak(BreakType::PageBreak);

	// Добавьте разрыв раздела, чтобы создать третью страницу с другой ориентацией страницы.
	builder->InsertBreak(BreakType::SectionBreakNewPage);

	// Получите новый раздел и настройки его страницы.
	currentSection = builder->get_CurrentSection();
	pageSetup = currentSection->get_PageSetup();

	// Установите альбомную ориентацию страницы нового раздела.
	pageSetup->set_Orientation(Orientation::Landscape);

	// Этот раздел не нуждается в другом верхнем/нижнем колонтитуле первой страницы.
	// Нам нужен только один титульный лист в документе. Верхний/нижний колонтитул для этой страницы
	// уже определено в предыдущем разделе
	pageSetup->set_DifferentFirstPageHeaderFooter(false);

	// В этом разделе по умолчанию отображаются верхние/нижние колонтитулы из предыдущего раздела.
	// Вызовите currentSection.HeadersFooters.LinkToPrevious(false), чтобы отменить это поведение.
	// Ширина страницы отличается для нового раздела, поэтому нам нужно установить 
	// разная ширина ячеек для таблицы нижнего колонтитула.
	currentSection->get_HeadersFooters()->LinkToPrevious(false);

	// Если мы хотим использовать уже существующий верхний/нижний колонтитул для этого раздела 
	// но с небольшими изменениями может быть целесообразно скопировать верхние/нижние колонтитулы
	// из предыдущего раздела и примените необходимые изменения там, где мы этого хотим.
	CopyHeadersFootersFromPreviousSection(currentSection);

	// Найдите нижний колонтитул, который мы хотим изменить.
	System::SharedPtr<HeaderFooter> primaryFooter = currentSection->get_HeadersFooters()->idx_get(HeaderFooterType::FooterPrimary);

	System::SharedPtr<Row> row = primaryFooter->get_Tables()->idx_get(0)->get_FirstRow();
	row->get_FirstCell()->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 / 3));
	row->get_LastCell()->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 * 2 / 3));

	System::String outputPath = outputDataDir + u"CreateHeaderFooter.docx";

	// Сохраните полученный документ.
	doc->Save(outputPath);
}
Предварительный просмотр вывода, сгенерированного примером кода

Предварительный просмотр вывода, сгенерированного примером кода

В предыдущем разделе вы узнали, как добавлять верхние и нижние колонтитулы в документы Word. Подобно добавлению, вы можете удалить верхние и нижние колонтитулы из заголовка, четных и нечетных страниц в соответствии с вашими потребностями. Ниже приведены шаги для удаления всех верхних и нижних колонтитулов в документе Word.

В следующем примере кода показано, как удалить все верхние и нижние колонтитулы в документе Word с помощью C++.

// Пути к исходному и выходному каталогу.
System::String inputDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";

System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleHeaderFooter.docx");

for (System::SharedPtr<Section> section : System::IterateOver<System::SharedPtr<Section>>(doc))
{
	// В разделе возможно до трех разных верхних и нижних колонтитулов (для первой, четной и нечетной страниц).
	// Проверяем и удаляем все.
	System::SharedPtr<HeaderFooter> header;
	System::SharedPtr<HeaderFooter> footer;

	header = section->get_HeadersFooters()->idx_get(HeaderFooterType::HeaderFirst);
	footer = section->get_HeadersFooters()->idx_get(HeaderFooterType::FooterFirst);
	if (header != nullptr)
	{
		header->Remove();
	}
	if (footer != nullptr)
	{
		footer->Remove();
	}

	// Основной верхний и нижний колонтитулы используются для нечетных страниц.
	header = section->get_HeadersFooters()->idx_get(HeaderFooterType::HeaderPrimary);
	footer = section->get_HeadersFooters()->idx_get(HeaderFooterType::FooterPrimary);
	if (header != nullptr)
	{
		header->Remove();
	}
	if (footer != nullptr)
	{
		footer->Remove();
	}

	header = section->get_HeadersFooters()->idx_get(HeaderFooterType::HeaderEven);
	footer = section->get_HeadersFooters()->idx_get(HeaderFooterType::FooterEven);
	if (header != nullptr)
	{
		header->Remove();
	}
	if (footer != nullptr)
	{
		footer->Remove();
	}
}

// Путь к выходному файлу
System::String outputPath = outputDataDir + u"RemoveFooters.docx";

// Сохраните документ.
doc->Save(outputPath);

Получить бесплатную лицензию

Вы можете попробовать API без ограничений по ознакомительной версии, запросив бесплатную временную лицензию.

Вывод

Работа с верхними и нижними колонтитулами в документах Word является распространенным и частым вариантом использования. В этой статье вы узнали, как работать с верхними и нижними колонтитулами в документах Word с помощью C++. В частности, вы узнали, как добавлять и удалять верхние и нижние колонтитулы в документах Word с помощью Aspose.Words for C++ API. API предоставляет множество дополнительных функций для работы с документами Word, которые вы можете подробно изучить, посетив официальную документацию. Если у вас возникнут вопросы, свяжитесь с нами на нашем бесплатном форуме поддержки.

Смотрите также