Работа с оглавлением
Часто вам приходится работать с документами, содержащими оглавление (TOC). Используя Aspose.Words, вы можете вставить свое собственное оглавление или полностью перестроить существующее оглавление в документе, используя всего несколько строк кода. В этой статье описывается, как работать с полем оглавления, и демонстрируется:
- Как вставить совершенно новый
TOC
- Обновите новые или существующие TOCs в документе.
- Укажите параметры для управления форматированием и общей структурой TOC.
- Как изменить стили и внешний вид оглавления.
- Как удалить все поле
TOC
целиком вместе со всеми записями из документа.
Вставьте оглавление программным способом
Вы можете вставить поле TOC
(оглавление) в документ в текущей позиции, вызвав метод DocumentBuilder.insert_table_of_contents.
Оглавление в документе Word может быть создано несколькими способами и отформатировано с использованием различных параметров. Переключатели полей, которые вы передаете методу, определяют способ создания и отображения таблицы в вашем документе.
Переключателями по умолчанию, которые используются в TOC
, вставленном в Microsoft Word, являются "\o “1-3 \h \z \u”. Описания этих переключателей, а также список поддерживаемых переключателей можно найти далее в статье. Вы можете либо воспользоваться этим руководством для получения нужных переключателей, либо, если у вас уже есть документ, содержащий аналогичные TOC
, которые вы хотите, вы можете показать коды полей (ALT+F9) и скопировать переключатели непосредственно из поля.
В следующем примере кода показано, как вставить поле оглавления в документ:
Код демонстрирует, как новое оглавление вставляется в пустой документ. Затем класс DocumentBuilder используется для вставки некоторого образца форматирования содержимого с соответствующими стилями заголовков, которые используются для обозначения содержимого, подлежащего включению в TOC. Затем в следующих строках TOC
заполняется путем обновления полей и макета страницы документа.
TOC
, но без видимого содержимого. Это связано с тем, что поле TOC
было вставлено, но еще не заполнено до тех пор, пока оно не будет обновлено в документе. Более подробная информация об этом приведена в следующем разделе.
Обновите оглавление
Aspose.Words позволяет полностью обновить TOC
всего несколькими строками кода. Это можно сделать для заполнения только что вставленного TOC
или для обновления существующего TOC
после внесения изменений в документ. Для обновления полей TOC
в документе необходимо использовать следующие два метода:
Пожалуйста, обратите внимание, что эти два метода обновления необходимо вызывать в указанном порядке. В обратном случае оглавление будет заполнено, но номера страниц отображаться не будут. Можно обновить любое количество различных TOCs. Эти методы автоматически обновят все TOCs, найденные в документе.
В следующем примере кода показано, как полностью перестроить поля TOC
в документе, вызвав функцию обновления полей:
Первый вызов Document.update_fields приведет к созданию TOC
, все текстовые записи будут заполнены, и TOC
будет выглядеть почти завершенным. Единственное, чего не хватает, - это номеров страниц, которые на данный момент отображаются как “?”. При втором вызове функции Document.update_page_layout будет создан макет документа в памяти. Это необходимо сделать, чтобы получить номера страниц для записей. Правильные номера страниц, вычисленные в результате этого вызова, затем вставляются в TOC.
Используйте переключатели для управления поведением оглавления.
Как и в случае с любым другим полем, поле TOC
может принимать переключатели, определенные в коде поля, которые управляют построением оглавления. Некоторые переключатели используются для управления тем, какие записи включаются и на каком уровне, в то время как другие используются для управления внешним видом TOC. Переключатели могут быть объединены вместе, что позволяет создавать сложное оглавление.
По умолчанию эти параметры, указанные выше, включаются при вставке параметра по умолчанию TOC
в документ. Параметр TOC
без каких-либо параметров будет включать содержимое из встроенных стилей заголовков (как если бы был установлен параметр \O). Ниже перечислены доступные переключатели TOC
, поддерживаемые Aspose.Words, и подробно описано их использование. Они могут быть разделены на отдельные разделы в зависимости от их типа. Переключатели в первом разделе определяют, какой контент следует включить в TOC
, а переключатели во втором разделе управляют отображением TOC. Если какой-либо переключатель не указан здесь, значит, он в данный момент не поддерживается. Все переключатели будут поддерживаться в будущих версиях. Мы добавляем дополнительную поддержку с каждым выпуском.
Переключатели маркировки входа
Переключатель | Описание |
---|---|
Heading Styles * (Переключатель \O)* |
Этот параметр определяет, что Любое содержимое, отформатированное с использованием этих стилей, включается в оглавление. Уровень заголовка будет определять соответствующий иерархический уровень записи в TOC. Например, абзац со стилем Heading 1 будет рассматриваться как первый уровень в |
Outline Levels * (переключатель \U)* |
Для каждого абзаца можно задать уровень структуры в разделе Параметры абзаца. Этот параметр определяет, на каком уровне иерархии документа следует рассматривать данный абзац. Это обычно используется для упрощения структурирования макета документа. Эту иерархию можно просмотреть, переключившись в режим просмотра структуры в Microsoft Word. Как и в случае со стилями заголовков, в дополнение к уровню “Основного текста” может быть от 1 до 9 уровней структуры. Уровни структуры от 1 до 9 будут отображаться в Обратите внимание, что для встроенных стилей заголовков, таких как Heading 1, в настройках стиля обязательно устанавливается уровень контура.
|
Custom Styles * (переключатель \T)* |
Этот параметр позволяет использовать пользовательские стили при сборе записей для использования в TOC. Этот параметр часто используется в сочетании с параметром \O для включения пользовательских стилей наряду со встроенными стилями заголовков в TOC.
будет использоваться контент, стилизованный под CustomHeading1, как контент уровня 1 в |
Use TC Fields * (Переключатели \F и \L)* |
В старых версиях Microsoft Word единственным способом создания FieldType.FieldTOCEntry . Переключатель \F в TOC используется для указания того, что поля TC должны использоваться в качестве записей. Сам по себе переключатель без какого-либо дополнительного идентификатора означает, что будет включено любое поле TC в документе. Любой дополнительный параметр, часто состоящий из одной буквы, будет означать, что только TC полей, которые имеют соответствующий переключатель \f, будут включены в TOC. Например *
будет включать только TC полей, таких как
Поле Для самих полей - \F – Объяснено выше. - \L – Определяет, на каком уровне в - |
Переключатели, связанные с внешним видом
Переключатель | Описание |
---|---|
Omit Page Numbers * (Переключатель \N)* |
Этот параметр используется для скрытия номеров страниц для определенных уровней TOC. Например, вы можете задать
и номера страниц в записях уровней 3 и 4 будут скрыты вместе с точками выноски (если таковые имеются). Чтобы указать только один уровень, все равно следует использовать диапазон, например, “1-1” исключит номера страниц только для первого уровня. |
Insert As Hyperlinks * (Переключатель \H)* |
Этот параметр указывает, что записи |
Set Separator Character * (Переключатель\P)* |
Этот параметр позволяет легко изменять содержимое, разделяющее заголовок статьи и нумерацию страниц, в поле TOC. Разделитель, который следует использовать, должен быть указан после этого параметра и заключен в речевые знаки. |
Preserve Tab Entries * (Переключатель \W)* |
Использование этого параметра приведет к тому, что любые записи, содержащие символ табуляции, например заголовок, в конце строки которого есть символ табуляции, будут сохранены как соответствующий символ табуляции при заполнении TOC. Это означает, что функция символа табуляции будет присутствовать в |
Preserve New Line Entries (Переключатель \X) |
Аналогично описанному выше переключателю, этот параметр указывает, что заголовки, охватывающие несколько строк (с использованием символов новой строки, а не отдельных абзацев), будут сохранены в том виде, в каком они есть в сгенерированном TOC. Например, в заголовке, который должен занимать несколько строк, можно использовать символ новой строки (Ctrl + Enter или |
Вставить TC полей
Вы можете вставить новое поле TC в текущее положение DocumentBuilder, вызвав метод DocumentBuilder.insert_field и указав имя поля как “TC” вместе с любыми необходимыми параметрами. В приведенном ниже примере показано, как вставить поле TC
в документ с помощью DocumentBuilder.
Изменить оглавление
При форматировании записей в TOC
не используются оригинальные стили отмеченных записей, вместо этого каждый уровень форматируется с использованием эквивалентного стиля TOC
. Например, первый уровень в TOC
отформатирован в стиле TOC1, второй уровень отформатирован в стиле TOC2 и так далее. Это означает, что для изменения внешнего вида TOC
эти стили должны быть изменены. В Aspose.Words эти стили представлены независимыми от языкового стандарта значениями от StyleIdentifier.TOC1 до StyleIdentifier.TOC9 и могут быть извлечены из коллекции Document.styles с использованием этих идентификаторов.
Как только соответствующий стиль документа будет найден, форматирование для этого стиля может быть изменено. Любые изменения в этих стилях будут автоматически отражены в TOCs в документе. В приведенном ниже примере изменяется свойство форматирования, используемое в стиле первого уровня TOC
.
Также полезно отметить, что любое прямое форматирование абзаца (определенное в самом абзаце, а не в стиле), помеченное для включения как TOC
, будет скопировано в запись в TOC. Например, если стиль Heading 1 используется для выделения содержимого для TOC
, и этот стиль имеет полужирное оформление, в то время как к абзацу также непосредственно применяется курсивное форматирование. Результирующая запись TOC
не будет выделена жирным шрифтом, поскольку это является частью форматирования стиля, однако она будет выделена курсивом, поскольку она отформатирована непосредственно в абзаце.
Вы также можете управлять форматированием разделителей, используемых между каждой записью и номером страницы. По умолчанию это пунктирная линия, которая пересекается с нумерацией страниц с помощью символа табуляции и точки, расположенной рядом с правым полем.
Используя класс Style, полученный для конкретного уровня TOC
, который вы хотите изменить, вы также можете изменить его отображение в документе. Чтобы изменить его отображение, сначала необходимо вызвать Style.paragraph_format для получения форматирования абзаца для стиля. Из этого можно извлечь остановки табуляции, вызвав ParagraphFormat.tab_stops и изменив соответствующую остановку табуляции. Используя этот же метод, можно переместить или удалить саму табуляцию целиком. В приведенном ниже примере показано, как изменить положение правой остановки табуляции в TOC
соответствующих абзацах.
Удаление оглавления из документа
Оглавление можно удалить из документа, удалив все узлы, находящиеся между узлами FieldStart и FieldEnd поля TOC
. Приведенный ниже код демонстрирует это. Удаление поля TOC
проще, чем обычного поля, поскольку мы не отслеживаем вложенные поля. Вместо этого мы проверяем, что узел FieldEnd имеет тип FieldType.FIELD_TOC, что означает, что мы столкнулись с концом текущего TOC. Этот метод можно использовать в данном случае, не беспокоясь о каких-либо вложенных полях, поскольку мы можем предположить, что в любом правильно сформированном документе не будет полностью вложенного поля TOC
внутри другого поля TOC
.
Сначала собираются и сохраняются FieldStart узлы каждого из TOC
. Затем перечисляются указанные TOC
, таким образом, посещаются и сохраняются все узлы в поле. Затем узлы удаляются из документа. В примере low code показано, как удалить указанный элемент TOC
из документа.
Извлеките оглавление
Если вы хотите извлечь оглавление из любого документа Word, можно использовать следующий пример кода.
doc = aw.Document(docs_base.my_dir + "Table of contents.docx")
for field in doc.range.fields :
if (field.type == aw.fields.FieldType.FIELD_HYPERLINK) :
hyperlink = field.as_field_hyperlink()
if (hyperlink.sub_address != None and hyperlink.sub_address.find("_Toc") == 0) :
tocItem = field.start.get_ancestor(aw.NodeType.PARAGRAPH).as_paragraph()
print(tocItem.to_string(aw.SaveFormat.TEXT).strip())
print("------------------")
bm = doc.range.bookmarks.get_by_name(hyperlink.sub_address)
pointer = bm.bookmark_start.get_ancestor(aw.NodeType.PARAGRAPH).as_paragraph()
print(pointer.to_string(aw.SaveFormat.TEXT))