استخراج محتوا بین گره ها در یک سند

هنگام کار با اسناد، مهم است که بتوانید به راحتی محتوا را از یک محدوده خاص در یک سند استخراج کنید. با این حال، محتوا ممکن است از عناصر پیچیده ای مانند پاراگراف ها، جداول، تصاویر و غیره تشکیل شده باشد.

صرف نظر از اینکه چه محتوایی باید استخراج شود، روش استخراج آن محتوا همیشه مشخص می شود که کدام گره ها برای استخراج محتوا انتخاب می شوند. اینها می توانند کل متن یا اجرای متن ساده باشند.

موقعیت‌های احتمالی زیادی وجود دارد و بنابراین انواع گره‌های متفاوتی وجود دارد که باید هنگام استخراج محتوا در نظر گرفت. برای مثال، ممکن است بخواهید محتوا را بین موارد زیر استخراج کنید:

  • دو پاراگراف خاص
  • اجراهای خاص متن
  • انواع فیلدها مانند فیلدهای ادغام
  • محدوده شروع و پایان یک نشانک یا نظر
  • متن های مختلف موجود در بخش های جداگانه

در برخی شرایط، ممکن است حتی نیاز به ترکیب انواع مختلف گره داشته باشید، مانند استخراج محتوا بین یک پاراگراف و یک فیلد، یا بین اجرا و یک نشانک.

این مقاله پیاده سازی کد برای استخراج متن بین گره های مختلف و همچنین نمونه هایی از سناریوهای رایج را ارائه می دهد.

چرا مطالب را استخراج کنیم

اغلب هدف از استخراج محتوا، کپی کردن یا ذخیره آن به طور جداگانه در یک سند جدید است. به عنوان مثال، می توانید محتوا را استخراج کنید و:

  • آن را در یک سند جداگانه کپی کنید
  • تبدیل بخشی خاص از یک سند به PDF یا تصویر
  • مطالب موجود در سند را چندین بار کپی کنید
  • با محتوای استخراج شده جدا از بقیه سند کار کنید

این را می توان به راحتی با استفاده از Aspose.Words و اجرای کد زیر به دست آورد.

الگوریتم استخراج محتوا

کد موجود در این بخش به تمام موقعیت های ممکن که در بالا توضیح داده شد با یک روش کلی و قابل استفاده مجدد می پردازد. طرح کلی این تکنیک شامل موارد زیر است:

  1. جمع آوری گره هایی که محدوده محتوایی را که از سند شما استخراج می شود را دیکته کنید. بازیابی این گره ها توسط کاربر در کد آنها بر اساس آنچه که می خواهد استخراج شود انجام می شود.
  2. ارسال این گره ها به روش ExtractContent ارائه شده در زیر. شما همچنین باید یک پارامتر بولی ارسال کنید که بیان می کند آیا این گره ها، که به عنوان نشانگر عمل می کنند، باید در استخراج گنجانده شوند یا خیر.
  3. بازیابی لیستی از محتوای کلون شده (گره های کپی شده) مشخص شده برای استخراج. شما می توانید از این لیست گره ها به هر روشی قابل اجرا استفاده کنید، به عنوان مثال، ایجاد یک سند جدید که فقط حاوی محتوای انتخاب شده باشد.

نحوه استخراج محتوا

برای استخراج محتوا از سند خود باید روش ExtractContent زیر را فراخوانی کرده و پارامترهای مناسب را پاس کنید. اساس اساسی این روش شامل یافتن گره های سطح بلوک (پاراگراف ها و جداول) و شبیه سازی آنها برای ایجاد کپی های یکسان است. اگر گره‌های نشانگر ارسال شده در سطح بلوک باشند، روش می‌تواند به سادگی محتوای آن سطح را کپی کرده و به آرایه اضافه کند.

