فهرست مطالب (TOC) بخش مهمی از یک سند Word است. این یک نمای کلی از محتوای سند را ارائه می دهد و به شما امکان می دهد به سرعت به بخش مورد نظر خود بروید. ممکن است خود را در سناریوهایی بیابید که نیاز به اضافه کردن، استخراج، به روز رسانی یا حذف فهرست مطالب از اسناد Word به صورت برنامه ای داشته باشید. برای این منظور، این مقاله نحوه کار با فهرست مطالب فایل های Word را با استفاده از C++ به شما آموزش می دهد.

C++ API برای کار با فهرست مطالب در اسناد Word

Aspose.Words for C++ یک کتابخانه بومی C++ است که به شما امکان می دهد اسناد Microsoft Word را ایجاد، بخوانید، تغییر دهید و تبدیل کنید. علاوه بر این، از کار با فهرست مطالب در فایل های Word نیز پشتیبانی می کند. می‌توانید API را از طریق NuGet نصب کنید یا آن را مستقیماً از بخش Downloads دانلود کنید.

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 استخراج کنید

مراحل زیر برای استخراج فهرست مطالب از یک سند Word است.

  • فایل Word را با استفاده از کلاس Document بارگیری کنید.
  • فیلدها را با استفاده از روش 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);

		// بررسی کنید که آیا فیلد متعلق به TOC است
		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());

				// مکانی را دریافت کنید که این مورد TOC به آن اشاره می کند
				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 را با استفاده از کلاس Document بارگیری کنید.
  • فهرستی از گره های FieldStart را بازیابی و ذخیره کنید.
  • در میان گره ها حلقه بزنید تا به گره ای از نوع NodeType::FieldEnd برسید که انتهای فهرست مطالب را مشخص می کند.
  • فهرست مطالب را با استفاده از روش Node->Remove() حذف کنید.
  • سند Word را با استفاده از روش Document->Save(System::String fileName) ذخیره کنید.

کد نمونه زیر نحوه حذف فهرست مطالب از یک سند Word را با استفاده از C++ نشان می دهد.

void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
	// برای دسترسی سریع، گره های FieldStart فیلدهای TOC را در سند ذخیره کنید.
	std::vector<System::SharedPtr<FieldStart>> fieldStarts;
	// این لیستی برای ذخیره گره های موجود در TOC مشخص شده است. حذف خواهند شد
	// در پایان این روش
	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);
		}
	}

	// اطمینان حاصل کنید که TOC مشخص شده توسط شاخص تصویب شده وجود دارد.
	if (index > fieldStarts.size() - 1)
	{
		throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
	}

	bool isRemoving = true;

	// FieldStart TOC مشخص شده را دریافت کنید.
	System::SharedPtr<Node> currentNode = fieldStarts[index];

	while (isRemoving)
	{
		// ایمن تر است که این گره ها را ذخیره کنید و بعداً همه آنها را به یکباره حذف کنید.
		nodeList.push_back(currentNode);
		currentNode = currentNode->NextPreOrder(doc);

		// هنگامی که با یک گره FieldEnd از نوع FieldTOC روبرو می شویم، می دانیم که در پایان هستیم
		// از TOC فعلی و ما می توانیم در اینجا توقف کنیم.
		if (currentNode->get_NodeType() == NodeType::FieldEnd)
		{
			System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
			if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
			{
				isRemoving = false;
			}
		}
	}

	// تمام گره های موجود در TOC مشخص شده را حذف کنید.
	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);
}

مجوز رایگان دریافت کنید

با درخواست [مجوز موقت رایگان] می‌توانید API را بدون محدودیت ارزیابی امتحان کنید.

نتیجه

در این مقاله نحوه کار با فهرست مطالب در اسناد Word با استفاده از C++ را یاد گرفتید. مراحل و کد نمونه مورد نیاز برای افزودن، استخراج، به روز رسانی و حذف فهرست مطالب از اسناد Word را مشاهده کرده اید. Aspose.Words برای C++ بسیاری از ویژگی های اضافی را برای کار با فایل های Word فراهم می کند. می‌توانید با مراجعه به مستندات رسمی API را با جزئیات بررسی کنید. در صورت وجود هرگونه سوال، لطفاً در [تالار گفتمان پشتیبانی رایگان21 ما با ما تماس بگیرید.

همچنین ببینید