目次の操作

多くの場合、目次(TOC)を含む文書を操作します。 Aspose.Wordsを使用すると、数行のコードを使用して、独自の目次を挿入したり、ドキュメント内の既存の目次を完全に再構築したりできます。Aspose.Wordsを使用すると、独自の目次を挿入することができます。

この記事では、目次フィールドを操作する方法の概要と、次のことを示します:

  • 新しいTOCを挿入する方法。
  • 文書内の新規または既存のTOCsを更新します。
  • TOCの書式設定と全体的な構造を制御するスイッチを指定します。
  • 目次のスタイルと外観を変更する方法。
  • 文書からすべてのエントリとともにTOCフィールド全体を削除する方法。

プログラムで目次を挿入する

InsertTableOfContentsメソッドを呼び出すことで、現在の位置にある文書にTOC(目次)フィールドを挿入できます。

Word文書の目次は、いくつかの方法で構築し、さまざまなオプションを使用してフォーマットすることができます。 メソッドに渡すフィールドスイッチは、テーブルの作成方法とドキュメント内での表示方法を制御します。

Microsoft Wordに挿入されたTOCで使用されるデフォルトのスイッチは**"\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に入力します。

insert-table-of-contents-field-aspose-words-java

目次の更新

Aspose.Wordsを使用すると、数行のコードだけでTOCを完全に更新できます。 これは、新しく挿入されたTOCを入力するか、文書への変更が行われた後に既存のTOCを更新するために行うことができます。

ドキュメント内のTOCフィールドを更新するには、次の2つの方法を使用する必要があります:

  1. Document.updateFields()
  2. Document.updatePageLayout()

これらの2つのupdateメソッドは、この順序で呼び出される必要があることに注意してください。 逆にすると、目次が入力されますが、ページ番号は表示されません。 任意の数の異なる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()への2番目の呼び出しは、メモリ内のドキュメントのレイアウトを構築します。 これは、エントリのページ番号を収集するために行う必要があります。 この呼び出しから計算された正しいページ番号がTOCに挿入されます。

スイッチを使用して目次の動作を制御する

他のフィールドと同様に、TOCフィールドは、目次の構築方法を制御するフィールドコード内で定義されたスイッチを受け入れることができます。 特定のスイッチは、どのエントリが含まれ、どのレベルで制御されるかを制御するために使用され、他のスイッチはTOCの外観を制御するために使 スイッチは複雑な目次が作り出されるように一緒に結合することができる。

ccontrol-table-of-contents-field-aspose-words-java

デフォルトでは、ドキュメントにデフォルトのTOCを挿入するときに、上記のこれらのスイッチが含まれます。 スイッチのないTOCには、組み込みの見出しスタイルのコンテンツが含まれます(\Oスイッチが設定されているかのように)。

Aspose.Wordsでサポートされている利用可能なTOCスイッチを以下に示し、その用途について詳しく説明します。 それらはそれらのタイプに基づいて別々のセクションに分けることができます。 最初のセクションのスイッチはTOCに含めるコンテンツを定義し、2番目のセクションのスイッチはTOCの外観を制御します。

スイッチがここにリストされていない場合は、現在サポートされていません。 すべてのスイッチは将来のバージョンでサポートされます。 私たちは、すべてのリリースにさらにサポートを追加しています。

エントリーマーキングスイッチ

スイッチ 説明
Heading Styles
(\Oスイッチ)

このスイッチは、TOCを組み込みの見出しスタイルから構築する必要があることを定義します。 Microsoft Wordでは、これらはHeading 1–Heading 9で定義されます。 Aspose.Wordsでは、これらのスタイルは対応するStyleIdentifier列挙体によって表されます。 この列挙体は、スタイルのロケールに依存しない識別子を表します。StyleIdentifier.Heading1はHeading 1スタイルを表します。 これを使用して、スタイルの書式設定とプロパティをドキュメントのスタイルコレクションから取得できます。 対応するスタイルクラスは、StyleIdentifier型のindexedプロパティを使用してDocument.Stylesコレクションから取得できます。

style-table-of-contents-field-aspose-words-java



これらのスタイルでフォーマットされたコンテンツはすべて、目次に含まれます。 見出しのレベルは、TOC内のエントリの対応する階層レベルを定義します。 たとえば、Heading 1スタイルの段落はTOCの最初のレベルとして扱われますが、Heading 2の段落は階層内の次のレベルとして扱われます。

Outline Levels
(\Uスイッチ)

各段落は、段落オプションの下でアウトラインレベルを定義できます。

modify-table-of-contents-field-aspose-words-java