با این حال، اگر گره‌های نشانگر به صورت خطی باشند (فرزند یک پاراگراف)، وضعیت پیچیده‌تر می‌شود، زیرا لازم است پاراگراف را در گره درون خطی تقسیم کرد، خواه اجرا، فیلدهای نشانک و غیره باشد. محتوای موجود در گره‌های والد شبیه‌سازی‌شده موجود بین نشانگرها حذف می شود. این فرآیند برای اطمینان از اینکه گره های درون خطی همچنان قالب بندی پاراگراف والد را حفظ می کنند استفاده می شود. این روش همچنین بر روی گره‌هایی که به عنوان پارامتر ارسال می‌شوند، بررسی می‌کند و اگر هر یک از گره‌ها نامعتبر باشد، یک استثنا ایجاد می‌کند. پارامترهایی که باید به این متد ارسال شوند عبارتند از:

  1. StartNode و EndNode. دو پارامتر اول گره هایی هستند که به ترتیب تعیین می کنند که استخراج محتوا از کجا شروع شود و کجا به پایان برسد. این گره ها می توانند هر دو سطح بلوک (Paragraph، Table) یا سطح درونی (به عنوان مثال Run، FieldStart، BookmarkStart و غیره) باشند:
    1. برای ارسال یک فیلد باید شی FieldStart مربوطه را ارسال کنید
    2. برای ارسال نشانک ها، گره های BookmarkStart و BookmarkEnd باید ارسال شوند
    3. برای ارسال نظرات باید از گره های CommentRangeStart و CommentRangeEnd استفاده شود
  2. IsInclusive. مشخص می کند که آیا نشانگرها در استخراج گنجانده شده اند یا خیر. اگر این گزینه روی false تنظیم شود و همان گره یا گره های متوالی ارسال شود، یک لیست خالی برگردانده می شود:
    1. اگر یک گره FieldStart ارسال شود، این گزینه تعیین می کند که آیا کل فیلد باید گنجانده شود یا حذف شود
    2. اگر یک گره BookmarkStart یا BookmarkEnd ارسال شود، این گزینه مشخص می کند که نشانک شامل یا فقط محتوای بین محدوده نشانک باشد.
    3. اگر یک گره CommentRangeStart یا CommentRangeEnd ارسال شود، این گزینه تعیین می کند که آیا خود نظر قرار است شامل شود یا فقط محتوا در محدوده نظر.

پیاده سازی روش ExtractContent می توانید در Aspose.Words GitHub را پیدا کنید. به این روش در سناریوهای این مقاله اشاره خواهد شد.

ما همچنین یک روش سفارشی برای تولید آسان یک سند از گره های استخراج شده تعریف خواهیم کرد. این روش در بسیاری از سناریوهای زیر استفاده می شود و به سادگی یک سند جدید ایجاد می کند و محتوای استخراج شده را وارد آن می کند.

مثال کد زیر نحوه گرفتن لیستی از گره ها و درج آنها را در یک سند جدید نشان می دهد:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
public static Document GenerateDocument(Document srcDoc, List<Node> nodes)
{
Document dstDoc = new Document();
// Remove the first paragraph from the empty document.
dstDoc.FirstSection.Body.RemoveAllChildren();
// Import each node from the list into the new document. Keep the original formatting of the node.
NodeImporter importer = new NodeImporter(srcDoc, dstDoc, ImportFormatMode.KeepSourceFormatting);
foreach (Node node in nodes)
{
Node importNode = importer.ImportNode(node, true);
dstDoc.FirstSection.Body.AppendChild(importNode);
}
return dstDoc;
}

استخراج محتوا بین پاراگراف ها

این نشان می دهد که چگونه می توان از روش بالا برای استخراج محتوا بین پاراگراف های خاص استفاده کرد. در این صورت می خواهیم متن نامه ای که در نیمه اول سند یافت شده را استخراج کنیم. می توان گفت که این بین پاراگراف 7 و 11 است.

کد زیر این کار را انجام می دهد. پاراگراف های مناسب با استفاده از روش GetChild بر روی سند و عبور شاخص های مشخص شده استخراج می شوند. سپس این گره ها را به متد ExtractContent منتقل می کنیم و بیان می کنیم که این گره ها باید در استخراج گنجانده شوند. این روش محتوای کپی شده بین این گره ها را برمی گرداند که سپس در یک سند جدید درج می شوند.

مثال کد زیر نحوه استخراج محتوا بین پاراگراف های خاص را با استفاده از روش ExtractContent در بالا نشان می دهد:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document(MyDir + "Extract content.docx");
Paragraph startPara = (Paragraph) doc.FirstSection.Body.GetChild(NodeType.Paragraph, 6, true);
Paragraph endPara = (Paragraph) doc.FirstSection.Body.GetChild(NodeType.Paragraph, 10, true);
// Extract the content between these nodes in the document. Include these markers in the extraction.
List<Node> extractedNodes = ExtractContentHelper.ExtractContent(startPara, endPara, true);
Document dstDoc = ExtractContentHelper.GenerateDocument(doc, extractedNodes);
dstDoc.Save(ArtifactsDir + "ExtractContent.ExtractContentBetweenParagraphs.docx");

