כאשר אתה משווה שני קבצי 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למסמך שעליו אתה קורא אותה, ולכן אתה קורא אותם מאוסף ה-revisionsשל המסמך.איזו גרסה של Aspose.Words for Python הוסיפה אפשרות זו? המאפיין
compare_list_definitionsשלAdvancedCompareOptionsנוסף ב‑Aspose.Words for Python via .NET 26.9.