この設定では、文書階層でこの段落を処理するレベルを指定します。 これは、文書のレイアウトを簡単に構造化するために使用される一般的に使用される方法です。 この階層は、Microsoft Wordのアウトラインビューに変更することで表示できます。 見出しスタイルと同様に、「本文」レベルに加えて、1〜9のアウトラインレベルがあります。 アウトラインレベル1-9は、階層の対応するレベルのTOCに表示されます
段落スタイルで設定されているか、段落自体に直接設定されているアウトラインレベルを持つコンテンツはTOCに含まれます。 Aspose.Wordsでは、アウトラインレベルは段落ノードのParagraphFormat.OutlineLevelプロパティで表されます。 段落スタイルのアウトラインレベルは、Style.ParagraphFormatプロパティでも同じように表されます。

Custom Styles
(\Tスイッチ)

このスイッチを使用すると、TOCで使用するエントリを収集するときにカスタムスタイルを使用できます。 これは、TOCに組み込みの見出しスタイルとともにカスタムスタイルを含めるために、\Oスイッチと組み合わせて使用されることがよくあります。
スイッチのパラメータは、音声マークで囲む必要があります。 多くのカスタムスタイルを含めることができます。スタイルごとに、名前を指定し、その後にコンマを指定し、その後にスタイルがTOCに表示されるレベ それ以降のスタイルもコンマで区切られます。
例えば

{ TOC \o "1-3" \t "CustomHeading1, 1,   CustomHeading2, 2"}

TOCのレベル1コンテンツとしてCustomHeading1でスタイルされたコンテンツを使用し、CustomHeading2はレベル2として使用します。

TCフィールドを使用する
(\Fおよび\Lスイッチ)

古いバージョンのMicrosoft Wordでは、TOCを構築する唯一の方法はTCフィールドの使用でした。 これらのフィールドは、フィールドコードが表示されている場合でも、ドキュメントに非表示に挿入されます。 それらにはエントリに表示されるテキストが含まれ、TOCはそれらから構築されます。 この機能はあまり頻繁には使用されていませんが、文書に表示されるようにインデントされていないTOCにエントリを含める場合には、まだ有用で
これらのフィールドを挿入すると、フィールドコードが表示されていても非表示になります。 隠されたコンテンツを表示せずに見ることはできません。 これらのフィールドを表示するには、段落の書式を選択する必要があります。

setup-table-of-contents-field-aspose-words-java

これらのフィールドは、他のフィールドと同様に任意の位置にドキュメントに挿入でき、FieldType.FieldTOCEntry列挙体で表されます。
TOCの\Fスイッチは、TCフィールドをエントリとして使用するように指定するために使用されます。 余分な識別子のないスイッチ自体は、文書内の任意のTCフィールドが含まれることを意味します。 任意の余分なパラメータ、多くの場合、単一の文字は、一致する\fスイッチを持つTCフィールドのみがTOCに含まれることを指定します。 例えば

{ TOC \f t }

次のようなTCフィールドのみが含まれます

{ TC \f t }

TOCフィールドには関連するスイッチもあり、"\L"スイッチは、指定された範囲内のレベルを持つTCフィールドのみが含まれることを指定します。

table-of-contents-field-aspose-words-java



TCフィールド自体も{several, multiple, a few, many, numerous}スイッチを設定することができます。 これらは次のとおりです:

-\F-上記で説明しました。

-\L-このTCフィールドが表示されるTOCのレベルを定義します。 この同じスイッチを使用するTOCには、指定された範囲内にある場合にのみ、このTCフィールドが含まれます。

-_\N-このTOCエントリのページ番号は表示されません。TCフィールドを挿入する方法のサンプルコードは、次のセクションにあります。

外観関連スイッチ

スイッチ 説明
Omit Page Numbers
(\Nスイッチ)

このスイッチは、TOCの特定のレベルのページ番号を非表示にするために使用されます。 たとえば、次のように定義できます

{TOC \o "1-4" \n "3-4" }

そして、レベル3と4のエントリのページ番号は、リーダードット(もしあれば)と一緒に隠されます。 たとえば、“1-1"では、最初のレベルのページ番号のみが除外されます。
レベル範囲を指定しないと、TOC内のすべてのレベルのページ番号が省略されます。 これは、文書をHTMLまたは同様の形式でエクスポートするときに設定すると便利です。 これは、HTMLベースの形式にはページの概念がないため、ページ番号を必要としないためです。

table-of-contents-aspose-words-java

ハイパーリンクとして挿入
(\Hスイッチ)

このスイッチはTOCエントリがハイパーリンクとして挿入されることを指定します。 Microsoft Word内の文書を表示するとき、これらのエントリはTOC内の通常のテキストとして表示されますが、ハイパーリンクされているため、Microsoft Word内のCtrl + Left Clickを使用して文書内の元のエントリの位置に移動するために使用できます。 このスイッチが含まれている場合、これらのリンクは他の形式でも保持されます。 たとえば、EPUBを含むHTMLベースの形式や、PDFやXPSなどのレンダリング形式では、これらは作業リンクとしてエクスポートされます。
このスイッチが設定されていない場合、これらすべての出力のTOCはプレーンテキストとしてエクスポートされ、この動作は示されません。 文書がMSWordで開かれている場合、エントリのテキストもこの方法ではクリックできませんが、ページ番号を使用して元のエントリに移動できます。