استخراج محتوا بین انواع مختلف گره ها

ما می توانیم محتوا را بین هر ترکیبی از سطح بلوک یا گره های درون خطی استخراج کنیم. در این سناریوی زیر، محتوای بین پاراگراف اول و جدول در بخش دوم را به طور فراگیر استخراج می کنیم. گره های نشانگر را با فراخوانی روش های FirstParagraph و GetChild در بخش دوم سند برای بازیابی گره های Paragraph و Table مناسب دریافت می کنیم. برای تغییر جزئی، اجازه دهید به جای آن محتوا را کپی کرده و آن را در زیر نسخه اصلی قرار دهیم.

مثال کد زیر نحوه استخراج محتوا بین پاراگراف و جدول را با استفاده از روش ExtractContent نشان می دهد:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document(MyDir + "Extract content.docx");
Paragraph startPara = (Paragraph) doc.LastSection.GetChild(NodeType.Paragraph, 2, true);
Table endTable = (Table) doc.LastSection.GetChild(NodeType.Table, 0, true);
// Extract the content between these nodes in the document. Include these markers in the extraction.
List<Node> extractedNodes = ExtractContentHelper.ExtractContent(startPara, endTable, true);
// Let's reverse the array to make inserting the content back into the document easier.
extractedNodes.Reverse();
foreach (Node extractedNode in extractedNodes)
endTable.ParentNode.InsertAfter(extractedNode, endTable);
doc.Save(ArtifactsDir + "ExtractContent.ExtractContentBetweenBlockLevelNodes.docx");

استخراج محتوا بین پاراگراف ها بر اساس سبک

ممکن است لازم باشد محتوا را بین پاراگراف هایی با سبک مشابه یا متفاوت استخراج کنید، مانند بین پاراگراف هایی که با سبک های عنوان مشخص شده اند. کد زیر نحوه رسیدن به این هدف را نشان می دهد. این یک مثال ساده است که بدون استخراج سرفصل ها، محتوا را بین اولین نمونه از سبک های “Heading 1” و “Header 3” استخراج می کند. برای انجام این کار، آخرین پارامتر را روی false قرار می دهیم، که مشخص می کند گره های نشانگر نباید شامل شوند.

در یک پیاده سازی مناسب، این باید در یک حلقه اجرا شود تا محتوا بین تمام پاراگراف های این سبک ها از سند استخراج شود. محتوای استخراج شده در یک سند جدید کپی می شود.

مثال کد زیر نحوه استخراج محتوا بین پاراگراف ها با سبک های خاص را با استفاده از روش ExtractContent نشان می دهد:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document(MyDir + "Extract content.docx");
// Gather a list of the paragraphs using the respective heading styles.
List<Paragraph> parasStyleHeading1 = ParagraphsByStyleName(doc, "Heading 1");
List<Paragraph> parasStyleHeading3 = ParagraphsByStyleName(doc, "Heading 3");
// Use the first instance of the paragraphs with those styles.
Node startPara = parasStyleHeading1[0];
Node endPara = parasStyleHeading3[0];
// Extract the content between these nodes in the document. Don't include these markers in the extraction.
List<Node> extractedNodes = ExtractContentHelper.ExtractContent(startPara, endPara, false);
Document dstDoc = ExtractContentHelper.GenerateDocument(doc, extractedNodes);
dstDoc.Save(ArtifactsDir + "ExtractContent.ExtractContentBetweenParagraphStyles.docx");
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
public List<Paragraph> ParagraphsByStyleName(Document doc, string styleName)
{
// Create an array to collect paragraphs of the specified style.
List<Paragraph> paragraphsWithStyle = new List<Paragraph>();
NodeCollection paragraphs = doc.GetChildNodes(NodeType.Paragraph, true);
// Look through all paragraphs to find those with the specified style.
foreach (Paragraph paragraph in paragraphs)
{
if (paragraph.ParagraphFormat.Style.Name == styleName)
paragraphsWithStyle.Add(paragraph);
}
return paragraphsWithStyle;
}

