استخراج المحتوى بين العقد في المستند

عند العمل مع المستندات، من المهم أن تكون قادرًا على استخراج المحتوى بسهولة من نطاق معين داخل المستند. ومع ذلك، قد يتكون المحتوى من عناصر معقدة مثل الفقرات والجداول والصور وما إلى ذلك.

بغض النظر عن المحتوى الذي يجب استخراجه، سيتم دائمًا تحديد طريقة استخراج هذا المحتوى من خلال العقد التي يتم تحديدها لاستخراج المحتوى بينها. يمكن أن تكون هذه نصوصًا كاملة أو تشغيلات نصية بسيطة.

هناك العديد من المواقف المحتملة، وبالتالي هناك العديد من أنواع العقد المختلفة التي يجب مراعاتها عند استخراج المحتوى. على سبيل المثال، قد ترغب في استخراج المحتوى بين:

  • فقرتين محددتين
  • مسارات محددة من النص
  • الحقول بمختلف أنواعها، مثل حقول الدمج
  • نطاقات البداية والنهاية للإشارة المرجعية أو التعليق
  • أجسام نصية مختلفة موجودة في أقسام منفصلة

في بعض المواقف، قد تحتاج حتى إلى دمج أنواع العقد المختلفة، مثل استخراج المحتوى بين فقرة وحقل، أو بين التشغيل والإشارة المرجعية.

توفر هذه المقالة تطبيق التعليمات البرمجية لاستخراج النص بين العقد المختلفة، بالإضافة إلى أمثلة للسيناريوهات الشائعة.

لماذا استخراج المحتوى

غالبًا ما يكون الهدف من استخراج المحتوى هو نسخه أو حفظه بشكل منفصل في مستند جديد. على سبيل المثال، يمكنك استخراج المحتوى و:

  • انسخه في مستند منفصل
  • تحويل جزء معين من المستند إلى 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;
}

استخراج المحتوى بين الفقرات

يوضح هذا كيفية استخدام الطريقة المذكورة أعلاه لاستخراج المحتوى بين فقرات محددة. في هذه الحالة، نريد استخراج نص الرسالة الموجودة في النصف الأول من المستند. يمكننا أن نقول أن هذا يقع بين الفقرة السابعة والحادية عشرة.

الكود أدناه ينجز هذه المهمة. يتم استخراج الفقرات المناسبة باستخدام طريقة 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");

استخراج المحتوى بين الفقرات بناءً على النمط

قد تحتاج إلى استخراج المحتوى بين الفقرات التي لها نفس النمط أو نمط مختلف، مثل الفقرات المميزة بأنماط العناوين. يوضح الكود أدناه كيفية تحقيق ذلك. إنه مثال بسيط سيستخرج المحتوى بين المثال الأول لأنماط “العنوان 1” و"العنوان 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 ما إذا كان سيتم تضمين الحقل بأكمله أم لا. لنستخرج المحتوى بين حقل الدمج “الاسم الكامل” وفقرة في المستند. نحن نستخدم طريقة 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 لتنفيذ سيناريو الاستخدام هذا. تتوافق هذه الفئة مع نمط تصميم الزائر المعروف. باستخدام 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. وهذا يجعل من السهل إنشاء زوار مستند جدد حيث يجب تجاوز الأساليب المطلوبة للزائر المعين فقط. ليس من الضروري تجاوز كافة أساليب الزائر.

يوضح المثال التالي كيفية استخدام نمط الزائر لإضافة عمليات جديدة إلى نموذج كائن 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

استخراج الصور من الأشكال

قد تحتاج إلى استخراج صور المستندات لأداء بعض المهام. يتيح لك 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++;
}
}