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

واجهة برمجة تطبيقات C ++ للعمل مع جدول المحتويات في مستندات Word

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

PM> Install-Package Aspose.Words.Cpp

أضف جدول المحتويات في مستند Word

فيما يلي خطوات إضافة جدول محتويات في مستند Word.

يُظهر نموذج التعليمات البرمجية التالي كيفية إضافة جدول محتويات في مستند Word باستخدام C ++.

// مسارات دليل المصدر والمخرجات.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";

// قم بتحميل ملف Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"Sample 5.docx");

// قم بإنشاء مثيل لفئة DocumentBuilder
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);

// أدخل جدول محتويات في بداية المستند.
builder->InsertTableOfContents(u"\\o \"1-3\" \\h \\z \\u");

// سيكون جدول المحتويات المُدرج حديثًا فارغًا في البداية.
// يجب أن يتم ملؤها عن طريق تحديث الحقول في المستند.
doc->UpdateFields();

// مسار ملف الإخراج
System::String outputPath = outputDataDir + u"AddTOC.docx";

// احفظ ملف Word
doc->Save(outputPath);
ملف إخراج يحتوي على جدول المحتويات

ملف إخراج يحتوي على جدول المحتويات

استخراج جدول المحتويات من مستند Word

فيما يلي خطوات استخراج جدول المحتويات من مستند Word.

  • قم بتحميل ملف Word باستخدام فئة مستند.
  • استرجع الحقول باستخدام طريقة Document-> getRange() -> getFields() وحلقة فوقها.
  • تحقق مما إذا كان الحقل من النوع FieldType :: FieldHyperlink.
  • تحقق مما إذا كان الحقل ينتمي إلى جدول المحتويات.
  • استرداد وطباعة المعلومات الميدانية.

يوضح نموذج التعليمات البرمجية التالي كيفية استخراج جدول المحتويات من مستند Word باستخدام C ++.

// مصدر الدليل
System::String inputDataDir = u"SourceDirectory\\";

// قم بتحميل ملف Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleTOC.docx");

// حلقة عبر الحقول
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
	// احصل على حقول FieldHyperlink
	if (field->get_Type() == FieldType::FieldHyperlink)
	{
		System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);

		// تحقق مما إذا كان الحقل ينتمي إلى جدول المحتويات
		if (hyperlink->get_SubAddress() != nullptr && hyperlink->get_SubAddress().StartsWith(u"_Toc"))
		{
			System::SharedPtr<Paragraph> tocItem = System::DynamicCast<Paragraph>(field->get_FieldStart()->GetAncestor(NodeType::Paragraph));
			std::cout << System::StaticCast<Node>(tocItem)->ToString(SaveFormat::Text).Trim().ToUtf8String() << std::endl;
			std::cout << "------------------" << std::endl;
			if (tocItem != nullptr)
			{
				System::SharedPtr<Bookmark> bm = doc->get_Range()->get_Bookmarks()->idx_get(hyperlink->get_SubAddress());

				// احصل على الموقع الذي يشير إليه عنصر جدول المحتويات هذا
				System::SharedPtr<Paragraph> pointer = System::DynamicCast<Paragraph>(bm->get_BookmarkStart()->GetAncestor(NodeType::Paragraph));
				std::cout << System::StaticCast<Node>(pointer)->ToString(SaveFormat::Text).ToUtf8String() << std::endl;
			}
		}
	}
}

قم بتحديث جدول المحتويات في مستند Word

إذا تم تحديث محتوى المستند ، وتحتاج إلى عكس هذه التغييرات في جدول المحتويات ، فأنت تحتاج ببساطة إلى تحميل ملف Word واستدعاء طريقة Document-> UpdateFields(). ستعمل هذه الطريقة على تحديث جدول المحتويات وفقًا للمحتوى المعدل. بعد ذلك ، احفظ مستند Word المحدث.

قم بإزالة جدول المحتويات من مستند Word

فيما يلي خطوات إزالة جدول المحتويات من مستند Word.

  • قم بتحميل ملف Word باستخدام فئة مستند.
  • استرجع قائمة بعقد FieldStart وقم بتخزينها.
  • قم بالتكرار خلال العقد حتى تصل إلى العقدة من النوع NodeType :: FieldEnd التي تحدد نهاية جدول المحتويات.
  • قم بإزالة جدول المحتويات باستخدام طريقة Node-> Remove().
  • احفظ مستند Word باستخدام الطريقة Document-> Save (System :: String fileName).

يُظهر نموذج التعليمات البرمجية التالي كيفية إزالة جدول المحتويات من مستند Word باستخدام C ++.

void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
	// قم بتخزين عقد FieldStart لحقول جدول المحتويات في المستند للوصول السريع.
	std::vector<System::SharedPtr<FieldStart>> fieldStarts;
	// هذه قائمة لتخزين العقد الموجودة داخل جدول المحتويات المحدد. سيتم إزالتها
	// في نهاية هذه الطريقة.
	std::vector<System::SharedPtr<Node>> nodeList;

	for (System::SharedPtr<FieldStart> start : System::IterateOver<System::SharedPtr<FieldStart>>(doc->GetChildNodes(NodeType::FieldStart, true)))
	{
		if (start->get_FieldType() == FieldType::FieldTOC)
		{
			// قم بإضافة جميع FieldStarts من النوع FieldTOC.
			fieldStarts.push_back(start);
		}
	}

	// تأكد من وجود جدول المحتويات المحدد بواسطة الفهرس الذي تم تمريره.
	if (index > fieldStarts.size() - 1)
	{
		throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
	}

	bool isRemoving = true;

	// احصل على FieldStart من جدول المحتويات المحدد.
	System::SharedPtr<Node> currentNode = fieldStarts[index];

	while (isRemoving)
	{
		// من الآمن تخزين هذه العقد وحذفها جميعًا مرة واحدة لاحقًا.
		nodeList.push_back(currentNode);
		currentNode = currentNode->NextPreOrder(doc);

		// بمجرد أن نواجه عقدة FieldEnd من النوع FieldTOC ، فإننا نعلم أننا في النهاية
		// من جدول المحتويات الحالي ويمكننا التوقف هنا.
		if (currentNode->get_NodeType() == NodeType::FieldEnd)
		{
			System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
			if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
			{
				isRemoving = false;
			}
		}
	}

	// قم بإزالة جميع العقد الموجودة في جدول المحتويات المحدد.
	for (System::SharedPtr<Node> node : nodeList)
	{
		node->Remove();
	}
}

int main()
{
	// مسارات دليل المصدر والمخرجات.
	System::String sourceDataDir = u"SourceDirectory\\";
	System::String outputDataDir = u"OutputDirectory\\";

	// افتح مستند Word
	System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"SampleTOC.docx");

	// قم بإزالة أول جدول محتويات من المستند.
	RemoveTableOfContents(doc, 0);

	// مسار ملف الإخراج
	System::String outputPath = outputDataDir + u"RemoveTOC.docx";

	// احفظ ملف Word
	doc->Save(outputPath);
}

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

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

استنتاج

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

أنظر أيضا