Работа с разделами

Работа с разделами

Документ 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Когда автоматическая нумерация строк перезапускается в пределах раздела

См. также:

 Русский