Lavorare con Table of Contents
Spesso si lavora con documenti contenenti un sommario (TOC). Utilizzando Aspose.Words è possibile inserire il proprio sommario o ricostruire completamente il sommario esistente nel documento utilizzando solo poche righe di codice.
In questo articolo viene illustrato come utilizzare il campo sommario e viene illustrato:
- Come inserire un nuovo TOC.
- Aggiornare TOCs nuovo o esistente nel documento.
- Specificare le opzioni per controllare la formattazione e la struttura complessiva di TOC.
- Come modificare gli stili e l’aspetto del sommario.
- Come rimuovere un intero campo
TOC
insieme a tutte le voci dal documento.
Inserire il sommario a livello di programmazione
È possibile inserire un campo TOC
(sommario) nel documento nella posizione corrente chiamando il metodo InsertTableOfContents.
Un sommario in un documento di Word può essere costruito in diversi modi e formattato utilizzando una varietà di opzioni. Gli interruttori di campo che si passa al metodo controllano il modo in cui la tabella viene creata e visualizzata nel documento.
Gli switch predefiniti utilizzati in un TOC
inserito in Microsoft Word sono "\o “1-3 \h \z \u”. Le descrizioni di questi switch e un elenco di switch supportati possono essere trovate più avanti nell’articolo. È possibile utilizzare tale guida per ottenere gli switch corretti o se si dispone già di un documento contenente il TOC
simile che si desidera, è possibile mostrare i codici di campo (ALT+F9) e copiare gli switch direttamente dal campo.
Nell’esempio di codice seguente viene illustrato come inserire un campo Sommario in un documento:
// 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"); |
Nell’esempio di codice seguente viene illustrato come inserire un sommario (TOC ) in un documento utilizzando gli stili di intestazione come voci:
// 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"); |
Il codice dimostra che il nuovo sommario è inserito in un documento vuoto. La classe DocumentBuilder viene quindi utilizzata per inserire alcuni esempi di formattazione del contenuto con gli stili di intestazione appropriati che vengono utilizzati per contrassegnare il contenuto da includere nel TOC. Le righe successive popolano quindi TOC
aggiornando i campi e il layout di pagina del documento.
TOC
, ma senza contenuto visibile. Questo perché il campo TOC
è stato inserito ma non è ancora popolato fino a quando non viene aggiornato nel documento. Ulteriori informazioni su questo è discusso nella prossima sezione.
Aggiorna Indice
Aspose.Words consente di aggiornare completamente un TOC
con poche righe di codice. Questo può essere fatto per popolare un nuovo inserito TOC
o per aggiornare un esistente TOC
dopo che sono state apportate modifiche al documento.
I seguenti due metodi devono essere utilizzati per aggiornare i campi TOC
nel documento:
Si prega di notare che questi due metodi di aggiornamento devono essere chiamati in questo ordine. Se invertito il sommario verrà popolato ma non verranno visualizzati numeri di pagina. È possibile aggiornare qualsiasi numero di TOCs diversi. Questi metodi aggiorneranno automaticamente tutti i TOCs trovati nel documento.
L’esempio di codice seguente mostra come ricostruire completamente i campi TOC
nel documento richiamando gli aggiornamenti dei campi:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
doc.updateFields(); |
La prima chiamata a Document.updateFields() costruirà il TOC
, tutte le voci di testo sono popolate e il TOC
appare quasi completo. L’unica cosa che manca sono i numeri di pagina che per ora vengono visualizzati con “?”.
La seconda chiamata a Document.updatePageLayout() costruirà il layout del documento in memoria. Questo deve essere fatto per raccogliere i numeri di pagina delle voci. I numeri di pagina corretti calcolati da questa chiamata vengono quindi inseriti in TOC.
Utilizzare gli switch per controllare il comportamento dell’indice
Come con qualsiasi altro campo, il campo TOC
può accettare gli switch definiti all’interno del codice del campo che controlla il modo in cui viene creato il sommario. Alcuni switch sono usati per controllare quali voci sono incluse e a quale livello, mentre altri sono usati per controllare l’aspetto del TOC. Gli interruttori possono essere combinati insieme per consentire la produzione di un complesso sommario.
Per impostazione predefinita, queste opzioni di cui sopra sono incluse quando si inserisce un valore predefinito TOC
nel documento. Un TOC
senza opzioni includerà il contenuto degli stili di intestazione incorporati (come se l’opzione \O fosse impostata).
Gli switch TOC
disponibili supportati da Aspose.Words sono elencati di seguito e i loro usi sono descritti in dettaglio. Possono essere suddivisi in sezioni separate in base al loro tipo. Gli switch nella prima sezione definiscono il contenuto da includere nel TOC
e gli switch nella seconda sezione controllano l’aspetto del TOC.
Se uno switch non è elencato qui, al momento non è supportato. Tutti gli switch saranno supportati nelle versioni future. Stiamo aggiungendo ulteriore supporto ad ogni versione.
Interruttori di marcatura di ingresso
Switch | Descrizione |
---|---|
Heading Styles * (\O Interruttore)* |
Questo interruttore definisce che il
|
Outline Levels * (\U interruttore)* |
Ogni paragrafo può definire un livello di struttura in Opzioni paragrafo.
Si noti che gli stili di intestazione incorporati come Heading 1 hanno un livello di struttura obbligatorio impostato nelle impostazioni di stile.
|
Custom Styles * (\T interruttore)* |
Questa opzione consentirà di utilizzare stili personalizzati quando si raccolgono voci da utilizzare nel TOC. Questo è spesso usato in combinazione con l’opzione \O per includere stili personalizzati insieme agli stili di intestazione incorporati nel TOC.
userà il contenuto in stile con CustomHeading1 come contenuto di livello 1 in |
Usa TC Campi * (\F e \ L interruttori)* |
Nelle versioni precedenti di Microsoft Word, l’unico modo per creare un Questi campi possono essere inseriti in un documento in qualsiasi posizione come qualsiasi altro campo e sono rappresentati dall’enumerazione
includerà solo campi TC come
Il campo
– \ F-Spiegato sopra. – \ L-Definisce in quale livello nel - |
Interruttori relativi all’aspetto
Switch | Descrizione |
---|---|
Omit Page Numbers * (\N Interruttore)* |
Questa opzione viene utilizzata per nascondere i numeri di pagina per determinati livelli di TOC. Ad esempio, è possibile definire
e i numeri di pagina sulle voci dei livelli 3 e quattro saranno nascosti insieme ai punti leader (se ce ne sono). Per specificare un solo livello, è comunque necessario utilizzare un intervallo, ad esempio “1-1” escluderà i numeri di pagina solo per il primo livello. |
Inserisci come collegamenti ipertestuali * (\H Interruttore)* |
Questa opzione specifica che le voci |
Set Separator Character * (\P Interruttore)* |
Questa opzione consente di modificare facilmente il contenuto che separa il titolo della voce e la numerazione delle pagine in TOC. Il separatore da utilizzare deve essere specificato dopo questo interruttore e racchiuso in segni vocali. |
Preserve Tab Entries * (\W Interruttore)* |
L’uso di questo interruttore specificherà che tutte le voci che hanno un carattere di tabulazione, ad esempio, un’intestazione che ha una tabulazione alla fine della riga, verranno mantenute come un carattere di tabulazione corretto quando si popola il TOC. Ciò significa che la funzione del carattere tab sarà presente in |
Preserve New Line Entries * (\X Interruttore)* |
Simile allo switch sopra, questo switch specifica che le intestazioni che si estendono su più righe (usando caratteri di nuova riga, non paragrafi separati) verranno conservate come sono nel TOC generato. Ad esempio, un’intestazione che deve essere distribuita su più righe può utilizzare il carattere nuova riga (Ctrl + Invio o |
Inserisci TC Campi
È possibile inserire un nuovo campo TC nella posizione corrente del DocumentBuilder
chiamando il metodo DocumentBuilder.InsertField
e specificando il nome del campo come “TC” insieme agli eventuali switch necessari.
Il seguente esempio di codice mostra come inserire un campo TC
nel documento utilizzando 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"); |
Spesso una riga di testo specifica è designata per TOC
ed è contrassegnata con un campo TC
. Il modo più semplice per farlo in MS Word è evidenziare il testo e premere ALT+SHIFT+O. Questo crea automaticamente un campo TC
utilizzando il testo selezionato. La stessa tecnica può essere realizzata attraverso il codice. Il codice sottostante troverà il testo corrispondente all’input e inserirà un campo TC
nella stessa posizione del testo. Il codice si basa sulla stessa tecnica utilizzata nell’articolo. L’esempio di codice seguente mostra come trovare e inserire un campo TC
nel testo di un documento.
// 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; | |
} | |
} |
Modificare un sommario
Modificare la formattazione degli stili
La formattazione delle voci nel TOC
non utilizza gli stili originali delle voci contrassegnate, invece, ogni livello viene formattato utilizzando uno stile TOC
equivalente. Ad esempio, il primo livello in TOC
è formattato con lo stile TOC1, il secondo livello formattato con lo stile TOC2 e così via. Ciò significa che per cambiare l’aspetto del TOC
questi stili devono essere modificati. In Aspose.Words questi stili sono rappresentati dal locale-independent StyleIdentifier.TOC1
fino a StyleIdentifier.TOC9
e possono essere recuperati dalla raccolta Document.Styles
utilizzando questi identificatori.
Una volta recuperato lo stile appropriato del documento, la formattazione per questo stile può essere modificata. Qualsiasi modifica a questi stili verrà automaticamente riflessa in TOCs nel documento.
L’esempio di codice seguente modifica una proprietà di formattazione utilizzata nello stile di primo livello 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); | |
} |
È anche utile notare che qualsiasi formattazione diretta di un paragrafo (definita sul paragrafo stesso e non nello stile) contrassegnata per essere inclusa nel TOC
verrà copiata nella voce nel TOC. Ad esempio, se lo stile Heading 1 viene utilizzato per contrassegnare il contenuto per TOC
e questo stile ha una formattazione in grassetto mentre il paragrafo ha anche una formattazione in corsivo applicata direttamente ad esso. La voce risultante TOC
non sarà in grassetto poiché fa parte della formattazione dello stile, tuttavia sarà in corsivo poiché è formattata direttamente nel paragrafo.
È inoltre possibile controllare la formattazione dei separatori utilizzati tra ogni voce e il numero di pagina. Per impostazione predefinita, si tratta di una linea tratteggiata che viene distribuita sulla numerazione delle pagine utilizzando un carattere di tabulazione e un punto di tabulazione destro allineato vicino al margine destro.
Utilizzando la classe Style
recuperata per il particolare livello TOC
che si desidera modificare, è anche possibile modificare il modo in cui questi appaiono nel documento.
Per cambiare il modo in cui appare in primo luogo, è necessario chiamare Style.ParagraphFormat
per recuperare la formattazione del paragrafo per lo stile. Da questo, i tab stop possono essere recuperati chiamando ParagraphFormat.TabStops
e il tab stop appropriato modificato. Utilizzando questa stessa tecnica la scheda stessa può essere spostata o rimossa del tutto.
L’esempio di codice seguente mostra come modificare la posizione dell’arresto di tabulazione destro nei paragrafi correlati a 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"); | |
} |
Rimuovere un sommario dal documento
Un sommario può essere rimosso dal documento rimuovendo tutti i nodi trovati tra il nodo FieldStart
e FieldEnd del campo TOC
.
Il codice qui sotto lo dimostra. La rimozione del campo TOC
è più semplice di un campo normale in quanto non teniamo traccia dei campi nidificati. Invece, controlliamo che il nodo FieldEnd
sia di tipo FieldType.FieldTOC
, il che significa che abbiamo incontrato la fine dell’attuale TOC. Questa tecnica può essere utilizzata in questo caso senza preoccuparsi di alcun campo nidificato in quanto possiamo supporre che qualsiasi documento formato correttamente non avrà un campo TOC
completamente annidato all’interno di un altro campo TOC
.
In primo luogo i nodi FieldStart
di ciascun TOC
vengono raccolti e memorizzati. Il TOC
specificato viene quindi enumerato in modo che tutti i nodi all’interno del campo vengano visitati e archiviati. I nodi vengono quindi rimossi dal documento. Nell’esempio di codice seguente viene illustrato come rimuovere un TOC
specificato da un documento.
// 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"); |
Estratto Sommario
Se si desidera estrarre un sommario da qualsiasi documento di Word, è possibile utilizzare il seguente esempio di codice.
// 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 |