Работа с разделами
Работа с разделами
Документ 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 разрыв, а не тот, который перед ним |
| Содержимое колонтитулов из предыдущего раздела неожиданно появляется в новом разделе | Колонтитулы нового раздела всё ещё связаны с предыдущим разделом | Вызовите HeaderFooterCollection.LinkToPrevious(false) (или добавьте отдельное содержимое колонтитулов), чтобы разорвать их связь |
| Колонтитул первой или чётной страницы игнорируется | 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 | Когда автоматическая нумерация строк перезапускается в пределах раздела |