العمل مع جدول المحتويات
غالبًا ما ستعمل مع المستندات التي تحتوي على جدول المحتويات (TOC). باستخدام Aspose.Words، يمكنك إدراج جدول المحتويات الخاص بك أو إعادة بناء جدول المحتويات الموجود في المستند بالكامل باستخدام بضعة أسطر من التعليمات البرمجية. توضح هذه المقالة كيفية العمل مع حقل جدول المحتويات وتوضح:
- كيفية إدراج ملف
TOC
جديد - تحديث جداول المحتويات الجديدة أو الموجودة في المستند.
- تحديد مفاتيح للتحكم في التنسيق والبنية العامة لجدول المحتويات.
- كيفية تعديل أنماط ومظهر جدول المحتويات.
- كيفية إزالة حقل
TOC
بالكامل مع كافة الإدخالات الموجودة في المستند.
إدراج جدول محتويات برمجياً
يمكنك إدراج حقل TOC
(جدول المحتويات) في المستند في الموضع الحالي عن طريق استدعاء الأسلوب DocumentBuilder.insert_table_of_contents.
يمكن إنشاء جدول محتويات مستند Word بعدة طرق وتنسيقه باستخدام مجموعة متنوعة من الخيارات. يقوم الحقل بتبديل الذي تمرره إلى الطريقة التي تتحكم في طريقة إنشاء الجدول وعرضه في مستندك.
المفاتيح الافتراضية المستخدمة في TOC
المدرج في Microsoft Word هي "\o “1-3 \h \z \u”. يمكن العثور على أوصاف رموز التبديل هذه بالإضافة إلى قائمة بالمفاتيح المدعومة لاحقًا في المقالة. يمكنك إما استخدام هذا الدليل للحصول على المفاتيح الصحيحة أو إذا كان لديك بالفعل مستند يحتوي على TOC
المشابه الذي تريده، فيمكنك إظهار رموز الحقول (ALT+F9) ونسخ المفاتيح مباشرة من الحقل.
يوضح مثال التعليمات البرمجية التالي كيفية إدراج حقل “جدول المحتويات” في مستند:
يوضح الرمز جدول المحتويات الجديد الذي يتم إدراجه في مستند فارغ. يتم بعد ذلك استخدام فئة DocumentBuilder لإدراج بعض نماذج تنسيق المحتوى باستخدام أنماط العناوين المناسبة التي يتم استخدامها لتمييز المحتوى المراد تضمينه في جدول المحتويات. تقوم الأسطر التالية بعد ذلك بملء TOC
عن طريق تحديث الحقول وتخطيط الصفحة للمستند.
TOC
، ولكن بدون محتوى مرئي. وذلك لأنه تم إدراج حقل TOC
ولكن لم يتم ملؤه بعد حتى يتم تحديثه في المستند. تتم مناقشة مزيد من المعلومات حول هذا في القسم التالي.
تحديث جدول المحتويات
يتيح لك Aspose.Words تحديث ملف TOC
بالكامل باستخدام بضعة أسطر فقط من التعليمات البرمجية. يمكن القيام بذلك لملء ملف TOC
المدرج حديثًا أو لتحديث ملف TOC
موجود بعد إجراء التغييرات على المستند. يجب استخدام الطريقتين التاليتين لتحديث حقول TOC
في المستند:
يرجى ملاحظة أنه يلزم استدعاء طريقتي التحديث هاتين بهذا الترتيب. إذا تم العكس، فسيتم ملء جدول المحتويات ولكن لن يتم عرض أي أرقام للصفحات. يمكن تحديث أي عدد من جداول المحتويات المختلفة. ستقوم هذه الطرق تلقائيًا بتحديث جميع جداول المحتويات الموجودة في المستند.
يوضح مثال التعليمات البرمجية التالي كيفية إعادة إنشاء حقول TOC
بالكامل في المستند عن طريق استدعاء تحديث الحقل:
سيؤدي الاستدعاء الأول لـ Document.update_fields إلى إنشاء ملف TOC
، ويتم ملء كافة إدخالات النص ويظهر ملف TOC
مكتملًا تقريبًا. الشيء الوحيد المفقود هو أرقام الصفحات التي يتم عرضها حاليًا بـ “؟”. سيؤدي الاستدعاء الثاني إلى Document.update_page_layout إلى إنشاء تخطيط المستند في الذاكرة. يجب القيام بذلك لجمع أرقام صفحات الإدخالات. يتم بعد ذلك إدراج أرقام الصفحات الصحيحة المحسوبة من هذا الاستدعاء في جدول المحتويات.
استخدم المفاتيح للتحكم في سلوك جدول المحتويات.
كما هو الحال مع أي حقل آخر، يمكن لحقل TOC
قبول المفاتيح المحددة ضمن رمز الحقل الذي يتحكم في كيفية إنشاء جدول المحتويات. يتم استخدام مفاتيح معينة للتحكم في الإدخالات التي سيتم تضمينها وعلى أي مستوى بينما يتم استخدام مفاتيح أخرى للتحكم في مظهر جدول المحتويات. يمكن دمج المفاتيح معًا للسماح بإنتاج جدول محتويات معقد.
بشكل افتراضي، يتم تضمين رموز التبديل هذه أعلاه عند إدراج TOC
افتراضي في المستند. سيتضمن TOC
الذي لا يحتوي على مفاتيح تبديل محتوى من أنماط العناوين المضمنة (كما لو تم ضبط المفتاح \O). محولات TOC
المتوفرة التي يدعمها Aspose.Words مدرجة أدناه ويتم وصف استخداماتها بالتفصيل. ويمكن تقسيمها إلى أقسام منفصلة بناءً على نوعها. تحدد المفاتيح الموجودة في القسم الأول المحتوى الذي سيتم تضمينه في TOC
وتتحكم المفاتيح الموجودة في القسم الثاني في مظهر جدول المحتويات. إذا لم يكن المحول مدرجًا هنا، فهو غير مدعوم حاليًا. سيتم دعم جميع المفاتيح في الإصدارات المستقبلية. نحن نضيف المزيد من الدعم مع كل إصدار.
مفاتيح وضع علامات الدخول
يُحوّل | وصف |
---|---|
Heading Styles (\التبديل) |
يحدد رمز التبديل هذا أن يتم تضمين أي محتوى منسق بهذه الأنماط في جدول المحتويات. سيحدد مستوى العنوان المستوى الهرمي المقابل للإدخال في جدول المحتويات. على سبيل المثال، سيتم التعامل مع فقرة ذات نمط عنوان 1 على أنها المستوى الأول في |
Outline Levels (\التبديل) |
يمكن لكل فقرة تحديد مستوى المخطط التفصيلي ضمن خيارات الفقرة. يحدد هذا الإعداد المستوى الذي يجب التعامل مع هذه الفقرة في التسلسل الهرمي للمستند. هذه ممارسة شائعة الاستخدام لتنظيم تخطيط المستند بسهولة. يمكن عرض هذا التسلسل الهرمي عن طريق التغيير إلى عرض المخطط التفصيلي في Microsoft Word. كما هو الحال مع أنماط العناوين، يمكن أن يكون هناك من 1 إلى 9 مستويات للمخطط التفصيلي بالإضافة إلى مستوى “النص الأساسي”. ستظهر مستويات المخطط التفصيلي 1 - 9 في لاحظ أن أنماط العناوين المضمنة مثل العنوان 1 لها مستوى مخطط تفصيلي إلزامي تم تعيينه في إعدادات النمط.
|
Custom Styles (\T التبديل) |
سيسمح رمز التبديل هذا باستخدام الأنماط المخصصة عند تجميع الإدخالات لاستخدامها في جدول المحتويات. يُستخدم هذا غالبًا مع رمز التبديل \O لتضمين أنماط مخصصة مع أنماط العناوين المضمنة في جدول المحتويات.
سيستخدم المحتوى المصمم بـ CustomHeading1 كمحتوى المستوى 1 في |
Use TC Fields (\F و\L التبديلات) |
في الإصدارات الأقدم من Microsoft Word، كانت الطريقة الوحيدة لإنشاء FieldType.FieldTOCEntry .يتم استخدام رمز التبديل \F في TOC لتحديد أنه يجب استخدام حقول TC كإدخالات. ويعني التبديل من تلقاء نفسه دون أي معرف إضافي أنه سيتم تضمين أي حقل TC في المستند. ستحدد أي معلمة إضافية، غالبًا ما تكون حرفًا واحدًا، أن حقول TC التي تحتوي على مفتاح \f مطابق فقط هي التي سيتم تضمينها في جدول المحتويات. على سبيل المثال *
سيتضمن فقط حقول TC مثل
يحتوي حقل يمكن أيضًا أن تحتوي حقول - \F – تم شرحه أعلاه. - \L – يحدد المستوى الذي سيظهر فيه حقل TC هذا في - |
المظهر المتعلق بالمفاتيح
يُحوّل | وصف |
---|---|
Omit Page Numbers (\N التبديل) |
يتم استخدام رمز التبديل هذا لإخفاء أرقام الصفحات لمستويات معينة من جدول المحتويات. على سبيل المثال يمكنك تحديد
وسيتم إخفاء أرقام الصفحات الموجودة في إدخالات المستويين 3 و4 مع النقاط الرئيسية (إن وجدت). لتحديد مستوى واحد فقط، يجب الاستمرار في استخدام النطاق، على سبيل المثال، “1-1” سوف يستبعد أرقام الصفحات للمستوى الأول فقط. |
Insert As Hyperlinks (\H التبديل) |
يحدد رمز التبديل هذا إدراج |
Set Separator Character (\P التبديل) |
يسمح رمز التبديل هذا بتغيير المحتوى الذي يفصل بين عنوان الإدخال وترقيم الصفحات بسهولة في جدول المحتويات. يجب تحديد الفاصل الذي سيتم استخدامه بعد رمز التبديل هذا وإحاطته بعلامات الكلام. |
Preserve Tab Entries (\W التبديل) |
سيؤدي استخدام رمز التبديل هذا إلى تحديد أنه سيتم الاحتفاظ بأي إدخالات تحتوي على حرف علامة تبويب، على سبيل المثال، عنوان يحتوي على علامة تبويب في نهاية السطر، كحرف علامة تبويب مناسب عند تعبئة جدول المحتويات. وهذا يعني أن وظيفة حرف علامة التبويب ستكون موجودة في |
Preserve New Line Entries (\X التبديل) |
كما هو الحال مع رمز التبديل أعلاه، يحدد رمز التبديل هذا أنه سيتم الاحتفاظ بالعناوين الممتدة عبر أسطر متعددة (باستخدام أحرف سطر جديدة وليس فقرات منفصلة) كما هي في جدول المحتويات الذي تم إنشاؤه. على سبيل المثال، يمكن للعنوان الذي سيتم نشره عبر أسطر متعددة استخدام حرف السطر الجديد (Ctrl + Enter أو |
أدخل حقول TC
يمكنك إدراج حقل TC جديد في الموضع الحالي لـ DocumentBuilder عن طريق استدعاء طريقة DocumentBuilder.insert_field وتحديد اسم الحقل كـ “TC” مع أي مفاتيح مطلوبة. يوضح المثال أدناه كيفية إدراج حقل TC
في المستند باستخدام DocumentBuilder.
تعديل جدول المحتويات
لا يستخدم تنسيق الإدخالات في TOC
الأنماط الأصلية للإدخالات المحددة، وبدلاً من ذلك يتم تنسيق كل مستوى باستخدام نمط TOC
مكافئ. على سبيل المثال، يتم تنسيق المستوى الأول في TOC
بنمط جدول المحتويات1، ويتم تنسيق المستوى الثاني بنمط TOC2، وهكذا. وهذا يعني أنه لتغيير مظهر TOC
يجب تعديل هذه الأنماط. في Aspose.Words، يتم تمثيل هذه الأنماط بواسطة لغة StyleIdentifier.TOC1 المستقلة حتى StyleIdentifier.TOC9 ويمكن استرجاعها من مجموعة Document.styles باستخدام هذه المعرفات.
بمجرد استرداد النمط المناسب للمستند، يمكن تعديل التنسيق لهذا النمط. ستنعكس أي تغييرات يتم إجراؤها على هذه الأنماط تلقائيًا على جداول المحتويات في المستند. يوضح المثال أدناه خاصية التنسيق المستخدمة في نمط TOC
للمستوى الأول.
ومن المفيد أيضًا ملاحظة أن أي تنسيق مباشر لفقرة (محددة في الفقرة نفسها وليس في النمط) تم وضع علامة عليها لتضمين TOC
سيتم نسخه في الإدخال الموجود في جدول المحتويات. على سبيل المثال، إذا تم استخدام نمط العنوان 1 لوضع علامة على محتوى TOC
وكان لهذا النمط تنسيق غامق بينما تحتوي الفقرة أيضًا على تنسيق مائل مطبق عليها مباشرة. لن يكون إدخال TOC
الناتج غامقًا لأنه جزء من تنسيق النمط ولكنه سيكون مائلًا لأنه يتم تنسيقه مباشرة على الفقرة.
يمكنك أيضًا التحكم في تنسيق الفواصل المستخدمة بين كل إدخال ورقم الصفحة. افتراضيًا، يكون هذا خطًا منقطًا يمتد عبر ترقيم الصفحات باستخدام حرف علامة جدولة وعلامة جدولة على اليمين بالقرب من الهامش الأيمن.
باستخدام فئة Style التي تم استردادها لمستوى TOC
المحدد الذي تريد تعديله، يمكنك أيضًا تعديل كيفية ظهورها في المستند. لتغيير كيفية ظهور هذا أولاً، يجب استدعاء Style.paragraph_format لاسترداد تنسيق الفقرة للنمط. من هذا يمكن استرداد علامات الجدولة عن طريق استدعاء ParagraphFormat.tab_stops وتعديل علامة الجدولة المناسبة. باستخدام هذه التقنية نفسها، يمكن نقل علامة التبويب نفسها أو إزالتها معًا. يوضح المثال أدناه كيفية تعديل موضع علامة التبويب اليمنى في الفقرات ذات الصلة بـ TOC
.
إزالة جدول المحتويات من المستند
يمكن إزالة جدول المحتويات من المستند عن طريق إزالة جميع العقد الموجودة بين عقدة FieldStart وFieldEnd لحقل TOC
. يوضح الكود أدناه هذا. تعد إزالة حقل TOC
أبسط من الحقل العادي لأننا لا نتتبع الحقول المتداخلة. بدلاً من ذلك، نتحقق من أن عقدة FieldEnd من النوع FieldType.FIELD_TOC مما يعني أننا واجهنا نهاية جدول المحتويات الحالي. يمكن استخدام هذه التقنية في هذه الحالة دون القلق بشأن أي حقول متداخلة حيث يمكننا أن نفترض أن أي مستند تم تشكيله بشكل صحيح لن يحتوي على حقل TOC
متداخل بالكامل داخل حقل TOC
آخر.
أولاً، يتم جمع وتخزين عقد FieldStart لكل TOC
. يتم بعد ذلك تعداد TOC
المحدد بحيث تتم زيارة جميع العقد داخل الحقل وتخزينها. ثم تتم إزالة العقد من المستند. يوضح نموذج Below code كيفية إزالة TOC
محدد من مستند.
استخراج جدول المحتويات
إذا كنت تريد استخراج جدول محتويات من أي مستند Word، فيمكن استخدام نموذج التعليمات البرمجية التالي.
doc = aw.Document(docs_base.my_dir + "Table of contents.docx")
for field in doc.range.fields :
if (field.type == aw.fields.FieldType.FIELD_HYPERLINK) :
hyperlink = field.as_field_hyperlink()
if (hyperlink.sub_address != None and hyperlink.sub_address.find("_Toc") == 0) :
tocItem = field.start.get_ancestor(aw.NodeType.PARAGRAPH).as_paragraph()
print(tocItem.to_string(aw.SaveFormat.TEXT).strip())
print("------------------")
bm = doc.range.bookmarks.get_by_name(hyperlink.sub_address)
pointer = bm.bookmark_start.get_ancestor(aw.NodeType.PARAGRAPH).as_paragraph()
print(pointer.to_string(aw.SaveFormat.TEXT))