目次の操作
多くの場合、目次(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
に入力します。
TOC
フィールドが見つかりますが、表示されているコンテンツはありません。 これは、TOC
フィールドが挿入されていますが、ドキュメントで更新されるまでまだ入力されていないためです。 これに関する詳細については、次のセクションで説明します。
目次の更新
Aspose.Wordsを使用すると、数行のコードだけでTOC
を完全に更新できます。 これは、新しく挿入されたTOC
を入力するか、文書への変更が行われた後に既存のTOC
を更新するために行うことができます。
ドキュメント内のTOC
フィールドを更新するには、次の2つの方法を使用する必要があります:
これらの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の外観を制御するために使 スイッチは複雑な目次が作り出されるように一緒に結合することができる。
デフォルトでは、ドキュメントにデフォルトのTOC
を挿入するときに、上記のこれらのスイッチが含まれます。 スイッチのないTOC
には、組み込みの見出しスタイルのコンテンツが含まれます(\Oスイッチが設定されているかのように)。
Aspose.Wordsでサポートされている利用可能なTOC
スイッチを以下に示し、その用途について詳しく説明します。 それらはそれらのタイプに基づいて別々のセクションに分けることができます。 最初のセクションのスイッチはTOC
に含めるコンテンツを定義し、2番目のセクションのスイッチはTOCの外観を制御します。
スイッチがここにリストされていない場合は、現在サポートされていません。 すべてのスイッチは将来のバージョンでサポートされます。 私たちは、すべてのリリースにさらにサポートを追加しています。
エントリーマーキングスイッチ
スイッチ | 説明 |
---|---|
Heading Styles (\Oスイッチ) |
このスイッチは、
|
Outline Levels (\Uスイッチ) |
各段落は、段落オプションの下でアウトラインレベルを定義できます。
Heading 1などの組み込みの見出しスタイルには、スタイル設定でアウトラインレベルが必須に設定されていることに注意してください。
|
Custom Styles (\Tスイッチ) |
このスイッチを使用すると、TOCで使用するエントリを収集するときにカスタムスタイルを使用できます。 これは、TOCに組み込みの見出しスタイルとともにカスタムスタイルを含めるために、\Oスイッチと組み合わせて使用されることがよくあります。
|
TCフィールドを使用する (\Fおよび\Lスイッチ) |
古いバージョンのMicrosoft Wordでは、 これらのフィールドは、他のフィールドと同様に任意の位置にドキュメントに挿入でき、
次のようなTCフィールドのみが含まれます
-\F-上記で説明しました。 -\L-このTCフィールドが表示される - |
外観関連スイッチ
スイッチ | 説明 |
---|---|
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"として指定します。
次のコード例は、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
フィールドを持たないと仮定できるので、ネストされたフィールドを気にせずにこの手法を使用することができます。
まず、各TOC
のFieldStart
ノードが収集され、格納されます。 次に、指定された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 |