العمل مع الأقسام

في بعض الأحيان قد ترغب في الحصول على مستند ليس له نفس التنسيق في كافة الصفحات. على سبيل المثال، قد تحتاج إلى تعديل تنسيقات أرقام الصفحات، أو تغيير حجم الصفحة واتجاهها، أو جعل صفحة المستند الأولى كصفحة غلاف بدون أي ترقيم. يمكنك تحقيق ذلك من خلال الأقسام.

الأقسام هي عقد مستوى تتحكم في الرؤوس والتذييلات والاتجاه والأعمدة والهوامش وتنسيق أرقام الصفحات وغيرها.

يسمح لك Aspose.Words بإدارة الأقسام وتقسيم المستند إلى أقسام وإجراء تغييرات التنسيق التي تنطبق فقط على قسم معين. يقوم Aspose.Words بتخزين معلومات حول تنسيق القسم مثل الرؤوس والتذييلات وإعداد الصفحة وإعدادات الأعمدة في فاصل القسم.

تشرح هذه المقالة كيفية التعامل مع المقاطع وفواصل المقاطع.

ما هو القسم وفاصل القسم

يتم تمثيل أقسام المستند بواسطة فئتي Section وSectionCollection. كائنات القسم هي عناصر فرعية مباشرة لعقدة Document ويمكن الوصول إليها عبر خاصية Sections. يمكنك إدارة تلك العقد باستخدام بعض الطرق مثل Remove وAdd وIndexOf وغيرها.

يعد الفاصل المقطعي خيارًا يقسم صفحات المستند إلى أقسام ذات تخطيطات قابلة للتخصيص.

أنواع الفواصل المقطعية

يتيح لك Aspose.Words تقسيم المستندات وتنسيقها باستخدام فواصل أقسام مختلفة لتعداد BreakType:

  • قسم فاصل مستمر
  • قسمBreakNewColumn
  • قسمBreakNewPage
  • القسمBreakEvenPage
  • قسمBreakOddPage

يمكنك أيضًا استخدام تعداد SectionStart لاختيار نوع فاصل ينطبق فقط على القسم الأول مثل NewColumn وNewPage وEvenPage وOddPage.

إدارة قسم

نظرًا لأن القسم عبارة عن عقدة مركبة عادية، فيمكن استخدام معالجة العقدة بأكملها API لمعالجة الأقسام: لإضافة الأقسام وإزالتها وعمليات أخرى على الأقسام. يمكنك قراءة المزيد عن العقد في مقالة Aspose.Words Document Object Model (DOM).

ومن ناحية أخرى، يمكنك أيضًا استخدام DocumentBuilder API للعمل مع الأقسام. في هذه المقالة، سنركز على هذه الطريقة المحددة للعمل مع الأقسام.

إدراج أو إزالة فاصل مقطعي

يسمح لك Aspose.Words بإدراج فاصل مقطعي في النص باستخدام طريقة InsertBreak.

يوضح مثال التعليمات البرمجية التالي كيفية إدراج فاصل مقطعي في مستند:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git.
def test_insert_section_breaks(self):
doc = aw.Document(MY_DIR + "Footnotes and endnotes.docx")
builder = aw.DocumentBuilder(doc)
paras = [para.as_paragraph() for para in doc.get_child_nodes(aw.NodeType.PARAGRAPH, True)]
topic_start_paras = []
for para in paras:
style = para.paragraph_format.style_identifier
if style == aw.StyleIdentifier.HEADING1:
topic_start_paras.append(para)
for para in topic_start_paras:
section = para.parent_section
# Insert section break if the paragraph is not at the beginning of a section already.
if para != section.body.first_paragraph:
builder.move_to(para.first_child)
builder.insert_break(aw.BreakType.SECTION_BREAK_NEW_PAGE)
# This is the paragraph that was inserted at the end of the now old section.
# We don't really need the extra paragraph, we just needed the section.
section.body.last_paragraph.remove()

استخدم أسلوب Remove لحذف فاصل مقطعي. إذا لم تكن بحاجة إلى إزالة فاصل مقطعي معين وحذف محتوى هذا القسم بدلاً من ذلك، فيمكنك استخدام طريقة ClearContent.

يوضح مثال التعليمات البرمجية التالي كيفية إزالة فواصل الأقسام:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git.
@staticmethod
def remove_section_breaks(doc: aw.Document):
# Loop through all sections starting from the section that precedes the last one and moving to the first section.
for i in range(doc.sections.count - 2, -1):
# Copy the content of the current section to the beginning of the last section.
doc.last_section.prepend_content(doc.sections[i])
# Remove the copied section.
doc.sections[i].remove()

