תוכן העניינים (TOC) הוא חלק חשוב ממסמך Word. הוא מספק סקירה כללית של תוכן המסמך ומאפשר לנווט במהירות אל הקטע הרצוי. אתה עלול למצוא את עצמך בתרחישים שבהם עליך להוסיף, לחלץ, לעדכן או להסיר את תוכן העניינים ממסמכי Word באופן תוכנתי. לשם כך, מאמר זה ילמד אותך כיצד לעבוד עם תוכן העניינים בקובצי Word באמצעות C++.
- C++ API לעבודה עם תוכן עניינים במסמכי Word
- הוסף את תוכן העניינים במסמך Word
- חלץ את תוכן העניינים ממסמך Word
- עדכן את תוכן העניינים במסמך Word
- הסר את תוכן העניינים ממסמך Word
C++ API לעבודה עם תוכן עניינים במסמכי Word
Aspose.Words for C++ היא ספריית C++ מקורית המאפשרת לך ליצור, לקרוא, לשנות ולהמיר מסמכי Microsoft Word. בנוסף, הוא גם תומך בעבודה עם תוכן העניינים בקבצי וורד. אתה יכול להתקין את ה-API דרך NuGet או להוריד אותו ישירות מהקטע הורדות.
PM> Install-Package Aspose.Words.Cpp
הוסף את תוכן העניינים במסמך Word
להלן השלבים להוספת תוכן עניינים במסמך Word.
- טען את קובץ Word באמצעות המחלקה Document.
- צור מופע של המחלקה DocumentBuilder באמצעות האובייקט Document שנוצר בעבר.
- הכנס את תוכן העניינים בשיטת DocumentBuilder->InsertTableOfContents(System::String switches).
- אכלס את תוכן העניינים באמצעות השיטה Document->UpdateFields().
- שמור את מסמך Word באמצעות השיטה מסמך->שמור(System::String fileName).
הקוד לדוגמה הבא מראה כיצד להוסיף תוכן עניינים במסמך 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.
- אחזר את השדות באמצעות שיטת 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\\";
// פתח מסמך וורד
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.