استخراج محتوا بین اجراهای خاص

شما می توانید محتوا را بین گره های درون خطی مانند Run نیز استخراج کنید. Runs از پاراگراف های مختلف می تواند به عنوان نشانگر ارسال شود. کد زیر نحوه استخراج متن خاص را در بین همان گره Paragraph نشان می دهد.

مثال کد زیر نحوه استخراج محتوا بین اجراهای خاص همان پاراگراف را با استفاده از روش ExtractContent نشان می دهد:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document(MyDir + "Extract content.docx");
Paragraph para = (Paragraph) doc.GetChild(NodeType.Paragraph, 7, true);
Run startRun = para.Runs[1];
Run endRun = para.Runs[4];
// Extract the content between these nodes in the document. Include these markers in the extraction.
List<Node> extractedNodes = ExtractContentHelper.ExtractContent(startRun, endRun, true);
foreach (Node extractedNode in extractedNodes)
Console.WriteLine(extractedNode.ToString(SaveFormat.Text));

استخراج محتوا با استفاده از یک فیلد

برای استفاده از یک فیلد به عنوان نشانگر، گره FieldStart باید ارسال شود. آخرین پارامتر متد ExtractContent تعیین می کند که آیا کل فیلد قرار است گنجانده شود یا خیر. بیایید محتوای بین قسمت ادغام “FullName” و یک پاراگراف در سند را استخراج کنیم. ما از متد MoveToMergeField کلاس DocumentBuilder استفاده می کنیم. این گره FieldStart را از نام فیلد ادغام ارسال شده به آن برمی گرداند.

در مورد ما، اجازه دهید آخرین پارامتر ارسال شده به روش ExtractContent را روی false تنظیم کنیم تا فیلد از استخراج حذف شود. ما محتوای استخراج شده را به PDF ارائه می کنیم.

مثال کد زیر نحوه استخراج محتوا بین یک فیلد و پاراگراف خاص در سند را با استفاده از روش ExtractContent نشان می دهد:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document(MyDir + "Extract content.docx");
DocumentBuilder builder = new DocumentBuilder(doc);
// Pass the first boolean parameter to get the DocumentBuilder to move to the FieldStart of the field.
// We could also get FieldStarts of a field using GetChildNode method as in the other examples.
builder.MoveToMergeField("Fullname", false, false);
// The builder cursor should be positioned at the start of the field.
FieldStart startField = (FieldStart) builder.CurrentNode;
Paragraph endPara = (Paragraph) doc.FirstSection.GetChild(NodeType.Paragraph, 5, true);
// Extract the content between these nodes in the document. Don't include these markers in the extraction.
List<Node> extractedNodes = ExtractContentHelper.ExtractContent(startField, endPara, false);
Document dstDoc = ExtractContentHelper.GenerateDocument(doc, extractedNodes);
dstDoc.Save(ArtifactsDir + "ExtractContent.ExtractContentUsingField.docx");

استخراج محتوا از یک نشانک

در یک سند، محتوایی که در یک نشانک تعریف شده است توسط گره های BookmarkStart و BookmarkEnd کپسوله می شود. محتوای یافت شده بین این دو گره نشانک را تشکیل می دهد. می‌توانید هر یک از این گره‌ها را به‌عنوان هر نشانگر، حتی گره‌هایی از نشانک‌های مختلف، ارسال کنید، تا زمانی که نشانگر شروع قبل از نشانگر پایانی در سند ظاهر شود. ما این محتوا را با استفاده از کد زیر در یک سند جدید استخراج می کنیم. گزینه پارامتر IsInclusive نحوه حفظ یا حذف نشانک را نشان می دهد.

