إضافة أو إزالة رأس وتذييل في مستندات Word باستخدام C ++

تُستخدم الرؤوس والتذييلات في مستندات Word لتنسيق وإظهار معلومات مهمة مثل الموضوع والفصل ورقم الصفحة وكتابة النسخ وما إلى ذلك. أثناء العمل مع مستندات Word برمجيًا ، قد تحتاج إلى إضافة أو إزالة الرؤوس والتذييلات. تحقيقًا لهذه الغاية ، ستعلمك هذه المقالة كيفية إضافة وإزالة الرؤوس والتذييلات في مستندات Word باستخدام C ++.

لإضافة الرؤوس والتذييلات في مستندات Word ، سنستخدم واجهة برمجة التطبيقات Aspose.Words for C ++. إنها واجهة برمجة تطبيقات C ++ أصلية تدعم إنشاء مستندات Word وقراءتها وتعديلها دون الحاجة إلى تثبيت Microsoft Word. يمكنك إما تثبيت API من خلال NuGet أو تنزيلها مباشرة من قسم التنزيلات.

PM> Install-Package Aspose.Words.Cpp

يتم تقسيم الرؤوس والتذييلات في مستند Word إلى ثلاثة أقسام ، وصفحة العنوان ، وصفحات زوجية ، وصفحات فردية. يمكنك إضافة رؤوس وتذييلات مختلفة لهذه الأقسام. بالإضافة إلى ذلك ، يمكنك أيضًا إضافة عناصر مثل الصور والجداول في الرؤوس والتذييلات.

في هذا المثال ، سننشئ مستند Word جديدًا ونضيف عنوانًا مختلفًا لصفحة العنوان. سنقوم بإضافة رأس مع صورة وتذييل مع جدول إلى الصفحات اللاحقة. فيما يلي خطوات إضافة الرؤوس والتذييلات في مستندات Word.

يوضح نموذج التعليمات البرمجية التالي كيفية إضافة الرؤوس والتذييلات في مستندات 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);

احصل على رخصة مجانية

يمكنك تجربة واجهة برمجة التطبيقات بدون قيود تقييمية عن طريق طلب ترخيص مؤقت مجاني.

استنتاج

يعد العمل مع الرؤوس والتذييلات في مستندات Word حالة استخدام شائعة ومتكررة. في هذه المقالة ، تعلمت كيفية العمل مع الرؤوس والتذييلات في مستندات Word باستخدام C ++. على وجه التحديد ، لقد تعلمت كيفية إضافة وإزالة الرؤوس والتذييلات في مستندات Word باستخدام Aspose.Words for C ++ API. توفر واجهة برمجة التطبيقات مجموعة من الميزات الإضافية للعمل مع مستندات Word التي يمكنك استكشافها بالتفصيل من خلال زيارة الوثائق الرسمية. في حالة وجود أي أسئلة ، لا تتردد في الاتصال بنا على منتدى الدعم المجاني.

أنظر أيضا