Робота з розділами
Робота з розділами
Документ Word розділений на один або кілька розділів, кожен зі своїми налаштуваннями сторінки, полями, колонтитулами та нижніми колонтитулами. Aspose.Words FOSS для .NET представляє розділ як Section вузол, що містить Body і, за бажанням, колонтитули та нижні колонтитули, плюс PageSetup який керує його макетом. На цій сторінці розглядаються модель об’єкта розділу, налаштування сторінки, колонтитули та нижні колонтитули, а також багатостовпчикове розташування тексту.
Модель об’єктів розділу
Document.Sections повертає SectionCollection — кожен Section у документі, кожен з яких є CompositeNode і частиною дерева вузлів. Section містить один Body (це Story, що містить основні абзаци та таблиці розділу) і, за наявності, вузли HeaderFooter, доступні через Section.HeadersFooters, HeaderFooterCollection. Document.FirstSection і Document.LastSection забезпечують прямий доступ до граничних розділів. Section.AppendContent(), PrependContent() і ClearContent() маніпулюють вмістом тіла розділу пакетно, тоді як ClearHeadersFooters() і DeleteHeaderFooterShapes() очищують вміст заголовка/нижнього колонтитула.
Створення розділів та розривів розділів
DocumentBuilder.InsertBreak(BreakType) вставляє розрив у позиції курсору; BreakType включає SectionBreakNewPage, SectionBreakContinuous, SectionBreakNewColumn, SectionBreakEvenPage та SectionBreakOddPage для початку нового розділу, разом із значеннями, що не стосуються розділів, PageBreak, ColumnBreak, LineBreak та ParagraphBreak. DocumentBuilder.MoveToSection() переміщує курсор на початок тіла конкретного розділу. PageSetup.SectionStart читає або встановлює тип розриву SectionStart, зафіксований у існуючому розділі.
Налаштування сторінки
Section.PageSetup є PageSetup екземпляром, що охоплює розміри сторінки та поля (PageWidth, PageHeight, TopMargin, BottomMargin, LeftMargin, RightMargin, Gutter), Orientation і PaperSize, а також межі сторінки по кожному боці (Borders, BorderAppliesTo через PageBorderAppliesTo, BorderDistanceFrom через PageBorderDistanceFrom, BorderAlwaysInFront, BorderSurroundsHeader, BorderSurroundsFooter). Нумерація рядків керується LineNumberRestartMode, LineNumberCountBy, LineNumberDistanceFromText та LineStartingNumber. PageSetup.ClearFormatting() скидає їх до значень за замовчуванням.
Заголовки та колонтитули
Section.HeadersFooters є HeaderFooterCollection з типізованими доступниками — HeaderPrimary, HeaderFirst, HeaderEven, FooterPrimary, FooterFirst, FooterEven — разом із GetByHeaderFooterType(), Add() та LinkToPrevious(). Кожен HeaderFooter є Story (наприклад, Body), ідентифікованим за його HeaderFooterType та позначеним як IsHeader / IsLinkedToPrevious. PageSetup.DifferentFirstPageHeaderFooter і PageSetup.OddAndEvenPagesHeaderFooter керують тим, чи Word очікує використання варіантів заголовка/колонтитула для першої сторінки та парних сторінок.
Кілька текстових колонок
PageSetup.TextColumns повертає TextColumnCollection (Count, EvenlySpaced, LineBetween, Spacing, Width) з SetCount() для розташування тіла розділу в декількох колонках. Окремі колонки є TextColumn екземплярами (Width, SpaceAfter) після того, як колекція заповниться більш ніж однією колонкою.
Поради та кращі практики
- Розрив розділу несе форматування для розділу, який follows він – встановлює
PageSetupвластивості наSectionви щойно створили (післяInsertBreak) впливає на вміст, який йде після розриву, а не перед ним. - Використовуйте
SectionBreakContinuous, коли потрібна лише зміна налаштувань сторінки (наприклад, перехід на багатоколоночний текст) без створення нової сторінки; використовуйтеSectionBreakNewPage, коли новий розділ має завжди починатися на новій сторінці. HeaderFooterCollection.LinkToPrevious()підключає заголовок/колонтитул розділу до успадкування вмісту попереднього розділу – робіть це перед записом нового вмісту заголовка/колонтитула, якщо ви хочете, щоб новий розділ починався незалежно від попереднього.PageSetup.DifferentFirstPageHeaderFooterіOddAndEvenPagesHeaderFooterдіють лише якщо відповідні варіантиHeaderFooterType(HeaderFirst,HeaderEvenтощо) дійсно існують уSection.HeadersFooters– увімкніть прапорець і додайте відповідний заголовок/колонтитул разом.Section.Bodyі коженHeaderFooterє окремими екземплярамиStory–Range.Fields, закладки та інші операції, обмежені діапазоном, уBodyрозділу не охоплюють автоматично його заголовки та колонтитули.
Типові проблеми
| Проблема | Причина | Виправлення |
|---|---|---|
| Налаштування сторінки нового розділу не відповідає тому, що я встановив | PageSetup було встановлено у неправильному Section екземплярі | Встановити PageSetup у розділі, який follows перерву, а не попередню |
| Вміст Header/footer з попереднього розділу неочікувано з’являється в новому розділі | Headers/footers нового розділу все ще пов’язані з попереднім розділом | Викличте HeaderFooterCollection.LinkToPrevious(false) (або додайте окремий вміст header/footer), щоб відв’язати їх |
| Header/footer першої або парної сторінки ігнорується | DifferentFirstPageHeaderFooter / OddAndEvenPagesHeaderFooter є false, або відповідний варіант HeaderFooterType не існує | Встановіть прапорець у PageSetup і переконайтеся, що відповідний варіант заголовка/нижнього колонтитула присутній. |
| Багатостовпчасте розташування не застосовується | TextColumns.SetCount() був викликаний з лічильником 1 або в неправильному розділі PageSetup | Викличте SetCount() з більш ніж одним стовпцем у PageSetup.TextColumns цільового розділу |
FAQ
Як розпочати новий розділ без створення нової сторінки?
Вставте розрив SectionBreakContinuous за допомогою DocumentBuilder.InsertBreak(BreakType.SectionBreakContinuous).
Як задати розділу власні поля та орієнтацію?
Вставте розрив розділу, потім встановіть властивості нової секції PageSetup — TopMargin, BottomMargin, LeftMargin, RightMargin, Orientation та PaperSize.
Як зробити так, щоб перша сторінка розділу використовувала інший заголовок?
Встановіть PageSetup.DifferentFirstPageHeaderFooter = true у цій секції та додайте HeaderFooter типу HeaderFirst (і FooterFirst, за потреби) до її колекції HeadersFooters.
Як розташувати основний текст розділу в двох колонках?
Викличте PageSetup.TextColumns.SetCount(2) у секції, а потім налаштуйте Spacing і EvenlySpaced / окремі значення TextColumn.Width за потреби.
API Reference Підсумок
| Клас / Перерахування | Опис |
|---|---|
Section | Вузол розділу; Body, HeadersFooters, PageSetup |
SectionCollection | Кожен Section у документі через Document.Sections |
Body / Story | Основний контейнер вмісту для розділу (Body) або заголовка/колонтитула (HeaderFooter) |
PageSetup | Розміри сторінки, поля, орієнтація, межі та колонки для розділу |
HeaderFooter / HeaderFooterCollection | Вміст заголовка/колонтитула та типізовані аксесори для розділу |
HeaderFooterType | Визначає, який варіант заголовка/колонтитула (primary, first, even) є у HeaderFooter |
TextColumn / TextColumnCollection | Багатостовпчикове розташування тексту для розділу |
PaperSize / Orientation / Margins | Розмір сторінки, орієнтація та попередньо встановлені значення полей |
PageBorderAppliesTo / PageBorderDistanceFrom | На яких сторінках друкується межа сторінки та її орієнтовна сторона |
SectionStart / BreakType | Тип розриву розділу, записаний у розділі, та види розривів, які приймає DocumentBuilder.InsertBreak() |
LineNumberRestartMode | Коли автоматичне нумерування рядків перезапускається всередині розділу |