مثال کد زیر نحوه استخراج محتوای ارجاع شده به نشانک را با استفاده از روش ExtractContent نشان می دهد:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document(MyDir + "Extract content.docx");
Bookmark bookmark = doc.Range.Bookmarks["Bookmark1"];
BookmarkStart bookmarkStart = bookmark.BookmarkStart;
BookmarkEnd bookmarkEnd = bookmark.BookmarkEnd;
// Firstly, extract the content between these nodes, including the bookmark.
List<Node> extractedNodesInclusive = ExtractContentHelper.ExtractContent(bookmarkStart, bookmarkEnd, true);
Document dstDoc = ExtractContentHelper.GenerateDocument(doc, extractedNodesInclusive);
dstDoc.Save(ArtifactsDir + "ExtractContent.ExtractContentBetweenBookmark.IncludingBookmark.docx");
// Secondly, extract the content between these nodes this time without including the bookmark.
List<Node> extractedNodesExclusive = ExtractContentHelper.ExtractContent(bookmarkStart, bookmarkEnd, false);
dstDoc = ExtractContentHelper.GenerateDocument(doc, extractedNodesExclusive);
dstDoc.Save(ArtifactsDir + "ExtractContent.ExtractContentBetweenBookmark.WithoutBookmark.docx");

مطالب را از یک نظر استخراج کنید

یک نظر از گره های CommentRangeStart، CommentRangeEnd و Comment تشکیل شده است. همه این گره ها به صورت خطی هستند. همانطور که در تصویر زیر مشاهده می شود، دو گره اول محتوای سند را که توسط نظر به آن ارجاع داده می شود، محصور می کنند.

گره Comment خود یک InlineStory است که می تواند شامل پاراگراف ها و اجراها باشد. این نشان دهنده پیام نظر است که به عنوان یک حباب نظر در صفحه بررسی دیده می شود. از آنجایی که این گره درون خطی است و از یک بدنه است، می توانید محتوا را از داخل این پیام نیز استخراج کنید.

نظر عنوان، پاراگراف اول و جدول در بخش دوم را در بر می گیرد. بیایید این نظر را در یک سند جدید استخراج کنیم. گزینه IsInclusive تعیین می کند که خود نظر حفظ شود یا کنار گذاشته شود.

مثال کد زیر نحوه انجام این کار را نشان می دهد:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document(MyDir + "Extract content.docx");
CommentRangeStart commentStart = (CommentRangeStart) doc.GetChild(NodeType.CommentRangeStart, 0, true);
CommentRangeEnd commentEnd = (CommentRangeEnd) doc.GetChild(NodeType.CommentRangeEnd, 0, true);
// Firstly, extract the content between these nodes including the comment as well.
List<Node> extractedNodesInclusive = ExtractContentHelper.ExtractContent(commentStart, commentEnd, true);
Document dstDoc = ExtractContentHelper.GenerateDocument(doc, extractedNodesInclusive);
dstDoc.Save(ArtifactsDir + "ExtractContent.ExtractContentBetweenCommentRange.IncludingComment.docx");
// Secondly, extract the content between these nodes without the comment.
List<Node> extractedNodesExclusive = ExtractContentHelper.ExtractContent(commentStart, commentEnd, false);
dstDoc = ExtractContentHelper.GenerateDocument(doc, extractedNodesExclusive);
dstDoc.Save(ArtifactsDir + "ExtractContent.ExtractContentBetweenCommentRange.WithoutComment.docx");

نحوه استخراج محتوا با استفاده از DocumentVisitor

از کلاس DocumentVisitor برای اجرای این سناریوی استفاده استفاده کنید. این کلاس با الگوی شناخته شده طراحی Visitor مطابقت دارد. با DocumentVisitor , می توانید عملیات سفارشی را که نیاز به شمارش روی درخت سند دارند تعریف و اجرا کنید.