tree-table-of-contents-field-aspose-words-java

Set Separator Character
(\Pスイッチ)

このスイッチを使用すると、エントリのタイトルとページ番号を分離するコンテンツをTOCで簡単に変更できます。 使用する区切り文字は、このスイッチの後に指定し、音声マークで囲む必要があります。
Officeのドキュメントに記載されているものとは対照的に、最大5文字ではなく1文字のみを使用できます。 これはMSWordとAspose.Wordsの両方に適用されます。
このスイッチは、TOCのエントリとページ番号を分離するために使用したものをあまり制御できないため、このスイッチを使用することはお勧めしません。 代わりに、StyleIdentifier.TOC1などの適切なTOCスタイルを編集し、そこから特定のフォントメンバーなどにアクセスできるリーダースタイルを編集することをお勧めします。 これを行う方法の詳細は、記事の後半で見つけることができます。

list-table-of-contents-field-aspose-words-java

Preserve Tab Entries
(\Wスイッチ)

このスイッチを使用すると、タブ文字を持つエントリ、たとえば行末にタブがある見出しは、TOCを入力するときに適切なタブ文字として保持されます。 これは、タブ文字の機能がTOCに存在し、エントリの書式設定に使用できることを意味します。 たとえば、特定のエントリでは、テキストを均等に空白にするためにタブストップとタブ文字を使用する場合があります。 対応するTOCレベルが同等のタブストップを定義している限り、生成されたTOCエントリは同様の間隔で表示されます。

同じ状況で、このスイッチが定義されていない場合、タブ文字は機能していないタブと同等の空白に変換されます。 その場合、出力は期待どおりに表示されません。

tab-table-of-contents-field-aspose-words-java

Preserve New Line Entries
(\Xスイッチ)

上記のスイッチと同様に、このスイッチは、生成されたTOCにあるように、複数の行にまたがる見出し(段落を分離するのではなく改行文字を使用)を保 たとえば、複数の行にまたがる見出しでは、改行文字(Ctrl+EnterまたはControlChar.LineBreak)を使用して、異なる行にコンテンツを分割できます。 このスイッチを指定すると、TOCのエントリは以下に示すようにこれらの改行文字を保持します。

この状況では、スイッチが定義されていない場合、改行文字は単一の空白に変換されます。

tab-space-table-of-contents-field-aspose-words-java

TCフィールドを挿入します

新しいTCフィールドをDocumentBuilderの現在位置に挿入するには、DocumentBuilder.InsertFieldメソッドを呼び出し、必要なスイッチとともにフィールド名を"TC"として指定します。

次のコード例は、DocumentBuilderを使用して文書にTCフィールドを挿入する方法を示しています。

// 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フィールドでマークされます。 MSWordでこれを行う簡単な方法は、テキストを強調表示して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スタイルで書式設定され、2番目のレベルはTOC2スタイルで書式設定されます。 これは、TOCの外観を変更するには、これらのスタイルを変更する必要があることを意味します。 Aspose.Wordsでは、これらのスタイルはロケールに依存しないStyleIdentifier.TOC1からStyleIdentifier.TOC9までで表され、これらの識別子を使用してDocument.Stylesコレクションから取得できます。Aspose.Wordsでは、ロケールに依存しないStyleIdentifier.TOC1からStyleIdentifier.TOC9までのスタイルが表されます。

文書の適切なスタイルが取得されたら、このスタイルの書式を変更することができます。 これらのスタイルへの変更は、文書内の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エントリはスタイルの書式設定の一部であるため太字ではありませんが、段落で直接書式設定されているため斜体になります。

また、各エントリとページ番号の間で使用される区切り文字の書式設定を制御することもできます。 デフォルトでは、これはタブ文字を使用してページ番号に広がる点線であり、右マージンの近くに並んでいる右タブストップがあります。

変更する特定のTOCレベルに対して取得されたStyleクラスを使用して、これらが文書内でどのように表示されるかを変更することもできます。

これが最初にどのように表示されるかを変更するには、スタイルの段落書式を取得するために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");
}

ドキュメントから目次を削除する

目次は、TOCフィールドのFieldStartノードとFieldEndノードの間にあるすべてのノードを削除することによって、ドキュメントから削除できます。

以下のコードはこれを示しています。 TOCフィールドの削除は、ネストされたフィールドを追跡しないため、通常のフィールドよりも簡単です。 代わりに、現在のTOCの終わりに遭遇したことを意味するFieldEndノードのタイプがFieldType.FieldTOCであることを確認します。 この場合、適切に形成された文書は別のTOCフィールド内に完全にネストされたTOCフィールドを持たないと仮定できるので、ネストされたフィールドを気にせずにこの手法を使用することができます。

まず、各TOCFieldStartノードが収集され、格納されます。 次に、指定された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