Работа с оглавлением
Часто вам приходится работать с документами, содержащими оглавление (TOC). Используя Aspose.Words, вы можете вставить свое собственное оглавление или полностью перестроить существующее оглавление в документе, используя всего несколько строк кода.
В этой статье описывается, как работать с полем оглавления, и демонстрируется:
- Как вставить совершенно новый TOC.
- Обновите новые или существующие TOCs в документе.
- Укажите параметры для управления форматированием и общей структурой TOC.
- Как изменить стили и внешний вид оглавления.
- Как удалить все поле
TOC
вместе со всеми записями из документа целиком.
Вставка оглавления программным способом
Вы можете вставить поле TOC
(оглавление) в документ в текущей позиции, вызвав метод InsertTableOfContents.
Оглавление в документе Word может быть создано несколькими способами и отформатировано с использованием различных параметров. Переключатели полей, которые вы передаете методу, определяют способ создания и отображения таблицы в вашем документе.
Переключателями по умолчанию, которые используются в TOC
, вставленном в Microsoft Word, являются "\o “1-3 \h \z \u”. Описания этих переключателей, а также список поддерживаемых переключателей можно найти далее в статье. Вы можете либо использовать это руководство для получения нужных переключателей, либо, если у вас уже есть документ, содержащий аналогичные TOC
, которые вы хотите, вы можете показать коды полей (ALT+F9) и скопировать переключатели непосредственно из поля.
В следующем примере кода показано, как вставить поле оглавления в документ:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Insert a table of contents at the beginning of the document. | |
builder.insertTableOfContents("\\o \"1-3\" \\h \\z \\u"); | |
// The newly inserted table of contents will be initially empty. | |
// It needs to be populated by updating the fields in the document. | |
doc.updateFields(); | |
doc.save(dataDir + "InsertATableOfContentsField_out.docx"); |
В следующем примере кода показано, как вставить оглавление (TOC) в документ, используя стили заголовков в качестве записей:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
Document doc = new Document(); | |
// Create a document builder to insert content with into document. | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Insert a table of contents at the beginning of the document. | |
builder.insertTableOfContents("\\o \"1-3\" \\h \\z \\u"); | |
// Start the actual document content on the second page. | |
builder.insertBreak(BreakType.PAGE_BREAK); | |
// Build a document with complex structure by applying different heading styles thus creating TOC entries. | |
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1); | |
builder.writeln("Heading 1"); | |
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_2); | |
builder.writeln("Heading 1.1"); | |
builder.writeln("Heading 1.2"); | |
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1); | |
builder.writeln("Heading 2"); | |
builder.writeln("Heading 3"); | |
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_2); | |
builder.writeln("Heading 3.1"); | |
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_3); | |
builder.writeln("Heading 3.1.1"); | |
builder.writeln("Heading 3.1.2"); | |
builder.writeln("Heading 3.1.3"); | |
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_2); | |
builder.writeln("Heading 3.2"); | |
builder.writeln("Heading 3.3"); | |
// Call the method below to update the TOC. | |
doc.updateFields(); | |
doc.save(dataDir + "InsertATableOfContentsUsingHeadingStyles_out.docx"); |
Код демонстрирует, что новое оглавление вставляется в пустой документ. Затем класс DocumentBuilder используется для вставки некоторого образца форматирования содержимого с соответствующими стилями заголовков, которые используются для обозначения содержимого, которое должно быть включено в TOC. Затем в следующих строках TOC
заполняется путем обновления полей и макета страницы документа.
TOC
, но без видимого содержимого. Это связано с тем, что поле TOC
было вставлено, но еще не заполнено до тех пор, пока оно не будет обновлено в документе. Более подробная информация об этом приведена в следующем разделе.
Обновить оглавление
Aspose.Words позволяет полностью обновить TOC
всего несколькими строками кода. Это можно сделать для заполнения только что вставленного TOC
или для обновления существующего TOC
после внесения изменений в документ.
Для обновления полей TOC
в документе необходимо использовать следующие два метода:
Пожалуйста, обратите внимание, что эти два метода обновления необходимо вызывать в указанном порядке. В обратном случае оглавление будет заполнено, но номера страниц отображаться не будут. Можно обновить любое количество различных TOCs. Эти методы автоматически обновят все TOCs, найденные в документе.
В следующем примере кода показано, как полностью перестроить поля TOC
в документе, вызвав обновление полей:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
doc.updateFields(); |
Первый вызов Document.updateFields() приведет к созданию TOC
, все текстовые записи будут заполнены, и TOC
будет выглядеть почти завершенным. Единственное, чего не хватает, - это номеров страниц, которые на данный момент отображаются с помощью “?”.
При втором вызове функции Document.updatePageLayout() будет создан макет документа в памяти. Это необходимо сделать, чтобы получить номера страниц для записей. Правильные номера страниц, вычисленные в результате этого вызова, затем вставляются в TOC.
Используйте переключатели для управления поведением таблицы содержимого
Как и в случае с любым другим полем, поле TOC
может принимать переключатели, определенные в коде поля, который управляет построением оглавления. Некоторые переключатели используются для управления тем, какие записи включаются и на каком уровне, в то время как другие используются для управления внешним видом TOC. Переключатели могут быть объединены вместе, что позволяет создать сложное оглавление.
По умолчанию эти параметры, указанные выше, включаются при вставке значения по умолчанию TOC
в документ. Параметр TOC
без каких-либо параметров будет включать содержимое из встроенных стилей заголовков (как если бы был установлен параметр \O).
Ниже перечислены доступные переключатели TOC
, поддерживаемые Aspose.Words, и подробно описано их использование. Они могут быть разделены на отдельные разделы в зависимости от их типа. Переключатели в первом разделе определяют, какой контент следует включить в TOC
, а переключатели во втором разделе управляют внешним видом TOC.
Если какого-либо переключателя здесь нет, значит, в данный момент он не поддерживается. Все переключатели будут поддерживаться в будущих версиях. Мы добавляем дополнительную поддержку в каждый выпуск.
Переключатели маркировки входа
Переключатель | Описание |
---|---|
Heading Styles * (Переключатель \O)* |
Этот параметр определяет, что
|
Outline Levels * (переключатель \U)* |
Для каждого абзаца можно задать уровень структуры в разделе Параметры абзаца.
Обратите внимание, что для встроенных стилей заголовков, таких как Heading 1, в настройках стиля обязательно устанавливается уровень контура.
|
Custom Styles * (переключатель \T)* |
Этот параметр позволяет использовать пользовательские стили при сборе записей для использования в TOC. Этот параметр часто используется в сочетании с параметром \O для включения пользовательских стилей наряду со встроенными стилями заголовков в TOC.
будет использоваться контент, стилизованный под CustomHeading1, как контент уровня 1 в |
Используйте поля TC (переключатели\F и \L) |
В старых версиях Microsoft Word единственным способом создания Эти поля могут быть вставлены в документ в любом месте, как и любое другое поле, и представлены перечислением
будет включать только TC полей, таких как
Поле
- \F – Объяснено выше. - \L – Определяет, на каком уровне в - |
Переключатели, связанные с внешним видом
Переключатель | Описание |
---|---|
Omit Page Numbers * (Переключатель \N)* |
Этот параметр используется для скрытия номеров страниц для определенных уровней TOC. Например, вы можете задать
и номера страниц для записей уровней 3 и 4 будут скрыты вместе с точками выноски (если таковые имеются). Чтобы указать только один уровень, все равно следует использовать диапазон, например, “1-1” исключит номера страниц только для первого уровня. |
Вставлять в виде гиперссылок (Переключатель \H) |
Этот параметр указывает, что записи |
Set Separator Character * (Переключатель\P)* |
Этот параметр позволяет легко изменять содержимое, разделяющее заголовок статьи и нумерацию страниц, в поле TOC. Разделитель, который следует использовать, должен быть указан после этого параметра и заключен в речевые знаки. |
Preserve Tab Entries * (Переключатель \W)* |
Использование этого параметра приведет к тому, что любые записи, содержащие символ табуляции, например заголовок, в конце строки которого есть символ табуляции, будут сохранены как соответствующий символ табуляции при заполнении TOC. Это означает, что функция символа табуляции будет присутствовать в |
Preserve New Line Entries (Переключатель \X) |
Аналогично описанному выше переключателю, этот параметр указывает, что заголовки, занимающие несколько строк (с использованием символов новой строки, а не отдельных абзацев), будут сохранены в том виде, в каком они есть в сгенерированном TOC. Например, в заголовке, который должен занимать несколько строк, можно использовать символ новой строки (Ctrl + Enter или |
Вставить TC полей
Вы можете вставить новое поле TC в текущее положение DocumentBuilder
, вызвав метод DocumentBuilder.InsertField
и указав имя поля как “TC” вместе с любыми необходимыми параметрами.
В следующем примере кода показано, как вставить поле TC
в документ с помощью DocumentBuilder.
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
Document doc = new Document(); | |
// Create a document builder to insert content with. | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Insert a TC field at the current document builder position. | |
builder.insertField("TC \"Entry Text\" \\f t"); |
Часто для TOC
назначается определенная строка текста, которая помечается полем TC
. Простой способ сделать это в MS Word - выделить текст и нажать ALT+SHIFT+O. При этом автоматически создается поле TC
с использованием выделенного текста. Тот же метод может быть реализован с помощью кода. Приведенный ниже код найдет текст, соответствующий введенным данным, и вставит поле TC
в том же месте, что и текст. Код основан на том же методе, который использовался в статье. В следующем примере кода показано, как найти и вставить поле TC
в текст документа.
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
class InsertTCFieldHandler implements IReplacingCallback { | |
// Store the text and switches to be used for the TC fields. | |
private String mFieldText; | |
private String mFieldSwitches; | |
/** | |
* The switches to use for each TC field. Can be an empty string or null. | |
*/ | |
public InsertTCFieldHandler(String switches) throws Exception { | |
this(null, switches); | |
} | |
/** | |
* The display text and the switches to use for each TC field. Display text | |
* Can be an empty string or null. | |
*/ | |
public InsertTCFieldHandler(String text, String switches) throws Exception { | |
mFieldText = text; | |
mFieldSwitches = switches; | |
} | |
public int replacing(ReplacingArgs args) throws Exception { | |
// Create a builder to insert the field. | |
DocumentBuilder builder = new DocumentBuilder((Document) args.getMatchNode().getDocument()); | |
// Move to the first node of the match. | |
builder.moveTo(args.getMatchNode()); | |
// If the user specified text to be used in the field as display text then use that, otherwise use the | |
// match string as the display text. | |
String insertText; | |
if (!(mFieldText == null || "".equals(mFieldText))) | |
insertText = mFieldText; | |
else | |
insertText = args.getMatch().group(); | |
// Insert the TC field before this node using the specified string as the display text and user defined switches. | |
builder.insertField(java.text.MessageFormat.format("TC \"{0}\" {1}", insertText, mFieldSwitches)); | |
// We have done what we want so skip replacement. | |
return ReplaceAction.SKIP; | |
} | |
} |
Изменить оглавление
Измените форматирование стилей
При форматировании записей в TOC
не используются оригинальные стили отмеченных записей, вместо этого каждый уровень форматируется с использованием эквивалентного стиля TOC
. Например, первый уровень в TOC
отформатирован в стиле TOC1, второй уровень отформатирован в стиле TOC2 и так далее. Это означает, что для изменения внешнего вида TOC
эти стили должны быть изменены. В Aspose.Words эти стили представлены не зависящими от языкового стандарта значениями от StyleIdentifier.TOC1
до StyleIdentifier.TOC9
и могут быть извлечены из коллекции Document.Styles
с использованием этих идентификаторов.
Как только соответствующий стиль документа будет найден, форматирование для этого стиля может быть изменено. Любые изменения в этих стилях будут автоматически отражены в TOCs в документе.
В следующем примере кода изменяется свойство форматирования, используемое в стиле первого уровня TOC
.
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
public static void changeAFormattingPropertyUsedInFirstLevelTOCStyle() throws Exception { | |
Document doc = new Document(); | |
// Retrieve the style used for the first level of the TOC and change the formatting of the style. | |
doc.getStyles().getByStyleIdentifier(StyleIdentifier.TOC_1).getFont().setBold(true); | |
} |
Также полезно отметить, что любое прямое форматирование абзаца (определенное в самом абзаце, а не в стиле), помеченное для включения в TOC
, будет скопировано в запись в TOC. Например, если стиль Heading 1 используется для выделения содержимого для TOC
, и этот стиль имеет полужирное оформление, в то время как к абзацу также непосредственно применяется курсивное форматирование. Результирующая запись TOC
не будет выделена жирным шрифтом, поскольку это является частью форматирования стиля, однако она будет выделена курсивом, поскольку она отформатирована непосредственно в абзаце.
Вы также можете управлять форматированием разделителей, используемых между каждой записью и номером страницы. По умолчанию это пунктирная линия, которая пересекает нумерацию страниц с помощью символа табуляции и точки, расположенной рядом с правым полем.
Используя класс Style
, полученный для конкретного уровня TOC
, который вы хотите изменить, вы также можете изменить способ их отображения в документе.
Чтобы изменить внешний вид, сначала необходимо вызвать Style.ParagraphFormat
, чтобы получить форматирование абзаца для стиля. После этого можно получить значения табуляции, вызвав ParagraphFormat.TabStops
, и изменить соответствующее значение табуляции. Используя этот же метод, саму табуляцию можно переместить или вообще удалить.
В следующем примере кода показано, как изменить положение правой кнопки табуляции в связанных абзацах TOC
.
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
public static void modifyPositionOfRightTabStopInTOC() throws Exception { | |
Document doc = new Document(dataDir + "Field.TableOfContents.doc"); | |
// Iterate through all paragraphs in the document | |
for (Paragraph para : (Iterable<Paragraph>) doc.getChildNodes(NodeType.PARAGRAPH, true)) { | |
// Check if this paragraph is formatted using the TOC result based styles. This is any style between TOC and TOC9. | |
if (para.getParagraphFormat().getStyle().getStyleIdentifier() >= StyleIdentifier.TOC_1 && para.getParagraphFormat().getStyle().getStyleIdentifier() <= StyleIdentifier.TOC_9) { | |
// Get the first tab used in this paragraph, this should be the tab used to align the page numbers. | |
TabStop tab = para.getParagraphFormat().getTabStops().get(0); | |
// Remove the old tab from the collection. | |
para.getParagraphFormat().getTabStops().removeByPosition(tab.getPosition()); | |
// Insert a new tab using the same properties but at a modified position. | |
// We could also change the separators used (dots) by passing a different Leader type | |
para.getParagraphFormat().getTabStops().add(tab.getPosition() - 50, tab.getAlignment(), tab.getLeader()); | |
} | |
} | |
doc.save(dataDir + "Field.TableOfContentsTabStops_Out.doc"); | |
} |
Удаление оглавления из документа
Оглавление можно удалить из документа, удалив все узлы, находящиеся между узлами FieldStart
и FieldEnd поля TOC
.
Приведенный ниже код демонстрирует это. Удаление поля TOC
проще, чем обычного поля, поскольку мы не отслеживаем вложенные поля. Вместо этого мы проверяем, что узел FieldEnd
имеет тип FieldType.FieldTOC
, что означает, что мы столкнулись с окончанием текущего TOC. Этот метод можно использовать в данном случае, не беспокоясь о каких-либо вложенных полях, поскольку мы можем предположить, что в любом правильно сформированном документе не будет полностью вложенного поля TOC
внутри другого поля TOC
.
Сначала собираются и сохраняются FieldStart
узлы каждого TOC
. Затем указанный TOC
перечисляется, так что все узлы в поле просматриваются и сохраняются. Затем узлы удаляются из документа. В следующем примере кода показано, как удалить указанный TOC
из документа.
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// Open a document which contains a TOC. | |
Document doc = new Document(dataDir + "Document.TableOfContents.doc"); | |
// Remove the first table of contents from the document. | |
removeTableOfContents(doc, 0); | |
// Save the output. | |
doc.save(dataDir + "Document.TableOfContentsRemoveToc_Out.doc"); |
Извлеките оглавление
Если вы хотите извлечь оглавление из любого документа Word, можно использовать следующий пример кода.
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// The path to the documents directory. | |
String dataDir = Utils.getSharedDataDir(ExtractTableOfContents.class) + "TableOfContents/"; | |
String fileName = "TOC.doc"; | |
Document doc = new Document(dataDir + fileName); | |
for (Field field : (Iterable<Field>)doc.getRange().getFields()) | |
{ | |
if (field.getType() == FieldType.FIELD_HYPERLINK) | |
{ | |
FieldHyperlink hyperlink = (FieldHyperlink)field; | |
if (hyperlink.getSubAddress() != null && hyperlink.getSubAddress().startsWith("_Toc")) | |
{ | |
Paragraph tocItem = (Paragraph)field.getStart().getAncestor(NodeType.PARAGRAPH); | |
System.out.println(tocItem.toString(SaveFormat.TEXT).trim()); | |
System.out.println("------------------"); | |
if (tocItem != null) | |
{ | |
Bookmark bm = doc.getRange().getBookmarks().get(hyperlink.getSubAddress()); | |
// Get the location this TOC Item is pointing to | |
Paragraph pointer = (Paragraph)bm.getBookmarkStart().getAncestor(NodeType.PARAGRAPH); | |
System.out.println(pointer.toString(SaveFormat.TEXT)); | |
} | |
} // End If | |
}// End If | |
}// End Foreach |