العمل مع المستندات

العمل مع المستندات

العمل مع المستندات

Aspose.Words FOSS لـ .NET يمثل كل ملف Word كنموذج كائنات في الذاكرة يبدأ من الفئة Document، مع DocumentBuilder التي توفر API عالي المستوى قائم على المؤشر لتأليف المحتوى. يغطي هذا الدليل إنشاء وتحميل المستندات، التأليف باستخدام DocumentBuilder، بنية القسم/المحتوى، تجوال شجرة العقد، دمج المستندات، وحمايتها.


إنشاء وتحميل المستندات

أنشئ مستندًا فارغًا باستخدام new Document()، أو افتح ملفًا موجودًا بتمرير مسار أو Stream إلى المُنشئ Document(fileName) أو Document(stream). التحميلات الزائدة التي تقبل معامل LoadOptions تسمح لك بالتحكم في سلوك التحميل، مثل توفير كلمة مرور لملف مشفر.

قبل تحميل ملف من مصدر غير معروف أو غير موثوق، يقوم FileFormatUtil.DetectFileFormat(fileName) (أو التحميل Stream) بإرجاع FileFormatInfo يصف LoadFormat المكتشف، وما إذا كان الملف IsEncrypted، HasDigitalSignature، أو HasMacros.


التأليف باستخدام DocumentBuilder

DocumentBuilder يغلف Document ويكشف عن مؤشر يمكنك تحريكه عبر المستند أثناء إدراج المحتوى. Write(text) وWriteln(text) يدرجان نصًا عند المؤشر؛ InsertParagraph() يبدأ فقرة جديدة. خصائص التنسيق على المُنشئ — Font، ParagraphFormat، ListFormat، PageSetup — تُطبق على ما يُكتب بعد ذلك.

حرك المؤشر باستخدام MoveToDocumentStart()، MoveToDocumentEnd()، MoveToSection(sectionIndex)، MoveToBookmark(bookmarkName) أو MoveToParagraph(paragraphIndex, characterIndex). خصائص CurrentNode وCurrentParagraph وCurrentSection الخاصة بالباني تُبلغ عن موقعه الحالي في الشجرة.


بنية المستند: الأقسام والجسم

يحتوي Document على SectionCollection (Document.Sections، بالإضافة إلى FirstSection / LastSection)؛ كل Section لديه Body واحد، ومجموعة رؤوس/تذييلات اختيارية، وPageSetup الخاص به. يقوم Section.AppendContent(sourceSection) وPrependContent(sourceSection) بنسخ المحتوى بين الأقسام، وClearContent() يعيد ضبط قسم دون إزالته من المستند.

داخل Body، يُعرَض المحتوى عبر Body.Paragraphs (وهو ParagraphCollection) وBody.Tables. الـRange — المتاح من Document وSection وParagraph وعُقَد أخرى — يمثل مساحة متصلة من الشجرة؛ Range.Text يقرأ نصه الصريح وRange.Replace(pattern, replacement) يُجري عملية بحث-استبدال على تلك المنطقة فقط.


التجول في شجرة العقد باستخدام DocumentVisitor

كل جزء من المستند — الأقسام، الفقرات، السلاسل، الجداول، الحقول، الأشكال، التعليقات، الحواشي — هو Node في شجرة مركبة جذورها Document. لمعالجة كل عقدة من نوع معين دون الحاجة إلى الاستدعاء المتكرر يدويًا، قم بإنشاء فئة فرعية من DocumentVisitor المجردة وتجاوز استدعاءات Visit*Start / Visit*End التي تحتاجها، مثل VisitParagraphStart(paragraph) أو VisitRun(run)، ثم استدعِ document.Accept(visitor). يمكن لكل استدعاء إرجاع VisitorAction (Continue، SkipThisNode أو Stop) للتحكم في طريقة سير التجوال.


استنساخ، استيراد، وإلحاق المحتوى

Document.Clone() ينتج نسخة عميقة من مستند كامل. لنقل المحتوى بين مثيلتين مختلفتين من Document، استدعِ ImportNode(srcNode, isImportChildren) على المستند الوجهة لجلب عقدة من شجرة خارجية، أو استدعِ Document.AppendDocument(srcDoc, importFormatMode) لإلحاق أقسام مستند بآخر باستخدام ImportFormatMode مختار — KeepSourceFormatting أو UseDestinationStyles أو KeepDifferentStyles. DocumentBuilder.InsertDocument(srcDoc, importFormatMode) يدرج محتوى المستند المصدر عند مؤشر الباني بدلاً من نهايته في الوجهة.


حماية المستندات

Document.Protect(type, password) يقيّد التحرير وفقًا لقيمة ProtectionType — ReadOnly، AllowOnlyComments، AllowOnlyRevisions، AllowOnlyFormFields أو NoProtection لإزالة الحماية. Unprotect() (مع أو بدون كلمة مرور) يعكس ذلك. هذا تقييد تحرير يفرضه Word، منفصل عن تشفير كلمة المرور في OOXML الذي يطبّقه OoxmlSaveOptions.Password عند حفظ الملف.


