عند مقارنة ملفين Word وكان الاختلاف الوحيد هو طريقة ترقيم القائمة، على سبيل المثال الفقرات التي كانت 1. و 2. أصبحت الآن a. و b.، أو أن قائمة مرقمة تحولت إلى قائمة نقطية، لا يُظهر Aspose.Words أي اختلافات بشكل افتراضي. يوضح هذا الدليل كيفية اكتشاف تغييرات الترقيم عند مقارنة ملفات Word في Python. كما يشرح كيفية مراجعة التغييرات التي يتم العثور عليها وقبولها أو رفضها.
النقاط الرئيسية
- بشكل افتراضي، لا ينتج عن تغيير نمط ترقيم القائمة أو رمز الرصاصة أي مراجعات عند مقارنة ملفات Word.
- ضبط
options.advanced_options.compare_list_definitions = Trueيُبلغ عن كل فقرة قائمة متأثرة كـ مراجعةFORMAT_CHANGE. - يتم الإبلاغ عن تغييرات النص داخل عناصر القائمة بأي حال. الخيار يضيف فقط تغييرات الترقيم والرصاصة فوق ذلك.
ignore_formatting=Trueيخفي تغييرات الترقيم حتى عندما يكون الخيار مفعلاً.
لماذا لا تظهر تغييرات الترقيم بشكل افتراضي
يأتي الترقيم والنقاط في Word من تعريف القائمة. يصف كيف يبدو كل مستوى من القائمة: نمط الرقم (1.، a.، i.)، رمز النقطة، والتنسيق المتعلق. عند مقارنة المستندات، يتبع Aspose.Words Microsoft Word بشكل افتراضي ويستثني تعريفات القوائم من المقارنة. لذا إذا تغير الترقيم فقط، فإن المقارنة لا ترى ما يُبلغ عنه.
الخيار compare_list_definitions ليس له ما يعادله في Word. إنه يخبر Aspose.Words بتضمين تعريفات القوائم في المقارنة. إليك ما رأيناه عند مقارنة قوائم ذات عنصرين في الإصدار 26.9:
| القائمة الأصلية | القائمة المعدلة | الخيار معطل | الخيار مفعّل |
|---|---|---|---|
مرقّم 1. 2. | نقطية | 0 مراجعات | 2 FORMAT_CHANGE |
مرقّم 1. 2. | مُحرفي a. b. | 0 مراجعات | 2 FORMAT_CHANGE |
| مرقّم، “العنصر 2” | نقطية، “العنصر اثنين” | 2 (DELETION, INSERTION) | 4 (يضيف 2 FORMAT_CHANGE) |
| مرقّم | قائمة مرقّمة متطابقة | 0 مراجعات | 0 مراجعات |
الصف الأخير مهم عمليًا. تشغيل الخيار لا يُنشئ إصدارات إضافية للقوائم التي هي نفسها في كلا الملفين.
المتطلبات المسبقة
أنت بحاجة إلى Aspose.Words for Python via .NET 26.9 أو أحدث. قم بتثبيته أو ترقيته من PyPI:
pip install --upgrade "aspose-words>=26.9"
بدون ترخيص، يعمل Aspose.Words في وضع التقييم مع قيود. ترخيص مؤقت يزيلها أثناء الاختبار.
شاهد الفرق: تغيّر الترقيم مع وبدون الخيار
يقوم البرنامج النصي التالي بإنشاء مستندين يحتويان على نفس العنصرين. يستخدم الأول قائمة مرقمة، بينما يستخدم الثاني قائمة نقطية. يتم مقارنتهما مرتين، مرة مع إيقاف الخيار ومرة أخرى مع تشغيله، حتى تتمكن من رؤية بالضبط ما يغيّره الخيار.
import datetime
import aspose.words as aw
def build_list_document(bulleted: bool) -> aw.Document:
"""Create a two-item list, either numbered or bulleted."""
doc = aw.Document()
builder = aw.DocumentBuilder(doc=doc)
if bulleted:
builder.list_format.apply_bullet_default()
else:
builder.list_format.apply_number_default()
builder.writeln("Item 1")
builder.writeln("Item 2")
builder.list_format.remove_numbers()
return doc
def compare_lists(compare_list_definitions: bool) -> aw.Document:
original = build_list_document(bulleted=False)
edited = build_list_document(bulleted=True)
options = aw.comparing.CompareOptions()
options.advanced_options.compare_list_definitions = compare_list_definitions
# compare() writes revisions into `original`; it returns nothing.
original.compare(
document=edited,
author="Reviewer",
date_time=datetime.datetime.now(),
options=options,
)
return original
for flag in (False, True):
result = compare_lists(flag)
print(f"compare_list_definitions={flag}: {result.revisions.count} revision(s)")
for revision in result.revisions:
revision_type = aw.RevisionType(revision.revision_type).name
text = revision.parent_node.get_text().strip()
print(f" {revision_type}: {text}")
result.save("compared-lists.docx")
تشغيل البرنامج النصي يطبع:
compare_list_definitions=False: 0 revision(s)
compare_list_definitions=True: 2 revision(s)
FORMAT_CHANGE: Item 1
FORMAT_CHANGE: Item 2
كيف يعمل الكود
build_list_documentيستخدمDocumentBuilder.list_formatلبدء قائمة مرقمة أو نقطية افتراضية، يكتب عنصرين، ثم يستدعيremove_numbers()بحيث لا تكون الفقرات اللاحقة جزءًا من القائمة.CompareOptions.advanced_optionsيكشفcompare_list_definitions، والذي يكون افتراضيًاFalse.original.compare(...)يقارنoriginalبـeditedويسجل الاختلافات كمراجعات داخلoriginal. تُعيد الطريقةNone، لذا يجب دائمًا قراءة النتائج من المستند الذي تم استدعاؤها عليه.parent_nodeلكل مراجعة هو فقرة القائمة التي تغير تنسيقها.revision_typeهوRevisionType.FORMAT_CHANGEلتغييرات الترقيم والنقاط.
اكتشاف تغييرات الترقيم بين ملفي Word
في سير عمل حقيقي، تقوم بمقارنة ملفين موجودين، مثل نسختين من عقد. عادةً ما تحتوي تلك المقارنات على مراجعات أخرى أيضًا، لذا فإن البرنامج النصي أدناه يحتفظ فقط بتغييرات التنسيق التي تقع على فقرات القوائم.
import datetime
import aspose.words as aw
original = aw.Document("contract-v1.docx")
edited = aw.Document("contract-v2.docx")
options = aw.comparing.CompareOptions()
options.advanced_options.compare_list_definitions = True
original.compare(edited, "Reviewer", datetime.datetime.now(), options)
# Keep only formatting revisions that sit on list paragraphs.
list_changes = [
rev for rev in original.revisions
if rev.revision_type == aw.RevisionType.FORMAT_CHANGE
and rev.parent_node is not None
and rev.parent_node.node_type == aw.NodeType.PARAGRAPH
and rev.parent_node.as_paragraph().list_format.is_list_item
]
print(f"Total revisions: {original.revisions.count}")
print(f"Formatting changes on list paragraphs: {len(list_changes)}")
for rev in list_changes:
print(f" {rev.parent_node.get_text().strip()}")
original.save("contract-compared.docx")
في اختبارنا، قامت النسخة 2 من العقد بتحويل قائمة مرقمة إلى نقاط وكذلك جعلت جملة غير ذات صلة بالخط العريض. كان الناتج:
Total revisions: 5
Formatting changes on list paragraphs: 2
Invoices are due in 30 days.
Late fees apply after 45 days.
يقوم الفلتر باختيار عنصرَي القائمة ويتخطى التغيير الغامق، لأن هذا التعديل يقع على النص بدلاً من أن يكون على فقرة القائمة. ضع في اعتبارك أنه يطابق أي تغيير في تنسيق الفقرة على عنصر القائمة، مثل تغيير المسافة البادئة، وليس فقط الترقيم. تحقق من المستند المحفوظ إذا كنت بحاجة إلى التمييز بينهما.
مراجعة أو قبول أو رفض تغييرات الترقيم
نظرًا لأن تغييرات الترقيم هي تعديلات تنسيق عادية، فإنك تتعامل معها بنفس الطريقة التي تتعامل بها مع أي تعديل آخر:
revisions.accept_all()يطبق تنسيق القائمة المعدل. في المثال الأول، يصبح كلا العنصرين نقطتين.revisions.reject_all()يحتفظ بالتنسيق الأصلي، لذا تبقى العناصر مرقمة1.و2..- حفظ المستند يكتب المراجعات كتغييرات متتبعة، بحيث يمكن للمراجعين فتح الملف في Microsoft Word وتحديد كل تغيير بأنفسهم.
يمكنك أيضًا استدعاء accept() أو reject() على كائنات Revision الفردية، على سبيل المثال على العناصر الموجودة فقط في قائمة list_changes من القسم السابق.
متى يتم اكتشاف تغييرات الترقيم
قم بتفعيل الخيار عندما يكون لترقيم القائمة معنى لمراجعيك. المستندات القانونية وسياسات الشركة هي حالة شائعة: إعادة ترقيم الفقرات من 1. إلى (a) يغيّر طريقة إشارة المستندات الأخرى إليها، لذا يحتاج المراجع إلى رؤيته. كما أنه مفيد عندما تقوم بترحيل المستندات بين الأنظمة وتريد التأكد من أن ترقيم القائمة بقي دون تغيير بعد النقل.
اتركه معطلاً عندما تهتم فقط بالصياغة. مراجعات المحتوى، وفحوصات الترجمة، والاختلافات على مستوى النص تكون أسهل في القراءة دون خلط تعديلات التنسيق.
أشياء يجب مراقبتها
ignore_formattingيتجاوز الخيار. إذا قمت بتعيينoptions.ignore_formatting = True، فإن تغييرات الترقيم لا يتم الإبلاغ عنها، حتى معcompare_list_definitions = True.- يجب ألا تحتوي الملفات على مراجعات قبل مقارنتها. إذا كان أي من المستندين يحتوي بالفعل على تغييرات متتبعة، فإن
compareيرفع استثناءRuntimeErrorيُشير إلى أن المستندات المقارنة يجب ألا تحتوي على مراجعات. قم بقبول أو رفض المراجعات الموجودة أولاً. وهذا يعني أيضًا أنك لا تستطيع إجراء مقارنة ثانية على مستند يحتوي بالفعل على نتائج المقارنة الأولى؛ أعد تحميل الملفات في كل مرة. - المراجعات الأخرى لا تزال تظهر. يتم الإبلاغ عن النص المُدرج أو المحذوف في عنصر قائمة سواء كان الخيار مفعلاً أم لا، لذا تحقق من
revision_typeإذا كنت بحاجة إلى فصل تغييرات الترقيم عن تغييرات الصياغة.
الخطوات التالية
المقالة مقارنة المستندات في وثائق Aspose.Words for Python تغطي إعدادات المقارنة الأخرى، بما في ذلك الدقة، هدف المقارنة، وخيارات التجاهل.
الأسئلة الشائعة
لماذا لا يكتشف Aspose.Words تغييرات الترقيم عند مقارنة ملفات Word؟ بشكل افتراضي، يتبع Aspose.Words برنامج Microsoft Word ويترك تعريفات القوائم، مثل نمط الترقيم أو رمز الرصاصة، خارج عملية المقارنة. القائمة التي تتغير من أرقام إلى رصاصات لا تُنتج أي تعديلات ما لم تقم بتمكين
compare_list_definitions.كيف يمكنني اكتشاف تغييرات الترقيم في Python؟ أنشئ
CompareOptions، اضبطoptions.advanced_options.compare_list_definitionsإلىTrue، ومرّر الخيارات إلىDocument.compare. كل فقرة قائمة تغير ترقيمها أو نقطتها تتلقى مراجعةFORMAT_CHANGE.ما نوع المراجعة التي ينشئها تغيير الترقيم؟ كل فقرة قائمة متأثرة تحصل على مراجعة من النوع
RevisionType.FORMAT_CHANGE. قبولها يطبق تنسيق القائمة في الملف المعدل، ورفضها يحتفظ بالأصل.هل يعمل هذا الخيار مع ignore_formatting؟ لا. عندما يكون
CompareOptions.ignore_formattingهوTrue، لا يتم الإبلاغ عن تغييرات الترقيم، حتى إذا كانcompare_list_definitionsهوTrue.ماذا تُعيد Document.compare؟ لا شيء. يقوم بكتابة الاختلافات كمراجعات داخل المستند الذي تستدعيه عليه، لذلك تقرأها من مجموعة
revisionsالخاصة بذلك المستند.أي إصدار من Aspose.Words for Python أضاف هذا الخيار؟ تم إضافة الخاصية
compare_list_definitionsمنAdvancedCompareOptionsفي Aspose.Words for Python via .NET 26.9.
