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

Верхні та нижні колонтитули в документах Word використовуються для форматування та відображення важливої інформації, такої як тема, розділ, номер сторінки, Copywrite тощо. Під час програмної роботи з документами Word вам може знадобитися додати або видалити верхні та нижні колонтитули. З цією метою ця стаття навчить вас додавати та видаляти верхні та нижні колонтитули в документах Word за допомогою C++.

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

PM> Install-Package Aspose.Words.Cpp

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

У цьому прикладі ми створимо новий документ Word і додамо інший заголовок для титульної сторінки. До наступних сторінок ми додамо верхній колонтитул із зображенням і нижній колонтитул із таблицею. Нижче наведено кроки, щоб додати верхні та нижні колонтитули в документи Word.

  • Створіть екземпляр класу Document для представлення документа Word.
  • Створіть екземпляр класу DocumentBuilder, використовуючи створений раніше об’єкт Document.
  • Укажіть, що вам потрібні різні колонтитули для титульної сторінки за допомогою методу PageSetup->setDifferentFirstPageHeaderFooter(bool value).
  • Установіть властивості шрифту для тексту заголовка.
  • Створіть верхній і нижній колонтитули для наступних сторінок.
  • Додайте зображення в заголовок за допомогою DocumentBuilder->InsertImage(System::SharedPtr)System::Drawing::Image зображення, Aspose::Words::Drawing::RelativeHorizontalPosition horzPos, подвійний ліворуч, Aspose::Words::Drawing::RelativeVerticalPosition vertPos, подвійний верх, подвійна ширина, подвійна висота, Aspose::Words::Drawing::WrapType wrapType) метод.
  • Додати таблицю в нижній колонтитул.
  • Збережіть документ Word за допомогою методу Document->Save(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 за допомогою API Aspose.Words for C++. API надає низку додаткових функцій для роботи з документами Word, які ви можете детально вивчити, відвідавши офіційну документацію. У разі будь-яких запитань зв’яжіться з нами на нашому безкоштовному форумі підтримки.

Дивись також