Praca ze spisem treści
Często będziesz pracować z dokumentami zawierającymi spis treści (TOC). Za pomocą Aspose.Words możesz wstawić własny spis treści lub całkowicie przebudować istniejący spis treści w dokumencie za pomocą zaledwie kilku linijek kodu. W tym artykule opisano sposób pracy z polem spisu treści i przedstawiono:
- Jak wstawić zupełnie nowy plik
TOC
- Zaktualizuj nowe lub istniejące spisy treści w dokumencie.
- Określ przełączniki sterujące formatowaniem i ogólną strukturą spisu treści.
- Jak modyfikować style i wygląd spisu treści.
- Jak usunąć całe pole
TOC
wraz ze wszystkimi wpisami z dokumentu.
Wstaw spis treści programowo
Pole TOC
(spis treści) można wstawić do dokumentu w bieżącej pozycji, wywołując metodę InsertTableOfContents.
Spis treści w dokumencie programu Word można utworzyć na wiele sposobów i sformatować przy użyciu różnych opcji. Przełączniki pól przekazywane do metody kontrolują sposób budowania i wyświetlania tabeli w dokumencie.
Domyślnymi przełącznikami używanymi w formacie TOC
wstawionym do Microsoft Word są "\o “1-3 \h \z \u”. Opisy tych przełączników oraz listę obsługiwanych przełączników znajdziesz w dalszej części artykułu. Możesz skorzystać z tego przewodnika, aby uzyskać odpowiednie przełączniki lub, jeśli masz już dokument zawierający podobny TOC
, który chcesz, możesz pokazać kody pól (ALT+F9) i skopiować przełączniki bezpośrednio z pola.
Poniższy przykład kodu pokazuje, jak wstawić pole spisu treści do dokumentu:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir_WorkingWithDocument(); | |
// Initialize document. | |
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(); | |
dataDir = dataDir + "DocumentBuilderInsertTOC_out.doc"; | |
doc.Save(dataDir); |
Poniższy przykład kodu pokazuje, jak wstawić spis treści (TOC) do dokumentu przy użyciu stylów nagłówków jako wpisów.
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
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"); | |
// Start the actual document content on the second page. | |
builder.InsertBreak(BreakType.PageBreak); | |
// Build a document with complex structure by applying different heading styles thus creating TOC entries. | |
builder.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading1; | |
builder.Writeln("Heading 1"); | |
builder.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading2; | |
builder.Writeln("Heading 1.1"); | |
builder.Writeln("Heading 1.2"); | |
builder.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading1; | |
builder.Writeln("Heading 2"); | |
builder.Writeln("Heading 3"); | |
builder.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading2; | |
builder.Writeln("Heading 3.1"); | |
builder.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading3; | |
builder.Writeln("Heading 3.1.1"); | |
builder.Writeln("Heading 3.1.2"); | |
builder.Writeln("Heading 3.1.3"); | |
builder.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading2; | |
builder.Writeln("Heading 3.2"); | |
builder.Writeln("Heading 3.3"); | |
doc.UpdateFields(); | |
dataDir = dataDir + "DocumentBuilderInsertTableOfContents_out.doc"; | |
doc.Save(dataDir); |
TOC
, ale bez widocznej treści. Dzieje się tak, ponieważ pole TOC
zostało wstawione, ale nie zostało jeszcze wypełnione, dopóki nie zostanie zaktualizowane w dokumencie. Więcej informacji na ten temat omówiono w następnej sekcji.
Zaktualizuj spis treści
Aspose.Words umożliwia całkowitą aktualizację TOC
za pomocą zaledwie kilku linii kodu. Można to zrobić, aby wypełnić nowo wstawiony TOC
lub zaktualizować istniejący TOC
po wprowadzeniu zmian w dokumencie. Aby zaktualizować pola TOC
w dokumencie, należy zastosować dwie następujące metody:
Należy pamiętać, że te dwie metody aktualizacji muszą być wywoływane w tej kolejności. W przypadku odwrócenia spis treści zostanie wypełniony, ale nie będą wyświetlane żadne numery stron. Można aktualizować dowolną liczbę różnych spisów treści. Metody te automatycznie zaktualizują wszystkie spisy treści znalezione w dokumencie.
Poniższy przykład kodu pokazuje, jak całkowicie odbudować pola TOC
w dokumencie, wywołując aktualizację pola:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
doc.UpdateFields(); |
Pierwsze wywołanie UpdateFields spowoduje zbudowanie TOC
, wszystkie wpisy tekstowe zostaną wypełnione i TOC
będzie wyglądał na prawie ukończony. Brakuje tylko numerów stron, które na razie są wyświetlane z “?”. Drugie wywołanie UpdatePageLayout zbuduje układ dokumentu w pamięci. Należy to zrobić, aby zebrać numery stron wpisów. Następnie do spisu treści wstawiane są prawidłowe numery stron obliczone na podstawie tego wywołania.
Użyj przełączników, aby kontrolować zachowanie spisu treści
Podobnie jak w przypadku każdego innego pola, pole TOC
może akceptować przełączniki zdefiniowane w kodzie pola, które kontrolują sposób budowania spisu treści. Niektóre przełączniki służą do kontrolowania, które wpisy są uwzględniane i na jakim poziomie, podczas gdy inne służą do kontrolowania wyglądu spisu treści. Przełączniki można łączyć ze sobą, aby umożliwić tworzenie złożonych spisów treści.
Domyślnie powyższe przełączniki są uwzględniane podczas wstawiania domyślnego pliku TOC
do dokumentu. TOC
bez przełączników będzie zawierał treść z wbudowanych stylów nagłówków (tak jakby ustawiony był przełącznik \O). Dostępne przełączniki TOC
obsługiwane przez Aspose.Words są wymienione poniżej i szczegółowo opisano ich zastosowanie. Można je podzielić na osobne sekcje ze względu na ich rodzaj. Przełączniki w pierwszej sekcji definiują, jaką treść należy uwzględnić w TOC
, a przełączniki w drugiej sekcji kontrolują wygląd spisu treści. Jeśli przełącznik nie jest tutaj wymieniony, oznacza to, że obecnie nie jest obsługiwany. Wszystkie przełączniki będą obsługiwane w przyszłych wersjach. Z każdym wydaniem dodajemy dalsze wsparcie.
Przełączniki oznakowania wejścia
Przełącznik | Opis |
---|---|
Heading Styles (\O Przełącznik) |
Ten przełącznik definiuje, że |
![working-with-table-of-contents-styles](/words/net/working-with-table-of-contents/working-with-table-of-contents-2.png)
Wszelka treść sformatowana przy użyciu tych stylów jest uwzględniona w spisie treści. Poziom nagłówka określi odpowiedni poziom hierarchiczny wpisu w spisie treści. Na przykład akapit ze stylem Nagłówek 1 będzie traktowany jako pierwszy poziom w `TOC`, podczas gdy akapit ze stylem Nagłówek 2 będzie traktowany jako następny poziom w hierarchii i tak dalej.
| | **Outline Levels***(\U przełącznik)* |
Dla każdego akapitu można zdefiniować poziom konspektu w obszarze Opcje akapitu.
![working-with-table-of-contents-paragraph](/words/net/working-with-table-of-contents/working-with-table-of-contents-3.png)
To ustawienie określa, na jakim poziomie ten akapit powinien być traktowany w hierarchii dokumentu. Jest to powszechnie stosowana praktyka służąca do łatwego tworzenia struktury układu dokumentu. Hierarchię tę można wyświetlić, przechodząc do widoku konspektu w formacie Microsoft Word. Podobnie jak w przypadku stylów nagłówków, oprócz poziomu "Tekst główny" może istnieć od 1 do 9 poziomów konspektu. Poziomy konspektu 1 – 9 pojawią się w formacie `TOC` na odpowiednim poziomie hierarchii
Dowolna treść posiadająca poziom konspektu ustawiony w stylu akapitu lub bezpośrednio w samym akapicie jest uwzględniana w spisie treści. W Aspose.Words poziom konspektu jest reprezentowany przez właściwość `ParagraphFormat.OutlineLevel` węzła Akapit. Poziom konspektu stylu akapitu jest reprezentowany w ten sam sposób przez właściwość `Style.ParagraphFormat`.
Należy pamiętać, że wbudowane style nagłówków, takie jak Nagłówek 1, mają obowiązkowy poziom konspektu ustawiony w ustawieniach stylu.
*(\T przełącznik)* |
Ten przełącznik umożliwi użycie niestandardowych stylów podczas zbierania wpisów do wykorzystania w spisie treści. Jest to często używane w połączeniu z przełącznikiem \O, aby uwzględnić niestandardowe style wraz z wbudowanymi stylami nagłówków w spisie treści.
Parametry przełącznika należy ująć w znakach mowy. Można uwzględnić wiele niestandardowych stylów. Dla każdego stylu należy podać nazwę, przecinek i poziom, na jakim styl powinien pojawiać się w pliku `TOC`. Dalsze style również oddzielone są przecinkiem.
Na przykład
<p> { TOC \o "1-3" \t "CustomHeading1, 1, CustomHeading2, 2"} </p><p>
użyje treści stylizowanej na CustomHeading1 jako zawartość poziomu 1 w `TOC` i CustomHeading2 jako zawartość poziomu 2.
| | **Use TC Fields***(Przełączniki \F i \L)* |
W starszych wersjach Microsoft Word jedynym sposobem na zbudowanie `TOC` było użycie pól TC. Pola te są wstawiane w dokumencie w sposób ukryty, nawet jeśli wyświetlane są kody pól. Zawierają one tekst, który powinien być wyświetlony we wpisie i z nich budowany jest `TOC`. Ta funkcja nie jest obecnie używana zbyt często, ale w niektórych przypadkach może być przydatna do uwzględnienia wpisów w `TOC`, które nie są wcięte tak, aby były widoczne w dokumencie.
Po wstawieniu pola te wydają się ukryte, nawet gdy wyświetlane są kody pól. Nie można ich zobaczyć bez pokazania ukrytej zawartości. Aby wyświetlić te pola, należy zaznaczyć opcję Pokaż formatowanie akapitu.
![working-with-table-of-contents-paragraph-settings](/words/net/working-with-table-of-contents/working-with-table-of-contents-4.png)
Pola te można wstawić do dokumentu w dowolnej pozycji, tak jak każde inne pole i są reprezentowane przez wyliczenie `FieldType.FieldTOCEntry`.Przełącznik \F w `TOC` służy do określenia, że pola TC powinny być używane jako wpisy. Sam przełącznik bez dodatkowego identyfikatora oznacza, że uwzględnione zostanie dowolne pole TC w dokumencie. Każdy dodatkowy parametr, często pojedyncza litera, będzie oznaczać, że w spisie treści zostaną uwzględnione tylko pola TC, które mają pasujący przełącznik \f. Na przykład *
<p> { TOC \f t } </p><p>
będzie zawierać tylko pola Najlepsi Współtwórców, takie jak
p> { TC \f t }</p><p>
Pole `TOC` ma również powiązany przełącznik, przełącznik "\L" określa, że uwzględnione zostaną tylko pola TC z poziomami w określonym zakresie.
![todo:image_alt_text](/words/net/working-with-table-of-contents/working-with-table-of-contents-5.png)
Same pola `TC` również mogą mieć ustawione przełączniki `{several, multiple, a few, many, numerous}`. To są:
- *\F – Wyjaśniono powyżej.*
- *\L – Określa, na którym poziomie w `TOC` pojawi się to pole TC. `TOC`, który używa tego samego przełącznika, będzie zawierać to pole TC tylko wtedy, gdy będzie się ono mieścić w określonym zakresie.*
- `_\N` – Numeracja stron dla tego wpisu `TOC` nie jest wyświetlana. Przykładowy kod wstawiania pól TC można znaleźć w następnej sekcji.
|Przełączniki związane z wyglądem
Przełącznik | Opis |
---|---|
Omit Page Numbers (\N Przełącznik) |
Ten przełącznik służy do ukrywania numerów stron na niektórych poziomach spisu treści. Można na przykład zdefiniować |
<p> {TOC \o "1-4" \n "3-4" } </p><p>
a numery stron na wpisach poziomów 3 i 4 zostaną ukryte wraz z kropkami wiodącymi (jeśli występują). Aby określić tylko jeden poziom, należy nadal stosować zakres, np. "1-1" wykluczy numery stron tylko dla pierwszego poziomu.
Nie podanie zakresu poziomów spowoduje pominięcie numerów stron dla wszystkich poziomów w spisie treści. Jest to przydatne do ustawienia podczas eksportowania dokumentu do formatu HTML lub podobnego. Dzieje się tak dlatego, że formaty oparte na HTML nie mają koncepcji strony i dlatego nie wymagają numeracji stron.
![todo:image_alt_text](/words/net/working-with-table-of-contents/working-with-table-of-contents-6.png)
| | **Insert As Hyperlinks***(\H Przełącznik)* |
Ten przełącznik określa, że wpisy `TOC` są wstawiane jako hiperłącza. Podczas przeglądania dokumentu w formacie Microsoft Word wpisy te będą nadal wyświetlane jako zwykły tekst w formacie `TOC`, ale zawierają hiperłącza, dzięki czemu można ich używać do nawigacji do pozycji oryginalnego wpisu w dokumencie za pomocą *Ctrl + lewy przycisk myszy* w Microsoft Word. Gdy ten przełącznik jest uwzględniony, łącza te są zachowywane również w innych formatach. Na przykład w formatach opartych na HTML, w tym EPUB i formatach renderowanych, takich jak PDF i XPS, zostaną one wyeksportowane jako działające łącza.
Bez tego przełącznika `TOC` we wszystkich tych wyjściach zostanie wyeksportowany jako zwykły tekst i nie będzie demonstrował takiego zachowania. Jeśli dokument zostanie otwarty w programie MS Word, tekstu wpisów również nie będzie można kliknąć w ten sposób, ale numery stron nadal można wykorzystać do przejścia do oryginalnego wpisu.
![working-with-table-of-contents-titles](/words/net/working-with-table-of-contents/working-with-table-of-contents-7.png)
| | **Set Separator Character***(\P Przełącznik)* |
Przełącznik ten umożliwia łatwą zmianę treści oddzielającej tytuł wpisu od numeracji stron w spisie treści. Po tym przełączniku należy określić używany separator i ująć go w znaki mowy.
W przeciwieństwie do tego, co jest udokumentowane w dokumentacji pakietu Office, można użyć tylko jednego znaku zamiast maksymalnie pięciu. Dotyczy to zarówno MS Word, jak i Aspose.Words.
Używanie tego przełącznika nie jest zalecane, ponieważ nie pozwala na dużą kontrolę nad sposobem oddzielania wpisów i numerów stron w spisie treści. Zamiast tego zaleca się edytowanie odpowiedniego stylu `TOC`, takiego jak `StyleIdentifier.TOC1`, a następnie edytowanie stylu linii odniesienia z dostępem do określonych elementów czcionek itp. Dalsze szczegóły, jak to zrobić, można znaleźć w dalszej części artykułu.
![working-with-table-of-contents-toc](/words/net/working-with-table-of-contents/working-with-table-of-contents-8.png)
| | **Preserve Tab Entries***(\W Przełącznik)* |
Użycie tego przełącznika określi, że wszelkie wpisy zawierające znak tabulacji, na przykład nagłówek posiadający tabulator na końcu wiersza, zostaną zachowane jako właściwy znak tabulacji podczas wypełniania spisu treści. Oznacza to, że funkcja znaku tabulacji będzie dostępna w `TOC` i będzie można jej użyć do sformatowania wpisu. Na przykład niektóre wpisy mogą wykorzystywać tabulatory i znaki tabulacji w celu równomiernego rozmieszczenia tekstu. Dopóki odpowiedni poziom `TOC` definiuje równoważne tabulatory, wygenerowane wpisy `TOC` będą wyświetlane z podobnymi odstępami.
W tej samej sytuacji, jeśli ten przełącznik nie został zdefiniowany, znaki tabulacji zostaną przekonwertowane na białe znaki odpowiadające niedziałającym tabulatorom. Dane wyjściowe nie będą wówczas wyświetlane zgodnie z oczekiwaniami.
![working-with-table-of-contents-aspose](/words/net/working-with-table-of-contents/working-with-table-of-contents-9.png)
| | **Preserve New Line Entries***(\X Przełącznik)* |
Podobnie do przełącznika powyżej, ten przełącznik określa, że nagłówki rozciągające się na wiele wierszy (przy użyciu znaków nowego wiersza, a nie oddzielnych akapitów) zostaną zachowane w takiej postaci, w jakiej znajdują się w wygenerowanym spisie treści. Na przykład nagłówek, który ma być rozłożony na wiele wierszy, może zawierać znak nowego wiersza (Ctrl + Enter lub `ControlChar.LineBreak`), aby oddzielić treść w różnych wierszach. Po określeniu tego przełącznika wpis w `TOC` zachowa te nowe znaki wiersza, jak pokazano poniżej.
W tej sytuacji, jeśli przełącznik nie jest zdefiniowany, znaki nowej linii są konwertowane na pojedynczy biały znak.
![working-with-table-of-contents-aspose-words](/words/net/working-with-table-of-contents/working-with-table-of-contents-10.png)
|Wstaw pola TC
Możesz wstawić nowe pole TC w bieżącej pozycji DocumentBuilder, wywołując metodę InsertField i podając nazwę pola jako “TC” wraz ze wszystkimi potrzebnymi przełącznikami.
Poniższy przykład kodu pokazuje, jak wstawić pole TC
do dokumentu przy użyciu formatu DocumentBuilder:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir_WorkingWithDocument(); | |
// Initialize document. | |
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"); | |
dataDir = dataDir + "DocumentBuilderInsertTCField_out.doc"; | |
doc.Save(dataDir); |
Często dla TOC
przydzielana jest konkretna linia tekstu, która jest oznaczona polem TC
. Najprostszym sposobem na zrobienie tego w formacie Microsoft Word jest zaznaczenie tekstu i naciśnięcie ALT+SHIFT+O. Spowoduje to automatyczne utworzenie pola TC
przy użyciu wybranego tekstu. Tę samą technikę można osiągnąć za pomocą kodu. Poniższy kod znajdzie tekst pasujący do danych wejściowych i wstawi pole TC
w tej samej pozycji co tekst. Kod opiera się na tej samej technice, co w artykule.
Poniższy przykład kodu pokazuje, jak znaleźć i wstawić pole TC
w tekście w dokumencie:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
FindReplaceOptions options = new FindReplaceOptions(); | |
// Highlight newly inserted content. | |
options.ApplyFont.HighlightColor = Color.DarkOrange; | |
options.ReplacingCallback = new InsertTCFieldHandler("Chapter 1", "\\l 1"); | |
// Insert a TC field which displays "Chapter 1" just before the text "The Beginning" in the document. | |
doc.Range.Replace(new Regex("The Beginning"), "", options); |
Zmodyfikuj spis treści
Formatowanie wpisów w TOC
nie wykorzystuje oryginalnych stylów zaznaczonych wpisów, zamiast tego każdy poziom jest formatowany przy użyciu równoważnego stylu TOC
. Na przykład pierwszy poziom w TOC
jest sformatowany w stylu Spis treści1, drugi poziom w stylu Spis treści2 i tak dalej. Oznacza to, że aby zmienić wygląd TOC
, te style muszą zostać zmodyfikowane. W Aspose.Words te style są reprezentowane przez niezależny od ustawień regionalnych StyleIdentifier.TOC1
aż do StyleIdentifier.TOC9
i można je pobrać z kolekcji Styles za pomocą tych identyfikatorów.
Po pobraniu odpowiedniego stylu dokumentu można zmodyfikować formatowanie tego stylu. Wszelkie zmiany w tych stylach zostaną automatycznie odzwierciedlone w spisie treści w dokumencie.
Poniższy przykład kodu zmienia właściwość formatowania używaną w stylu TOC
pierwszego poziomu:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
// Retrieve the style used for the first level of the TOC and change the formatting of the style. | |
doc.Styles[StyleIdentifier.Toc1].Font.Bold = true; |
Warto również zauważyć, że wszelkie bezpośrednie formatowanie akapitu (zdefiniowane w samym akapicie, a nie w stylu) oznaczone jako dołączane do TOC
zostanie skopiowane we wpisie w spisie treści. Na przykład, jeśli styl Nagłówek 1 jest używany do oznaczania treści w formacie TOC
i ten styl ma formatowanie pogrubione, a akapit ma również bezpośrednio zastosowane formatowanie kursywą. Wynikowy wpis TOC
nie będzie pogrubiony, ponieważ jest to część formatowania stylu, jednak będzie zapisany kursywą, ponieważ jest sformatowany bezpośrednio w akapicie.
Można także kontrolować formatowanie separatorów używanych pomiędzy każdym wpisem a numerem strony. Domyślnie jest to linia przerywana rozciągnięta wzdłuż numeracji stron za pomocą znaku tabulacji i prawego tabulatora ustawionego blisko prawego marginesu.
Korzystając z klasy Style pobranej dla konkretnego poziomu TOC
, który chcesz zmodyfikować, możesz także zmodyfikować sposób ich wyświetlania w dokumencie. Aby zmienić sposób wyświetlania, należy najpierw wywołać format ParagraphFormat w celu pobrania formatowania akapitu dla danego stylu. Z tego można pobrać tabulatory, wywołując TabStops i modyfikując odpowiedni tabulator. Stosując tę samą technikę, samą zakładkę można przesuwać lub usuwać razem.
Poniższy przykład kodu pokazuje, jak zmodyfikować położenie prawego tabulatora w akapitach związanych z TOC
:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir_WorkingWithStyles(); | |
string fileName = "Document.TableOfContents.doc"; | |
// Open the document. | |
Document doc = new Document(dataDir + fileName); | |
// Iterate through all paragraphs in the document | |
foreach (Paragraph para in 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.ParagraphFormat.Style.StyleIdentifier >= StyleIdentifier.Toc1 && para.ParagraphFormat.Style.StyleIdentifier <= StyleIdentifier.Toc9) | |
{ | |
// Get the first tab used in this paragraph, this should be the tab used to align the page numbers. | |
TabStop tab = para.ParagraphFormat.TabStops[0]; | |
// Remove the old tab from the collection. | |
para.ParagraphFormat.TabStops.RemoveByPosition(tab.Position); | |
// 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.ParagraphFormat.TabStops.Add(tab.Position - 50, tab.Alignment, tab.Leader); | |
} | |
} | |
dataDir = dataDir + RunExamples.GetOutputFilePath(fileName); | |
doc.Save(dataDir); |
Usuń spis treści z dokumentu
Spis treści można usunąć z dokumentu, usuwając wszystkie węzły znalezione pomiędzy węzłami FieldStart
i FieldEnd pola TOC
. Poniższy kod to demonstruje. Usunięcie pola TOC
jest prostsze niż w przypadku zwykłego pola, ponieważ nie śledzimy pól zagnieżdżonych. Zamiast tego sprawdzamy, czy węzeł FieldEnd jest typu FieldType.FieldTOC, co oznacza, że napotkaliśmy koniec bieżącego spisu treści. Techniki tej można użyć w tym przypadku bez martwienia się o jakiekolwiek zagnieżdżone pola, ponieważ możemy założyć, że każdy prawidłowo utworzony dokument nie będzie miał w pełni zagnieżdżonego pola TOC
w innym polu TOC
.
Najpierw gromadzone i przechowywane są węzły FieldStart każdego TOC
. Następnie wyliczany jest określony TOC
, tak aby wszystkie węzły w polu zostały odwiedzone i zapisane. Węzły są następnie usuwane z dokumentu.
Poniższy przykład kodu pokazuje, jak usunąć określony TOC
z dokumentu:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
public static void Run() | |
{ | |
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir_WorkingWithStyles(); | |
// 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); | |
dataDir = dataDir + "Document.TableOfContentsRemoveToc_out.doc"; | |
// Save the output. | |
doc.Save(dataDir); | |
Console.WriteLine("\nSpecified TOC from a document removed successfully.\nFile saved at " + dataDir); | |
} | |
/// <summary> | |
/// Removes the specified table of contents field from the document. | |
/// </summary> | |
/// <param name="doc">The document to remove the field from.</param> | |
/// <param name="index">The zero-based index of the TOC to remove.</param> | |
public static void RemoveTableOfContents(Document doc, int index) | |
{ | |
// Store the FieldStart nodes of TOC fields in the document for quick access. | |
ArrayList fieldStarts = new ArrayList(); | |
// This is a list to store the nodes found inside the specified TOC. They will be removed | |
// At the end of this method. | |
ArrayList nodeList = new ArrayList(); | |
foreach (FieldStart start in doc.GetChildNodes(NodeType.FieldStart, true)) | |
{ | |
if (start.FieldType == FieldType.FieldTOC) | |
{ | |
// Add all FieldStarts which are of type FieldTOC. | |
fieldStarts.Add(start); | |
} | |
} | |
// Ensure the TOC specified by the passed index exists. | |
if (index > fieldStarts.Count - 1) | |
throw new ArgumentOutOfRangeException("TOC index is out of range"); | |
bool isRemoving = true; | |
// Get the FieldStart of the specified TOC. | |
Node currentNode = (Node)fieldStarts[index]; | |
while (isRemoving) | |
{ | |
// It is safer to store these nodes and delete them all at once later. | |
nodeList.Add(currentNode); | |
currentNode = currentNode.NextPreOrder(doc); | |
// Once we encounter a FieldEnd node of type FieldTOC then we know we are at the end | |
// Of the current TOC and we can stop here. | |
if (currentNode.NodeType == NodeType.FieldEnd) | |
{ | |
FieldEnd fieldEnd = (FieldEnd)currentNode; | |
if (fieldEnd.FieldType == FieldType.FieldTOC) | |
isRemoving = false; | |
} | |
} | |
// Remove all nodes found in the specified TOC. | |
foreach (Node node in nodeList) | |
{ | |
node.Remove(); | |
} | |
} |
Wyodrębnij spis treści
Jeśli chcesz wyodrębnić spis treści z dowolnego dokumentu programu Word, możesz użyć następującego przykładowego kodu:
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir_WorkingWithDocument(); | |
string fileName = "TOC.doc"; | |
Aspose.Words.Document doc = new Aspose.Words.Document(dataDir + fileName); | |
foreach (Field field in doc.Range.Fields) | |
{ | |
if (field.Type.Equals(Aspose.Words.Fields.FieldType.FieldHyperlink)) | |
{ | |
FieldHyperlink hyperlink = (FieldHyperlink)field; | |
if (hyperlink.SubAddress != null && hyperlink.SubAddress.StartsWith("_Toc")) | |
{ | |
Paragraph tocItem = (Paragraph)field.Start.GetAncestor(NodeType.Paragraph); | |
Console.WriteLine(tocItem.ToString(SaveFormat.Text).Trim()); | |
Console.WriteLine("------------------"); | |
if (tocItem != null) | |
{ | |
Bookmark bm = doc.Range.Bookmarks[hyperlink.SubAddress]; | |
// Get the location this TOC Item is pointing to | |
Paragraph pointer = (Paragraph)bm.BookmarkStart.GetAncestor(NodeType.Paragraph); | |
Console.WriteLine(pointer.ToString(SaveFormat.Text)); | |
} | |
} // End If | |
}// End If | |
}// End Foreach |