نقل القسم

إذا كنت تريد نقل قسم من موضع إلى آخر في المستند، فستحتاج إلى الحصول على فهرس هذا القسم. يتيح لك Aspose.Words الحصول على موضع القسم من SectionCollection. يمكنك استخدام خاصية Sections للحصول على كافة الأقسام في مستندك. ولكن إذا كنت تريد الحصول على القسم الأول فقط، فيمكنك استخدام خاصية FirstSection.

يوضح مثال التعليمات البرمجية التالي كيفية الوصول إلى القسم الأول والتكرار عبر العناصر الفرعية للعقدة المركبة:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git.
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
builder.write("Section 1")
builder.move_to_header_footer(aw.HeaderFooterType.HEADER_PRIMARY)
builder.write("Primary header")
builder.move_to_header_footer(aw.HeaderFooterType.FOOTER_PRIMARY)
builder.write("Primary footer")
section = doc.first_section
# A Section is a composite node and can contain child nodes,
# but only if those child nodes are of a "Body" or "HeaderFooter" node type.
for node in section.get_child_nodes(aw.NodeType.ANY, False):
if node.node_type == aw.NodeType.BODY:
body = node.as_body()
print("Body:")
print(f"\t\"{body.get_text().strip()}\"")
if node.node_type == aw.NodeType.HEADER_FOOTER:
header_footer = node.as_header_footer()
print(f"HeaderFooter type: {header_footer.header_footer_type};")
print(f"\t\"{header_footer.get_text().strip()}\"")

تحديد تخطيط القسم

في بعض الأحيان تريد أن يبدو المستند الخاص بك أفضل من خلال إنشاء تخطيطات إبداعية لأقسام مختلفة من المستند. إذا كنت تريد تحديد نوع شبكة القسم الحالية، فيمكنك اختيار وضع تخطيط القسم باستخدام تعداد SectionLayoutMode:

  • تقصير
  • شبكة
  • لاينغريد
  • سناب توشارز

