کار با جدول محتویات
اغلب شما با اسناد حاوی جدول محتویات (TOC) کار خواهید کرد. با استفاده از Aspose.Words می توانید جدول محتویات خود را وارد کنید یا جدول محتویات موجود را با استفاده از چند خط کد به طور کامل در سند بازسازی کنید.
این مقاله نحوه کار با جدول محتویات را شرح می دهد و نشان می دهد:
- چگونه یک نام تجاری جدید TOC را وارد کنیم.
- به روز رسانی جدید یا موجود TOCs در سند.
- سوئیچ ها را برای کنترل قالب بندی و ساختار کلی TOC مشخص کنید.
- چگونه سبک ها و ظاهر جدول محتویات را تغییر دهیم.
- چگونه یک فیلد کامل
TOC
را همراه با تمام ورودی های سند حذف کنیم.
جدول محتویات را به صورت برنامه ریزی شده وارد کنید
شما می توانید یک فیلد TOC
(جدول محتویات) را در سند در موقعیت فعلی با فراخوانی روش InsertTableOfContents وارد کنید.
جدول محتویات یک سند ورد را می توان به روش های مختلفی ساخت و با استفاده از گزینه های مختلف فرمت کرد. فیلد سوئیچ هایی که به روش منتقل می کنید، نحوه ساخت و نمایش جدول را در سند شما کنترل می کند.
سوئیچ های پیش فرض که در 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-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
در سند استفاده شود:
لطفا توجه داشته باشید که این دو روش به روز رسانی باید به این ترتیب فراخوانده شوند. اگر معکوس شود جدول محتویات پر خواهد شد اما هیچ شماره صفحه ای نمایش داده نخواهد شد. هر تعداد 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() طرح سند را در حافظه ایجاد می کند. این کار باید برای جمع آوری شماره صفحات ورودی ها انجام شود. شماره صفحه صحیح محاسبه شده از این تماس سپس در TOC وارد می شود.
استفاده از سوئیچ برای کنترل جدول محتویات رفتار
مانند هر فیلد دیگر، فیلد TOC
می تواند سوئیچ های تعریف شده در کد فیلد را که کنترل می کند که چگونه جدول محتویات ساخته شده است، بپذیرد. برخی از سوئیچ ها برای کنترل اینکه کدام ورودی ها شامل می شوند و در چه سطحی استفاده می شوند در حالی که برخی دیگر برای کنترل ظاهر TOC استفاده می شوند. سوئیچ ها را می توان با هم ترکیب کرد تا یک جدول پیچیده از محتویات تولید شود.
به طور پیش فرض، این سوئیچ های بالا هنگام قرار دادن یک TOC
پیش فرض در سند گنجانده شده اند. A TOC
بدون سوئیچ شامل محتوای سبک های عنوان داخلی (به عنوان اگر سوئیچ \O تنظیم شده باشد) خواهد بود.
سوئیچ های موجود TOC
که توسط Aspose.Words پشتیبانی می شوند در زیر ذکر شده و کاربردهای آنها به طور مفصل شرح داده شده است. آنها را می توان بر اساس نوع آنها به بخش های جداگانه تقسیم کرد. سوئیچ های بخش اول تعریف می کنند که چه محتوایی را در TOC
قرار دهند و سوئیچ های بخش دوم ظاهر TOC را کنترل می کنند.
اگر یک سوئیچ در اینجا ذکر نشده باشد، در حال حاضر پشتیبانی نمی شود. همه سوئیچ ها در نسخه های آینده پشتیبانی می شوند. ما در حال اضافه کردن پشتیبانی بیشتر به هر نسخه.
سوئیچ های علامت گذاری ورودی
سوئیچ | توضیحات |
---|---|
Heading Styles * (\O سوئیچ)* |
این سوئیچ تعریف می کند که
|
Outline Levels * (\U سوئیچ)* |
هر پاراگراف می تواند یک سطح طرح را در زیر گزینه های پاراگراف تعریف کند.
توجه داشته باشید که سبک های عنوان داخلی مانند Heading 1 دارای یک مجموعه اجباری سطح طرح در تنظیمات سبک هستند.
|
Custom Styles * (\T سوئیچ)* |
این سوئیچ اجازه می دهد تا سبک های سفارشی برای استفاده در هنگام جمع آوری ورودی ها در TOC استفاده شود. این اغلب در ارتباط با سوئیچ \O برای شامل سبک های سفارشی همراه با سبک های عنوان داخلی در TOC استفاده می شود.
از محتوایی که با CustomHeading1 به عنوان محتوای سطح 1 در |
از فیلدهای TC استفاده کنید * (\F و \L سوئیچ)* |
در نسخههای قدیمی Microsoft Word تنها راه ساخت این فیلد ها را می توان در هر موقعیت مانند هر فیلد دیگر در یک سند قرار داد و با شمارش
فقط شامل فیلد های TC مانند
فیلد
- \F-در بالا توضیح داده شد. - \L - تعریف می کند که در کدام سطح در - |
سوئیچ های مرتبط با ظاهر
سوئیچ | توضیحات |
---|---|
Omit Page Numbers * (\N سوئیچ)* |
این سوئیچ برای پنهان کردن شماره صفحه برای سطوح خاصی از TOC استفاده می شود. به عنوان مثال، شما می توانید تعریف کنید
و شماره صفحه در ورودی های سطح 3 و چهار همراه با نقاط رهبر پنهان خواهد شد (اگر وجود داشته باشد). برای مشخص کردن تنها یک سطح یک محدوده هنوز باید استفاده شود، به عنوان مثال، " 1-1 " شماره صفحه را فقط برای سطح اول حذف می کند. |
درج به عنوان Hyperlinks * (\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” همراه با هر سوئیچ مورد نیاز وارد کنید.
مثال کد زیر نشان می دهد که چگونه یک فیلد TC
را با استفاده از 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"); |
اغلب یک خط متن خاص برای TOC
تعیین می شود و با یک فیلد TC
مشخص می شود. راه ساده برای انجام این کار در MS Word برجسته کردن متن و فشار دادن 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، سطح دوم با سبک TOC2 و غیره فرمت شده است. این بدان معنی است که برای تغییر ظاهر TOC
این سبک ها باید اصلاح شوند. در Aspose.Words این سبک ها توسط مستقل محلی StyleIdentifier.TOC1
تا StyleIdentifier.TOC9
نشان داده می شوند و می توانند از مجموعه Document.Styles
با استفاده از این شناسه ها بازیابی شوند.
هنگامی که سبک مناسب سند بازیابی شده است، قالب بندی برای این سبک می تواند اصلاح شود. هر گونه تغییر در این سبک ها به طور خودکار در 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
حاصل از این کار جسورانه نخواهد بود زیرا این بخشی از قالب بندی سبک است اما به صورت مورب خواهد بود زیرا این به طور مستقیم در پاراگراف قالب بندی شده است.
همچنین می توانید قالب بندی جدا کننده های مورد استفاده بین هر ورودی و شماره صفحه را کنترل کنید. به طور پیش فرض، این یک خط نقطه ای است که با استفاده از یک کاراکتر تب و یک توقف تب راست که در نزدیکی حاشیه راست قرار دارد، به شماره گذاری صفحه گسترش می یابد.
با استفاده از کلاس Style
که برای سطح خاص TOC
که می خواهید تغییر دهید، بازیابی شده است، می توانید نحوه ظاهر شدن این موارد را در سند نیز تغییر دهید.
برای تغییر نحوه ظاهر این ابتدا باید Style.ParagraphFormat
برای بازیابی قالب بندی پاراگراف برای سبک فراخوانده شود. از این، tab stops را می توان با فراخوانی ParagraphFormat.TabStops
و tab stop مناسب اصلاح کرد. با استفاده از همین تکنیک خود برگه را می توان به طور کامل جابجا یا حذف کرد.
مثال کد زیر نشان می دهد که چگونه موقعیت tab stop راست را در پاراگراف های مرتبط 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"); | |
} |
جدول محتویات سند را حذف کنید
جدول محتویات را می توان با حذف تمام گره های موجود بین گره 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-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"); |
استخراج جدول محتویات
اگر می خواهید جدول محتویات هر سند ورد را استخراج کنید، می توانید از نمونه کد زیر استفاده کنید.
// 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 |