زمانی که دو فایل 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 می‌گوید که تعاریف فهرست را در مقایسه گنجانده شود. در اینجا آنچه را که هنگام مقایسه فهرست‌های دو آیتمی در نسخه ۲۶.۹ مشاهده کردیم، می‌بینید:

لیست اصلیلیست ویرایش‌شدهگزینه خاموشگزینه روشن
شماره‌دار 1. 2.نقطه‌دار۰ بازنگری۲ FORMAT_CHANGE
شماره‌دار 1. 2.حرفی a. b.۰ بازنگری۲ FORMAT_CHANGE
شماره‌دار، “مورد ۲”نقطه‌دار، “مورد دو”۲ (DELETION, INSERTION)۴ (افزودن ۲ FORMAT_CHANGE)
شماره‌دارلیست شماره‌دار یکسان۰ بازنگری۰ بازنگری

در عمل، ردیف آخر مهم است. فعال کردن این گزینه revisions اضافی برای فهرست‌هایی که در هر دو فایل یکسان هستند، ایجاد نمی‌کند.

پیش‌نیازها

شما به 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

How the Code Works

  • 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")

در تست ما، نسخه ۲ قرارداد فهرست شماره‌دار را به علامت‌گذاری نقطه‌ای تبدیل کرد و همچنین یک جمله نامرتبط را بولد کرد. خروجی به این شکل بود:

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 به تنظیمات دیگر مقایسه می‌پردازد، از جمله دانه‌بندی، هدف مقایسه و گزینه‌های نادیده‌گیری.

سؤالات متداول

  1. چرا Aspose.Words تغییرات شماره‌گذاری را هنگام مقایسه فایل‌های Word تشخیص نمی‌دهد؟ به‌طور پیش‌فرض، Aspose.Words همانند Microsoft Word عمل می‌کند و تعاریف فهرست، مانند سبک شماره‌گذاری یا کاراکتر گلوله، را از مقایسه حذف می‌کند. فهرستی که از اعداد به گلوله‌ها تغییر می‌کند، هیچ بازنگری‌ای تولید نمی‌کند مگر اینکه compare_list_definitions را فعال کنید.

  2. چگونه می‌توانم تغییرات شماره‌گذاری را در پایتون تشخیص دهم؟ یک شیء CompareOptions ایجاد کنید، options.advanced_options.compare_list_definitions را به True تنظیم کنید و گزینه‌ها را به Document.compare پاس دهید. هر پاراگراف فهرست که شماره‌گذاری یا علامت آن تغییر کرده باشد، یک بازنگری FORMAT_CHANGE دریافت می‌کند.

  3. یک تغییر شماره‌گذاری چه نوع بازنگری ایجاد می‌کند؟ هر پاراگراف فهرست تحت تأثیر یک بازنگری از نوع RevisionType.FORMAT_CHANGE دریافت می‌کند. پذیرش آن قالب‌بندی فهرست فایل ویرایش‌شده را اعمال می‌کند و رد آن نسخه اصلی را حفظ می‌کند.

  4. آیا این گزینه همراه با ignore_formatting کار می‌کند؟ خیر. وقتی CompareOptions.ignore_formatting برابر True باشد، تغییرات شماره‌گذاری گزارش نمی‌شود، حتی اگر compare_list_definitions برابر True باشد.

  5. متد Document.compare چه چیزی برمی‌گرداند؟ هیچ. این متد تفاوت‌ها را به‌صورت بازبینی‌ها در سندی که بر روی آن فراخوانی می‌شود می‌نویسد، بنابراین شما آن‌ها را از مجموعه revisions آن سند می‌خوانید.

  6. کدام نسخه از Aspose.Words for Python این گزینه را اضافه کرد؟
    ویژگی compare_list_definitions از AdvancedCompareOptions در Aspose.Words for Python via .NET نسخه 26.9 اضافه شد.

دریافت یک لایسنس رایگان و پشتیبانی