نصائح وأفضل الممارسات

  • يفضَّل استخدام DocumentBuilder لإنشاء محتوى جديد؛ انتقل إلى التلاعب المباشر بالعقد (AppendChild، InsertAfter، Clone) عندما تحتاج إلى سيطرة دقيقة على شجرة موجودة.
  • استدعِ FileFormatUtil.DetectFileFormat قبل تحميل ملف من مصدر غير موثوق أو مقدم من المستخدم حتى تتمكن من فحص LoadFormat ورفض الإدخال غير المدعوم أو المشفر مبكرًا.
  • عند دمج المستندات باستخدام AppendDocument أو InsertDocument، اختر ImportFormatMode بعناية — KeepSourceFormatting يحافظ على مظهر المصدر، UseDestinationStyles يتطابق مع مجموعة أنماط المستند الهدف.
  • استخدم فئة فرعية من DocumentVisitor بدلاً من التجوال اليدوي المتكرر في الشجرة عندما تحتاج إلى معالجة كل مثال من نوع العقدة بشكل ثابت.
  • Document.Protect هو تقييد تحرير، ليس تشفيرًا — اربطه بـ OoxmlSaveOptions.Password إذا كان يجب على الملف المحفوظ نفسه طلب كلمة مرور للفتح.

المشكلات الشائعة

المشكلةالسببالإصلاح
Document(fileName) يرمي استثناءً لملف يفتح بشكل صحيح في Wordتنسيق الملف ليس من التنسيقات التي يدعمها هذا الإصدار للتحميلاستدعِ FileFormatUtil.DetectFileFormat أولاً وتحقق من LoadFormat المُرجع قبل التحميل
المحتوى المضاف يلتقط الخطوط أو الأنماط غير الصحيحةImportFormatMode عدم تطابق بين مجموعات الأنماط المصدر والوجهةقم بتمرير KeepSourceFormatting أو UseDestinationStyles صراحةً بدلاً من الاعتماد على القيمة الافتراضية
يتوقف تجول DocumentVisitor مبكرًا أو يتخطى المحتوىتجاوز Visit*Start / Visit*End يُعيد SkipThisNode أو Stop عن غير قصدأرجع VisitorAction.Continue من كل عملية تجاوز ما لم تكن تقصد تحديدًا التخطي أو الإيقاف
Unprotect() لا يُحدث أي تأثيرلم يتم حماية المستند بكلمة مرور، أو تم توفير كلمة مرور خاطئةاستدعِ Unprotect() بدون أي معطيات إذا تم استدعاء Protect بدون كلمة مرور، وإلا مرّر كلمة المرور المطابقة

FAQ

ما الفرق بين Document.Clone() و ImportNode؟

Clone() ينسخ مستندًا كاملاً إلى نسخة Document جديدة. ImportNode(srcNode, isImportChildren) يجلب عقدة واحدة (وبشكل اختياري أبناءها) من شجرة مستند إلى آخر، وهو ما تستخدمه عند دمج محتوى محدد بدلًا من مستندات كاملة.

ما صيغ الملفات التي يمكن لـ Document(fileName) تحميلها؟

Document(fileName) يحمل DOCX, DOCM, DOTX, DOTM, Flat OPC (بالإضافة إلى المتغيرات الممكنة للماكرو والقوالب)، Markdown، والنص العادي. تم استبعاد صيغ المعالجة النصية والويب القديمة من محملات هذا الإصدار.

كيف يمكنني معرفة مكان تموضع DocumentBuilder حاليًا؟

اقرأ CurrentNode أو CurrentParagraph أو CurrentSection على نسخة المُنشئ.

هل يقوم Document.Protect بتشفير الملف المحفوظ؟

لا — إنها قيد تحرير يفرضه Word عند فتح الملف. لطلب كلمة مرور لفتح الملف فقط، اضبط OoxmlSaveOptions.Password عند الحفظ.

كيف يمكنني قراءة الفقرات فقط في جسم المستند؟

استخدم مجموعة Body.Paragraphs، أو Body.GetChildNodes(nodeType, isDeep) لأنواع العقد الأخرى.


API Reference ملخص

فئة/طريقةوصف
Documentجذر نموذج كائن المستند؛ تقوم المُنشئات بالتحميل من ملف أو تدفق، أو إنشاء مستند فارغ.
Document.Saveيكتب المستند إلى ملف أو تدفق أو استجابة HTTP بتنسيق مختار.
Document.Clone()ينتج نسخة عميقة من المستند بأكمله.
Document.Protect(type, password) / Unprotect()يطبق أو يزيل قيد التحرير.
Document.AppendDocument(srcDoc, importFormatMode)يضيف أقسام مستند آخر إلى هذا المستند.
DocumentBuilderأداة API قائمة على المؤشر لكتابة النص وإدراج المحتوى في مستند.
DocumentBuilder.InsertDocument(srcDoc, importFormatMode)يدرج محتوى مستند المصدر عند المؤشر.
Section / SectionCollectionقسم واحد من مستند، ومجموعة جميع الأقسام.
Bodyحاوية للنص الرئيسي (الفقرات والجداول) لقسم.
Rangeمنطقة متصلة من شجرة المستند؛ تدعم Text و Replace.
DocumentVisitorفئة أساسية مجردة للتنقل عبر كل عقدة في شجرة المستند.
ProtectionTypeتعداد لقيود التحرير على مستوى المستند.
FileFormatUtil.DetectFileFormatيتعرف على تنسيق ملف أو تدفق قبل تحميله.

انظر أيضاً

 العربية