תוכן העניינים (TOC) הוא חלק חשוב ממסמך Word. הוא מספק סקירה כללית של תוכן המסמך ומאפשר לנווט במהירות אל הקטע הרצוי. אתה עלול למצוא את עצמך בתרחישים שבהם עליך להוסיף, לחלץ, לעדכן או להסיר את תוכן העניינים ממסמכי Word באופן תוכנתי. לשם כך, מאמר זה ילמד אותך כיצד לעבוד עם תוכן העניינים בקובצי Word באמצעות C++.

C++ API לעבודה עם תוכן עניינים במסמכי Word

Aspose.Words for C++ היא ספריית C++ מקורית המאפשרת לך ליצור, לקרוא, לשנות ולהמיר מסמכי Microsoft 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

להלן השלבים לחילוץ תוכן העניינים ממסמך 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 באמצעות 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\\";

	// פתח מסמך וורד
	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 ללא מגבלות הערכה על ידי בקשת [רישיון זמני בחינם].19

סיכום

במאמר זה, למדת כיצד לעבוד עם תוכן העניינים במסמכי Word באמצעות C++. ראית את השלבים ואת הקוד לדוגמה הנדרשים כדי להוסיף, לחלץ, לעדכן ולהסיר את תוכן העניינים ממסמכי Word. Aspose.Words עבור C++ מספק תכונות נוספות רבות לעבודה עם קובצי Word. אתה יכול לחקור את ה-API בפירוט על ידי ביקור בתיעוד הרשמי. בכל שאלה, אנא אל תהסס לפנות אלינו ב[פורום התמיכה החינמי] שלנו21.

ראה גם