کار با فهرست مطالب
اغلب شما با اسنادی که حاوی فهرست مطالب (TOC) هستند کار خواهید کرد. با استفاده از Aspose.Words می توانید فهرست مطالب خود را وارد کنید یا فهرست مطالب موجود را به طور کامل با استفاده از چند خط کد در سند بازسازی کنید. این مقاله نحوه کار با فیلد فهرست مطالب را تشریح می کند و نشان می دهد:
- نحوه قرار دادن یک
TOC
کاملاً جدید - TOC های جدید یا موجود را در سند به روز کنید.
- سوئیچ هایی را برای کنترل قالب بندی و ساختار کلی TOC مشخص کنید.
- نحوه تغییر سبک و ظاهر فهرست مطالب.
- نحوه حذف کل فیلد
TOC
به همراه تمام ورودی های تشکیل دهنده سند.
درج فهرست مطالب به صورت برنامه ای
می توانید با فراخوانی روش InsertTableOfContents یک فیلد TOC
(جدول مطالب) را در موقعیت فعلی در سند وارد کنید.
فهرست مطالب در یک سند 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-.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); |
مثال کد زیر نحوه درج یک فهرست مطالب (TOC) را در یک سند با استفاده از سبک های عنوان به عنوان ورودی نشان می دهد.
// 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
را پیدا میکنید، اما بدون محتوای قابل مشاهده. این به این دلیل است که فیلد TOC
درج شده است اما تا زمانی که در سند به روز نشود هنوز پر نشده است. اطلاعات بیشتر در این مورد در بخش بعدی مورد بحث قرار می گیرد.
به روز رسانی فهرست مطالب
Aspose.Words به شما این امکان را می دهد که تنها با چند خط کد یک TOC
را به طور کامل به روز کنید. این را می توان برای پر کردن یک TOC
جدید درج شده یا به روز رسانی TOC
موجود پس از ایجاد تغییرات در سند انجام داد. برای به روز رسانی فیلدهای TOC
در سند باید از دو روش زیر استفاده شود:
لطفاً توجه داشته باشید که این دو روش بهروزرسانی باید به ترتیب فراخوانی شوند. اگر برعکس شود، فهرست مطالب پر می شود اما شماره صفحه نمایش داده نمی شود. هر تعداد TOC مختلف را می توان به روز کرد. این روش ها به طور خودکار تمام TOC های موجود در سند را به روز می کنند.
مثال کد زیر نحوه بازسازی کامل فیلدهای TOC
در سند را با فراخوانی به روز رسانی فیلد نشان می دهد:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
doc.UpdateFields(); |
اولین تماس با UpdateFields TOC
را ایجاد می کند، تمام ورودی های متن پر شده اند و TOC
تقریباً کامل به نظر می رسد. تنها چیزی که از دست رفته شماره صفحه است که در حال حاضر با “؟” نمایش داده می شود. فراخوانی دوم به UpdatePageLayout، طرح بندی سند را در حافظه ایجاد می کند. این باید برای جمع آوری شماره صفحات ورودی ها انجام شود. شماره صفحات صحیح محاسبه شده از این تماس سپس در TOC درج می شود.
از سوئیچ ها برای کنترل رفتار فهرست مطالب استفاده کنید
مانند هر فیلد دیگری، فیلد TOC
می تواند سوئیچ های تعریف شده در کد فیلد را بپذیرد که نحوه ساخت فهرست مطالب را کنترل می کند. سوئیچ های خاصی برای کنترل ورودی ها و در چه سطحی استفاده می شود در حالی که سایر سوئیچ ها برای کنترل ظاهر TOC استفاده می شوند. سوئیچ ها را می توان با هم ترکیب کرد تا امکان تولید فهرست مطالب پیچیده را فراهم کند.
به طور پیش فرض این سوئیچ های بالا هنگام درج یک TOC
پیش فرض در سند گنجانده می شوند. یک TOC
بدون سوئیچ شامل محتوایی از سبکهای عنوان داخلی میشود (مثل اینکه سوئیچ \O تنظیم شده باشد). سوئیچهای TOC
موجود که توسط Aspose.Words پشتیبانی میشوند در زیر فهرست شدهاند و کاربرد آنها به تفصیل شرح داده شده است. آنها را می توان بر اساس نوع آنها به بخش های جداگانه تقسیم کرد. سوئیچ های بخش اول مشخص می کنند که چه محتوایی باید در TOC
گنجانده شود و سوئیچ های بخش دوم ظاهر TOC را کنترل می کنند. اگر سوئیچ در اینجا فهرست نشده باشد، در حال حاضر پشتیبانی نمی شود. همه سوئیچ ها در نسخه های بعدی پشتیبانی خواهند شد. ما با هر نسخه پشتیبانی بیشتری اضافه می کنیم.
سوئیچ های علامت گذاری ورودی
تعویض | شرح |
---|---|
Heading Styles (\O سوئیچ) |
این سوئیچ تعریف می کند که هر محتوایی که با این سبک ها قالب بندی شده باشد در فهرست مطالب گنجانده شده است. سطح عنوان، سطح سلسله مراتبی متناظر ورودی در TOC را مشخص می کند. به عنوان مثال، یک پاراگراف با سبک عنوان 1 به عنوان اولین سطح در |
Outline Levels (\U سوئیچ) |
هر پاراگراف می تواند یک سطح کلی را در زیر گزینه های پاراگراف تعریف کند. این تنظیم نشان میدهد که این پاراگراف در چه سطحی باید در سلسله مراتب سند قرار گیرد. این معمولاً برای ساختاربندی آسان طرح بندی یک سند استفاده می شود. این سلسله مراتب را می توان با تغییر به Outline View در Microsoft Word مشاهده کرد. مشابه سبک های عنوان، می تواند 1 تا 9 سطح طرح کلی علاوه بر سطح “متن متن” وجود داشته باشد. سطوح طرح کلی 1 تا 9 در توجه داشته باشید که سبک های سرفصل داخلی مانند عنوان 1 دارای یک مجموعه اجباری سطح کلی در تنظیمات سبک هستند.
|
Custom Styles (\T سوئیچ) |
این سوئیچ اجازه می دهد تا از سبک های سفارشی هنگام جمع آوری ورودی ها برای استفاده در TOC استفاده شود. این اغلب همراه با سوئیچ \O برای گنجاندن سبک های سفارشی همراه با سبک های سرفصل داخلی در TOC استفاده می شود.
از محتوای سبک شده با CustomHeading1 به عنوان محتوای سطح 1 در |
Use TC Fields (کلیدهای \F و \L) |
در نسخه های قدیمی Microsoft Word، تنها راه ساخت FieldType.FieldTOCEntry نشان داده می شود.سوئیچ \F در TOC برای تعیین اینکه فیلدهای TC باید به عنوان ورودی استفاده شوند استفاده می شود. سوئیچ به تنهایی بدون هیچ شناسه اضافی به این معنی است که هر فیلد TC در سند گنجانده خواهد شد. هر پارامتر اضافی، اغلب یک حرف منفرد، مشخص می کند که فقط فیلدهای TC که دارای سوئیچ \f منطبق هستند در TOC گنجانده می شوند. برای مثال *
فقط شامل فیلدهای TC مانند
فیلد خود فیلدهای - \F - در بالا توضیح داده شد. - \L - تعیین می کند که این فیلد TC در کدام سطح در - |
سوئیچ های مربوط به ظاهر
تعویض | شرح |
---|---|
Omit Page Numbers (\N سوئیچ) |
این سوئیچ برای مخفی کردن شماره صفحات برای سطوح خاصی از TOC استفاده می شود. به عنوان مثال می توانید تعریف کنید
و شماره صفحه در ورودی های سطوح 3 و 4 به همراه نقاط رهبر (در صورت وجود) پنهان خواهد شد. برای تعیین تنها یک سطح، باز هم باید از یک محدوده استفاده شود، برای مثال “1-1” شماره صفحه را فقط برای سطح اول حذف می کند. |
Insert As Hyperlinks (\H سوئیچ) |
این سوئیچ مشخص می کند که ورودی های |
Set Separator Character (\P سوئیچ) |
این سوئیچ اجازه می دهد تا محتوای جداکننده عنوان ورودی و شماره صفحه به راحتی در TOC تغییر یابد. جداکننده مورد استفاده باید بعد از این سوئیچ مشخص شده و در علائم گفتار محصور شود. |
Preserve Tab Entries (\W سوئیچ) |
با استفاده از این سوئیچ مشخص می شود که هر ورودی که دارای یک کاراکتر برگه است، به عنوان مثال عنوانی که دارای یک برگه در انتهای خط است، هنگام پر کردن TOC به عنوان یک کاراکتر برگه مناسب حفظ می شود. این بدان معنی است که عملکرد کاراکتر برگه در |
Preserve New Line Entries (\X سوئیچ) |
مشابه سوئیچ بالا، این سوئیچ مشخص میکند که عناوین در چندین خط (با استفاده از کاراکترهای خط جدید نه پاراگرافهای مجزا) همانطور که در TOC تولید شده هستند حفظ میشوند. به عنوان مثال، عنوانی که قرار است در چندین خط پخش شود، می تواند از کاراکتر خط جدید (Ctrl + Enter یا |
فیلدهای TC را درج کنید
می توانید با فراخوانی روش InsertField و تعیین نام فیلد به عنوان “TC” به همراه هر سوئیچ مورد نیاز، یک فیلد TC جدید در موقعیت فعلی DocumentBuilder وارد کنید.
مثال کد زیر نحوه درج یک فیلد TC
را با استفاده از 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); |
اغلب یک خط خاص از متن برای TOC
تعیین می شود و با یک فیلد TC
مشخص می شود. راه آسان برای انجام این کار در Microsoft Word این است که متن را برجسته کنید و ALT+SHIFT+O را فشار دهید. این به طور خودکار یک فیلد TC
با استفاده از متن انتخاب شده ایجاد می کند. همین تکنیک را می توان از طریق کد انجام داد. کد زیر متنی را که با ورودی مطابقت دارد پیدا می کند و یک فیلد TC
را در همان موقعیت با متن وارد می کند. کد بر اساس همان تکنیک استفاده شده در مقاله است.
مثال کد زیر نحوه یافتن و درج یک فیلد TC
را در متن یک سند نشان می دهد:
// 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); |
فهرست مطالب را اصلاح کنید
قالببندی ورودیها در TOC
از سبکهای اصلی ورودیهای علامتگذاریشده استفاده نمیشود، در عوض هر سطح با استفاده از سبک TOC
معادل قالببندی میشود. به عنوان مثال سطح اول در TOC
با سبک TOC1، سطح دوم با سبک TOC2 و غیره فرمت شده است. این به این معنی است که برای تغییر ظاهر TOC
، این سبک ها باید اصلاح شوند. در Aspose.Words این سبکها توسط StyleIdentifier.TOC1
مستقل از محلی تا StyleIdentifier.TOC9
نشان داده میشوند و میتوانند با استفاده از این شناسهها از مجموعه Styles بازیابی شوند.
هنگامی که سبک مناسب سند بازیابی شد، قالب بندی این سبک را می توان تغییر داد. هر گونه تغییر در این سبک ها به طور خودکار در TOC ها در سند منعکس می شود.
مثال کد زیر یک ویژگی قالب بندی مورد استفاده در سبک TOC
سطح اول را تغییر می دهد:
// 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; |
همچنین ذکر این نکته مفید است که هر قالب بندی مستقیم یک پاراگراف (که در خود پاراگراف تعریف شده است و نه به سبک) که برای گنجاندن TOC
علامت گذاری شده است، در ورودی TOC کپی می شود. به عنوان مثال، اگر از سبک عنوان 1 برای علامت گذاری محتوا برای TOC
استفاده شود و این سبک دارای قالب بندی Bold باشد در حالی که پاراگراف نیز دارای قالب بندی ایتالیک است که مستقیماً روی آن اعمال می شود. ورودی TOC
بهدستآمده پررنگ نخواهد بود، زیرا بخشی از قالببندی سبک است، اما مورب خواهد بود زیرا مستقیماً در پاراگراف قالببندی شده است.
همچنین می توانید قالب بندی جداکننده های مورد استفاده بین هر ورودی و شماره صفحه را کنترل کنید. به طور پیشفرض، این یک خط نقطه چین است که با استفاده از یک کاراکتر برگه و یک نقطه برگه سمت راست که نزدیک به حاشیه سمت راست ردیف شدهاند، در شمارهگذاری صفحه پخش میشود.
با استفاده از کلاس Style بازیابی شده برای سطح TOC
خاصی که می خواهید تغییر دهید، همچنین می توانید نحوه ظاهر شدن آنها در سند را تغییر دهید. برای تغییر نحوه ظاهر شدن آن ابتدا باید ParagraphFormat فراخوانی شود تا قالب بندی پاراگراف برای سبک بازیابی شود. با فراخوانی TabStops می توان tab stop ها را بازیابی کرد و tab stop مناسب را اصلاح کرد. با استفاده از همین تکنیک، خود برگه را می توان با هم جابجا کرد یا حذف کرد.
مثال کد زیر نحوه تغییر موقعیت برگه سمت راست در پاراگراف های مربوط به 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); |
فهرست مطالب را از سند حذف کنید
با حذف تمام گره های موجود بین گره 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-.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(); | |
} | |
} |
استخراج فهرست مطالب
اگر می خواهید فهرست مطالب را از هر سند Word استخراج کنید، می توانید از نمونه کد زیر استفاده کنید:
// 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 |