زمانی که دو فایل 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 به تنظیمات دیگر مقایسه میپردازد، از جمله دانهبندی، هدف مقایسه و گزینههای نادیدهگیری.
سؤالات متداول
چرا Aspose.Words تغییرات شمارهگذاری را هنگام مقایسه فایلهای Word تشخیص نمیدهد؟ بهطور پیشفرض، Aspose.Words همانند Microsoft Word عمل میکند و تعاریف فهرست، مانند سبک شمارهگذاری یا کاراکتر گلوله، را از مقایسه حذف میکند. فهرستی که از اعداد به گلولهها تغییر میکند، هیچ بازنگریای تولید نمیکند مگر اینکه
compare_list_definitionsرا فعال کنید.چگونه میتوانم تغییرات شمارهگذاری را در پایتون تشخیص دهم؟ یک شیء
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 اضافه شد.
