Как работать с разделами в .NET
Это руководство показывает, как создавать разрывы разделов, настраивать параметры страницы и управлять верхними и нижними колонтитулами, а также много колонным макетом в Aspose.Words FOSS для .NET, используя Section and PageSetup классов. Описывается чтение разделов, уже присутствующих в документе, и начало нового раздела с помощью DocumentBuilder, настройкой размеров страницы и полей, добавлением вариантов верхних и нижних колонтитулов, а также размещением основного текста в нескольких колонках.
Пошаговое руководство
Шаг 1: Установить пакет
Aspose.Words FOSS for .NET пока не публикует пакет NuGet — вместо этого сборите библиотеку из исходного кода. Клонируйте https://github.com/aspose-words-foss/Aspose.Words-FOSS-for-.NET.git, затем соберите Aspose.Words.sln в конфигурации Release с помощью SDK .NET и добавьте полученную сборку Aspose.Words в ваш проект. Библиотека нацелена на .NET Standard 2.0, поэтому она работает на .NET Framework 4.6.2+ и .NET 6/8/10.
Шаг 2: Импортировать необходимые классы
Добавьте директиву using Aspose.Words; — Section, PageSetup, HeaderFooter и связанные перечисления, используемые в этом руководстве, находятся непосредственно в пространстве имён Aspose.Words рядом с Document и DocumentBuilder.
Шаг 3: Прочитать секции, уже находящиеся в документе
Document.Sections возвращает SectionCollection, содержащий каждый Section в документе, каждый из которых является CompositeNode, который также является частью общей древовидной структуры узлов. Document.FirstSection и Document.LastSection предоставляют прямой доступ к граничным секциям без итерации коллекции. Каждый Section содержит один Body – достигаемый так же, как любой другой Story – и, если присутствует, содержимое колонтитулов, доступное через Section.HeadersFooters.
Шаг 4: Начать новую секцию с разрывом секции
Call DocumentBuilder.InsertBreak(BreakType) в позиции курсора, чтобы начать новый раздел. Передайте BreakType.SectionBreakNewPage когда новый раздел должен всегда начинаться с новой страницы, BreakType.SectionBreakContinuous когда требуется лишь изменение настроек страницы (например, переход к много колонному тексту) без принудительного разрыва страницы, или BreakType.SectionBreakNewColumn, SectionBreakEvenPage, и SectionBreakOddPage для остальных поведений начала раздела, поддерживаемых Word. follows его, поэтому установите PageSetup свойства для нового Section – не для предыдущего – после вставки разрыва. DocumentBuilder.MoveToSection(sectionIndex) перемещает курсор к началу тела конкретного раздела, и PageSetup.SectionStart читает или задаёт SectionStart тип разрыва, уже записанный в существующем разделе.
Шаг 5: Настроить размеры страницы и поля
Каждый Section.PageSetup является экземпляром PageSetup. Установите PageWidth, PageHeight, LeftMargin, RightMargin, TopMargin, BottomMargin и Gutter для размеров страницы и полей, либо назначьте предустановку Margins напрямую PageSetup.Margins. Orientation и PaperSize управляют ориентацией страницы и размером бумаги. Границы страницы настраиваются с помощью Borders (это BorderCollection), BorderAppliesTo (PageBorderAppliesTo), BorderDistanceFrom (PageBorderDistanceFrom), BorderAlwaysInFront, BorderSurroundsHeader и BorderSurroundsFooter. Вызовите PageSetup.ClearFormatting(), чтобы сбросить настройки страницы секции к значениям по умолчанию перед их полной настройкой.
Шаг 6: Добавить и связать колонтитулы
Section.HeadersFooters — это HeaderFooterCollection с типизированными аксессорами – HeaderPrimary, HeaderFirst, HeaderEven, FooterPrimary, FooterFirst, FooterEven – а также GetByHeaderFooterType() для поиска по HeaderFooterType и Add() при добавлении нового. Каждый HeaderFooter представляет собой Story, помеченный как IsHeader и IsLinkedToPrevious. Включите PageSetup.DifferentFirstPageHeaderFooter или PageSetup.OddAndEvenPagesHeaderFooter перед добавлением соответствующего варианта HeaderFirst/FooterFirst или HeaderEven/FooterEven – флаг и вариант действуют только совместно. Вызовите HeaderFooterCollection.LinkToPrevious(), чтобы повторно подключить заголовок или нижний колонтитул секции к наследованию содержимого предыдущей секции, либо отсоединить его, чтобы новая секция начиналась с независимого содержимого.
Шаг 7: Размещение основного текста в нескольких колонках
PageSetup.TextColumns возвращает TextColumnCollection для раздела. Вызовите SetCount() с количеством колонок, в которые должен течь основной текст, затем отрегулируйте EvenlySpaced, Spacing, LineBetween и Width, чтобы контролировать расположение колонок. Как только коллекция содержит более одной колонки, отдельные экземпляры TextColumn раскрывают свои собственные Width и SpaceAfter.
Шаг 8: Очистить или массово изменить содержание раздела
Section.AppendContent() и PrependContent() копируют основное содержание другого раздела в этот; ClearContent() массово очищает основное содержание раздела. ClearHeadersFooters() и DeleteHeaderFooterShapes() очищают содержимое заголовка и нижнего колонтитула во всем разделе, не удаляя сам раздел.
Распространённые проблемы и их решения
Настройки страницы нового раздела не соответствуют тому, что я задал PageSetup было установлено на неправильном Section экземпляре. Разрыв раздела переносит форматирование для раздела, который следует за ним – установите PageSetup на раздел, который следует за ним InsertBreak(), а не на предыдущий.
Содержимое заголовка или подвала из предыдущего раздела неожиданно появляется в новом Заголовок или подвал нового раздела всё ещё связан с предыдущим разделом. Вызовите HeaderFooterCollection.LinkToPrevious(false), или добавьте отдельное содержимое заголовка/подвала в новый раздел, чтобы разорвать связь.
Заголовок/нижний колонтитул первой или чётной страницы игнорируется DifferentFirstPageHeaderFooter or OddAndEvenPagesHeaderFooter is false, или соответствующий HeaderFooterType вариант не существует в Section.HeadersFooters. Установите флаг на PageSetup и добавьте соответствующий вариант заголовка/нижнего колонтитула вместе.
Многостолбцовая раскладка не применяется TextColumns.SetCount() был вызван с количеством один, или в неправильном разделе PageSetup. Вызов SetCount() с более чем одним столбцом в целевом разделе PageSetup.TextColumns.
Разрыв раздела вставлен в неправильном месте документа DocumentBuilder.InsertBreak(BreakType) вставляет в текущий курсор построителя. Используйте DocumentBuilder.MoveToSection() или другие методы позиционирования курсора построителя, чтобы установить курсор перед вызовом InsertBreak().
Часто задаваемые вопросы
Как начать новый раздел без начала новой страницы?
Вставьте разрыв SectionBreakContinuous с помощью DocumentBuilder.InsertBreak(BreakType.SectionBreakContinuous).
Как задать разделу собственные поля и ориентацию?
Вставьте разрыв раздела, затем установите TopMargin, BottomMargin, LeftMargin, RightMargin, Orientation и PaperSize в PageSetup нового раздела.
Как сделать так, чтобы первая страница раздела использовала другой заголовок?
Установите PageSetup.DifferentFirstPageHeaderFooter = true для этого раздела и добавьте HeaderFooter типа HeaderFirst (и FooterFirst, при необходимости) в его коллекцию HeadersFooters.
Как разместить основной текст раздела в две колонки?
Вызовите PageSetup.TextColumns.SetCount(2) для раздела, затем при необходимости отрегулируйте Spacing, EvenlySpaced или отдельные значения TextColumn.Width.
Как обратиться к первому и последнему разделам напрямую?
Читайте Document.FirstSection и Document.LastSection вместо индексации в Document.Sections.