DocumentVisitor مجموعه‌ای از روش‌های VisitXXX را ارائه می‌کند که هنگام مواجهه با یک عنصر سند خاص (گره) فراخوانی می‌شوند. به عنوان مثال، VisitParagraphStart زمانی فراخوانی می شود که ابتدای یک پاراگراف متنی پیدا شود و VisitParagraphEnd زمانی فراخوانی می شود که انتهای یک پاراگراف متنی پیدا شود. هر متد DocumentVisitor.VisitXXX شی مربوطه را می پذیرد که با آن مواجه می شود، بنابراین می توانید در صورت نیاز از آن استفاده کنید (مثلاً DocumentVisitor.VisitParagraphStart و DocumentVisitor.VisitParagraphEnd یک شی Paragraph را می پذیرند.

هر روش DocumentVisitor.VisitXXX یک مقدار VisitorAction را برمی‌گرداند که شمارش گره‌ها را کنترل می‌کند. می توانید درخواست کنید که شمارش را ادامه دهید، از گره فعلی رد شوید (اما شمارش را ادامه دهید)، یا شمارش گره ها را متوقف کنید.

این مراحلی است که باید برای تعیین و استخراج بخش‌های مختلف یک سند به صورت برنامه‌نویسی دنبال کنید:

  • یک کلاس برگرفته از DocumentVisitor ایجاد کنید
  • نادیده گرفتن و ارائه پیاده سازی برای برخی یا همه روش های DocumentVisitor.VisitXXX برای انجام برخی از عملیات سفارشی
  • Node.Accept را روی گره از جایی که می‌خواهید شمارش را شروع کنید، فراخوانی کنید، برای مثال، اگر می‌خواهید کل سند را شمارش کنید، از Document.Accept استفاده کنید

DocumentVisitor پیاده سازی های پیش فرض را برای همه روش های DocumentVisitor.VisitXXX فراهم می کند. این کار ایجاد بازدیدکنندگان سند جدید را آسان‌تر می‌کند، زیرا فقط روش‌های مورد نیاز برای بازدیدکننده خاص باید نادیده گرفته شوند. لزومی ندارد که همه روش‌های بازدیدکننده را لغو کنید.

مثال زیر نحوه استفاده از الگوی Visitor برای افزودن عملیات جدید به مدل شیء Aspose.Words را نشان می دهد. در این مورد، ما یک مبدل سند ساده به قالب متن ایجاد می کنیم:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document(MyDir + "Extract content.docx");
ConvertDocToTxt convertToPlainText = new ConvertDocToTxt();
// Note that every node in the object model has the accept method so the visiting
// can be executed not only for the whole document, but for any node in the document.
doc.Accept(convertToPlainText);
// Once the visiting is complete, we can retrieve the result of the operation,
// That in this example, has accumulated in the visitor.
Console.WriteLine(convertToPlainText.GetText());
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
/// <summary>
/// Simple implementation of saving a document in the plain text format. Implemented as a Visitor.
/// </summary>
internal class ConvertDocToTxt : DocumentVisitor
{
public ConvertDocToTxt()
{
mIsSkipText = false;
mBuilder = new StringBuilder();
}
/// <summary>
/// Gets the plain text of the document that was accumulated by the visitor.
/// </summary>
public string GetText()
{
return mBuilder.ToString();
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// </summary>
public override VisitorAction VisitRun(Run run)
{
AppendText(run.Text);
// Let the visitor continue visiting other nodes.
return VisitorAction.Continue;
}
/// <summary>
/// Called when a FieldStart node is encountered in the document.
/// </summary>
public override VisitorAction VisitFieldStart(FieldStart fieldStart)
{
// In Microsoft Word, a field code (such as "MERGEFIELD FieldName") follows
// after a field start character. We want to skip field codes and output field.
// Result only, therefore we use a flag to suspend the output while inside a field code.
// Note this is a very simplistic implementation and will not work very well.
// If you have nested fields in a document.
mIsSkipText = true;
return VisitorAction.Continue;
}
/// <summary>
/// Called when a FieldSeparator node is encountered in the document.
/// </summary>
public override VisitorAction VisitFieldSeparator(FieldSeparator fieldSeparator)
{
// Once reached a field separator node, we enable the output because we are
// now entering the field result nodes.
mIsSkipText = false;
return VisitorAction.Continue;
}
/// <summary>
/// Called when a FieldEnd node is encountered in the document.
/// </summary>
public override VisitorAction VisitFieldEnd(FieldEnd fieldEnd)
{
// Make sure we enable the output when reached a field end because some fields
// do not have field separator and do not have field result.
mIsSkipText = false;
return VisitorAction.Continue;
}
/// <summary>
/// Called when visiting of a Paragraph node is ended in the document.
/// </summary>
public override VisitorAction VisitParagraphEnd(Paragraph paragraph)
{
// When outputting to plain text we output Cr+Lf characters.
AppendText(ControlChar.CrLf);
return VisitorAction.Continue;
}
public override VisitorAction VisitBodyStart(Body body)
{
// We can detect beginning and end of all composite nodes such as Section, Body,
// Table, Paragraph etc and provide custom handling for them.
mBuilder.Append("*** Body Started ***\r\n");
return VisitorAction.Continue;
}
public override VisitorAction VisitBodyEnd(Body body)
{
mBuilder.Append("*** Body Ended ***\r\n");
return VisitorAction.Continue;
}
/// <summary>
/// Called when a HeaderFooter node is encountered in the document.
/// </summary>
public override VisitorAction VisitHeaderFooterStart(HeaderFooter headerFooter)
{
// Returning this value from a visitor method causes visiting of this
// Node to stop and move on to visiting the next sibling node
// The net effect in this example is that the text of headers and footers
// Is not included in the resulting output
return VisitorAction.SkipThisNode;
}
/// <summary>
/// Adds text to the current output. Honors the enabled/disabled output flag.
/// </summary>
private void AppendText(string text)
{
if (!mIsSkipText)
mBuilder.Append(text);
}
private readonly StringBuilder mBuilder;
private bool mIsSkipText;
}

چگونه فقط متن را استخراج کنیم

راه های بازیابی متن از سند عبارتند از:

  • از Document.Save با SaveFormat.Text برای ذخیره به عنوان متن ساده در یک فایل یا جریان استفاده کنید
  • از Node.ToString استفاده کنید و پارامتر SaveFormat.Text را پاس کنید. در داخل، این ذخیره را به عنوان متن در یک جریان حافظه فراخوانی می کند و رشته حاصل را برمی گرداند
  • از Node.GetText برای بازیابی متن با تمام کاراکترهای کنترل Microsoft Word از جمله کدهای فیلد استفاده کنید
  • اجرای یک DocumentVisitor سفارشی برای انجام استخراج سفارشی

با استفاده از Node.GetText و Node.ToString

یک سند Word می‌تواند شامل کاراکترهای کنترلی باشد که عناصر خاصی مانند فیلد، انتهای سلول، انتهای بخش و غیره را مشخص می‌کنند. فهرست کامل نویسه‌های کنترل ممکن Word در کلاس ControlChar تعریف شده است. روش Node.GetText متنی را با تمام کاراکترهای کنترل موجود در گره برمی گرداند.

فراخوانی ToString نمایش متن ساده سند را فقط بدون کاراکترهای کنترلی برمی گرداند. برای اطلاعات بیشتر در مورد صادرات به صورت متن ساده به بخش “استفاده از SaveFormat.Text” زیر مراجعه کنید.

مثال کد زیر تفاوت بین فراخوانی متدهای GetText و ToString در یک گره را نشان می دهد:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.InsertField("MERGEFIELD Field");
// When converted to text it will not retrieve fields code or special characters,
// but will still contain some natural formatting characters such as paragraph markers etc.
// This is the same as "viewing" the document as if it was opened in a text editor.
Console.WriteLine("Convert to text result: " + doc.ToString(SaveFormat.Text));

با استفاده از SaveFormat.Text

این مثال سند را به صورت زیر ذخیره می کند:

  • کاراکترهای فیلد و کدهای فیلد، شکل، پاورقی، یادداشت پایانی و مراجع نظر را فیلتر می کند
  • کاراکترهای پایان پاراگراف ControlChar.Cr را با ترکیبات ControlChar.CrLf جایگزین می کند
  • از رمزگذاری UTF8 استفاده می کند

مثال کد زیر نحوه ذخیره یک سند در قالب TXT را نشان می دهد:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document(MyDir + "Document.docx");
doc.Save(ArtifactsDir + "BaseConversions.DocxToTxt.txt");
view raw docx-to-txt.cs hosted with ❤ by GitHub

استخراج تصاویر از Shapes

ممکن است برای انجام برخی کارها نیاز به استخراج تصاویر سند داشته باشید. Aspose.Words به شما امکان انجام این کار را نیز می دهد.

مثال کد زیر نحوه استخراج تصاویر از یک سند را نشان می دهد:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document(MyDir + "Images.docx");
NodeCollection shapes = doc.GetChildNodes(NodeType.Shape, true);
int imageIndex = 0;
foreach (Shape shape in shapes)
{
if (shape.HasImage)
{
string imageFileName =
$"Image.ExportImages.{imageIndex}_{FileFormatUtil.ImageTypeToExtension(shape.ImageData.ImageType)}";
// Note, if you have only an image (not a shape with a text and the image),
// you can use shape.GetShapeRenderer().Save(...) method to save the image.
shape.ImageData.Save(ArtifactsDir + imageFileName);
imageIndex++;
}
}