كيفية التعامل مع النص في .NET
يوضح هذا الدليل كيفية العمل بالنص في Aspose.Words FOSS لـ .NET: تنسيق خط المقطع، تنسيق الفقرة، البحث واستبدال النص باستخدام Range، إضافة تعليق، وتحويل الفقرة إلى عنصر قائمة. يتوفر Aspose.Words FOSS لـ .NET عبر NuGet أو عن طريق بناءه من المصدر.
دليل خطوة بخطوة
الخطوة 1: الحصول على المكتبة
استنسخ المستودع وقم بالبناء Aspose.Words.sln في تكوين Release، ثم أضف إشارة مشروع إلى Aspose.Words.csproj من مشروع .NET الخاص بك، كما هو موضح في دليل التثبيت. أضف using Aspose.Words; في أعلى أي ملف يتعامل مع النص.
الخطوة 2: تنسيق خط المقطع
Run هو مقطع نصي يشارك مجموعة واحدة من التنسيق؛ خاصية Text الخاصة به تحتفظ بالمحتوى النصي العادي وخاصية Font (كائن Font) تحتفظ بالتنسيق على مستوى الأحرف — Name، Size، Bold، Italic، Underline، Color، HighlightColor، Subscript/Superscript، وStrikeThrough من بين أخرى. Font.ClearFormatting() يعيد تعيين المقطع إلى الإعدادات الافتراضية. تتوفر مقاطع الفقرة من خلال خاصية Runs الخاصة بها، وهي RunCollection. ضبط خصائص الخط على DocumentBuilder.Font قبل كتابة نص جديد عادةً ما يكون أبسط من تنسيق كائنات Run الفردية بعد ذلك.
الخطوة 3: تنسيق فقرة
Paragraph.ParagraphFormat (كائن ParagraphFormat) يتحكم في تخطيط الفقرة على المستوى: Alignment، والمسافات البادئة (LeftIndent، RightIndent، FirstLineIndent)، والتباعد (SpaceBefore، SpaceAfter، LineSpacing، LineSpacingRule)، وسلوك ترقيم الصفحات (KeepTogether، KeepWithNext، PageBreakBefore، WidowControl). ParagraphFormat.ClearFormatting() يعيد تعيين هذه إلى القيم الافتراضية، وParagraph.JoinRunsWithSameFormatting() يدمج القطع المتجاورة التي تحمل تنسيقًا متطابقًا — وهو مفيد بعد سلسلة من التعديلات البرمجية التي تترك الفقرة بعدد قطع أكثر من اللازم.
الخطوة 4: البحث والاستبدال بالنص باستخدام النطاق
كل عقدة تحمل محتوى — سواء كانت Document أو Section أو Paragraph أو Run — تكشف عن Range. Range.Text تُرجع النص العادي لكل ما داخل ذلك النطاق، وRange.Replace(pattern, replacement) تُجري عملية بحث واستبدال محصورة في ذلك النطاق فقط: استدعها على Paragraph’s Range لتغيير النص في فقرة واحدة فقط، أو على Document.Range للبحث في المستند بأكمله. Range.Delete() يزيل محتوى النطاق تمامًا.
الخطوة 5: إضافة تعليق
أنشئ Comment باستخدام new Comment(doc, author, initial, dateTime)، واضبط نصه بـ SetText(text)، ثم أدخله في الشجرة مثل أي عقدة أخرى. Comment.AddReply(author, initial, dateTime, text) يرفق ردًا متسلسلًا — وهو نفسه Comment — وRemoveReply(reply) / RemoveAllReplies() يزيلان الردود. تُجمع تعليقات المستند في CommentCollection.
الخطوة 6: تحويل فقرة إلى عنصر قائمة
Paragraph.ListFormat (كائن ListFormat) يُبلغ ويُتحكم فيما إذا كانت الفقرة تشارك في قائمة: IsListItem وListLevelNumber يُبلغان حالتها الحالية. ApplyBulletDefault() يحوِّل الفقرة إلى عنصر نقطي افتراضي وApplyNumberDefault() إلى عنصر رقمي افتراضي؛ ListIndent() / ListOutdent() يغيّران مستوى التداخل الخاص به، وRemoveNumbers() يعيدها إلى فقرة عادية.
المشكلات الشائعة والحلول
تنسيق واحد Runخطه لا يغيّر النص المجاور. النص المجاور مختلف Run مع خاصته Font مثيل. إما أن تحدد وتنسق كل المتأثر Run, أو اضبط التنسيق على DocumentBuilder.Font قبل كتابة نص جديد.
Range.Replace يغيّر النص خارج المنطقة المقصودة. Replace تم استدعاؤه على Document.Range بدلاً من نطاق عقدة أضيق. استدعِه على العنصر المحدد Paragraph or Section الذي يجب أن يتغير نصه.
يبدو الفقرة كعنصر قائمة نقطية ولكن IsListItem is false. الرصاصة نص مكتوب، ليست تنسيق قائمة حقيقي. طبّقها مع ListFormat.ApplyBulletDefault() بدلاً من ذلك.
ينتهي المستند بأكثر بكثير Run العقد أكثر مما هو متوقع. التعديلات البرمجية الصغيرة المتكررة تقسم السلاسل دون إعادة دمجها. استدعِ Paragraph.JoinRunsWithSameFormatting() بعد دفعة من التعديلات.
الأسئلة الشائعة
ما الفرق بين Run و Paragraph؟
الـ Run هو مقطع نصي يشارك مجموعة واحدة من تنسيق الأحرف (Font). الـ Paragraph هو العقدة المركبة التي تحتوي على تشغيل واحد أو أكثر بالإضافة إلى تنسيق على مستوى الفقرة (ParagraphFormat).
كيف يمكنني قراءة كل النص في مستند أو في قسم واحد؟
اقرأ خاصية Text لعقدة Range تلك — document.Range.Text أو section.Range.Text.
كيف يمكنني استبدال النص داخل فقرة واحدة فقط، وليس في المستند بأكمله؟
استدعِ Replace(pattern, replacement) على Range لتلك الـ Paragraph، وليس على Document.Range.
كيف يمكنني الرد على تعليق موجود؟
استدعِ Comment.AddReply(author, initial, dateTime, text) على نسخة الـ Comment الأصلية.
كيف يمكنني تحويل عنصر قائمة مرقمة إلى فقرة عادية؟
استدعِ RemoveNumbers() على ListFormat الخاص بهذه الفقرة.