يوضح مثال التعليمات البرمجية التالي كيفية تحديد عدد الأسطر التي قد تحتوي عليها كل صفحة:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git.
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
# Enable pitching, and then use it to set the number of lines per page in this section.
# A large enough font size will push some lines down onto the next page to avoid overlapping characters.
builder.page_setup.layout_mode = aw.SectionLayoutMode.LINE_GRID
builder.page_setup.lines_per_page = 15
builder.paragraph_format.snap_to_grid = True
for i in range(30):
builder.write(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ")
doc.save(ARTIFACTS_DIR + "WorkingWithDocumentOptionsAndSettings.line_grid_section_layout_mode.docx")

تحرير قسم

عندما تقوم بإضافة قسم جديد إلى مستندك، لن يكون هناك أي نص أو فقرة يمكنك تحريرها. يسمح لك Aspose.Words بضمان أن القسم يحتوي على نص يحتوي على فقرة واحدة على الأقل باستخدام طريقة EnsureMinimum - سيضيف تلقائيًا عقدة نص (أو تذييل الرأس) إلى المستند ثم يضيف فقرة إليه.

يوضح مثال الكود التالي كيفية تحضير عقدة قسم جديدة باستخدام EnsureMinimum:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git.
doc = aw.Document()
# If we add a new section like this, it will not have a body, or any other child nodes.
doc.sections.add(aw.Section(doc))
# Run the "EnsureMinimum" method to add a body and a paragraph to this section to begin editing it.
doc.last_section.ensure_minimum()
doc.sections[0].body.first_paragraph.append_child(aw.Run(doc, "Hello world!"))

إلحاق أو إضافة المحتوى مسبقًا

إذا كنت تريد رسم شكل ما أو إضافة نص أو صورة في بداية/نهاية القسم، فيمكنك استخدام أساليب AppendContent وPrependContent لفئة Section.

يوضح مثال التعليمات البرمجية التالي كيفية إلحاق محتوى قسم موجود:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git.
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
builder.write("Section 1")
builder.insert_break(aw.BreakType.SECTION_BREAK_NEW_PAGE)
builder.write("Section 2")
builder.insert_break(aw.BreakType.SECTION_BREAK_NEW_PAGE)
builder.write("Section 3")
section = doc.sections[2]
# Insert the contents of the first section to the beginning of the third section.
section_to_prepend = doc.sections[0]
section.prepend_content(section_to_prepend)
# Insert the contents of the second section to the end of the third section.
section_to_append = doc.sections[1]
section.append_content(section_to_append)

استنساخ القسم

يتيح لك Aspose.Words تكرار قسم عن طريق إنشاء نسخة كاملة منه باستخدام طريقة Clone.

يوضح مثال التعليمات البرمجية التالي كيفية استنساخ القسم الأول في مستندك:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git.
doc = aw.Document(MY_DIR + "Document.docx")
clone_section = doc.sections[0].clone()

نسخ الأقسام بين المستندات

في بعض الحالات، قد يكون لديك مستندات كبيرة تحتوي على العديد من الأقسام وتريد نسخ محتوى قسم من مستند إلى آخر.

يتيح لك Aspose.Words نسخ الأقسام بين المستندات باستخدام طريقة ImportNode.

يوضح مثال التعليمات البرمجية التالي كيفية نسخ المقاطع بين المستندات:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git.
src_doc = aw.Document(MY_DIR + "Document.docx")
dst_doc = aw.Document()
source_section = src_doc.sections[0]
new_section = dst_doc.import_node(source_section, True).as_section()
dst_doc.sections.add(new_section)
dst_doc.save(ARTIFACTS_DIR + "WorkingWithSection.copy_section.docx")
view raw copy-section.py hosted with ❤ by GitHub

العمل مع رأس القسم وتذييله

القواعد الأساسية لعرض رأس أو تذييل الصفحة لكل قسم بسيطة للغاية:

  1. إذا لم يكن للقسم رؤوس/تذييلات خاصة به من نوع معين، فيؤخذ من القسم السابق.
  2. يتم التحكم في نوع الرأس/التذييل المعروض على الصفحة من خلال إعدادات قسم “الصفحة الأولى المختلفة” و"الصفحات الفردية والزوجية المختلفة" - إذا تم تعطيلها، فسيتم تجاهل عناوين القسم الخاصة.

يوضح مثال التعليمات البرمجية التالي كيفية إنشاء قسمين برؤوس مختلفة:

إذا كنت تريد إزالة نص الرؤوس والتذييلات دون إزالة كائنات HeaderFooter في مستندك، فيمكنك استخدام طريقة ClearHeadersFooters. بالإضافة إلى ذلك، يمكنك استخدام أسلوب DeleteHeaderFooterShapes لإزالة كافة الأشكال من الرؤوس والتذييلات في المستند.

يوضح مثال التعليمات البرمجية التالي كيفية مسح محتوى كافة الرؤوس والتذييلات في القسم:

مثال التعليمات البرمجية التالي كيفية إزالة كافة الأشكال من كافة الرؤوس والتذييلات في القسم:

تخصيص خصائص الصفحة في القسم

قبل طباعة صفحة أو مستند، قد ترغب في تخصيص وتعديل حجم وتخطيط صفحة واحدة أو المستند بأكمله. باستخدام إعداد الصفحة، يمكنك تغيير إعدادات صفحات المستند مثل الهوامش والاتجاه والحجم لطباعة صفحات أولى أو صفحات فردية مختلفة.

يتيح لك Aspose.Words تخصيص خصائص الصفحة والأقسام باستخدام فئة PageSetup.

يوضح مثال التعليمات البرمجية التالي كيفية تعيين خصائص مثل حجم الصفحة واتجاهها للقسم الحالي:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git.
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
builder.page_setup.orientation = aw.Orientation.LANDSCAPE
builder.page_setup.left_margin = 50
builder.page_setup.paper_size = aw.PaperSize.PAPER_10X14
doc.save(ARTIFACTS_DIR + "WorkingWithDocumentOptionsAndSettings.page_setup_and_section_formatting.docx")

يوضح مثال التعليمات البرمجية التالي كيفية تعديل خصائص الصفحة في كافة الأقسام:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git.
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
builder.writeln("Section 1")
doc.append_child(aw.Section(doc))
builder.writeln("Section 2")
doc.append_child(aw.Section(doc))
builder.writeln("Section 3")
doc.append_child(aw.Section(doc))
builder.writeln("Section 4")
# It is important to understand that a document can contain many sections,
# and each section has its page setup. In this case, we want to modify them all.
for child in doc:
child.as_section().page_setup.paper_size = aw.PaperSize.LETTER
doc.save(ARTIFACTS_DIR + "WorkingWithSection.modify_page_setup_in_all_sections.doc")

أنظر أيضا