Když porovnáváte dva soubory Word a jediný rozdíl je v číslování seznamu, například odstavce, které byly 1. a 2., jsou nyní a. a b., nebo číslovaný seznam se změnil na odrážkový, Aspose.Words ve výchozím nastavení nehlásí žádné rozdíly. Tento tutoriál vám ukáže, jak při porovnávání souborů Word v Pythonu detekovat změny číslování. Také vysvětluje, jak přezkoumat, přijmout nebo odmítnout nalezené změny.

Klíčové poznatky

  • Ve výchozím nastavení změna stylu číslování seznamu nebo znaku odrážky nevytváří žádné revize při porovnávání souborů Word.
  • Nastavením options.advanced_options.compare_list_definitions = True se každá ovlivněná položka seznamu zaznamená jako revize FORMAT_CHANGE.
  • Změny textu uvnitř položek seznamu jsou zaznamenány vždy. Volba pouze přidává změny číslování a odrážek navíc.
  • ignore_formatting=True skryje změny číslování i když je volba zapnutá.

Proč se změny číslování ve výchozím nastavení nezobrazují

Číslování a odrážky ve Wordu pocházejí z definice seznamu. Popisuje, jak vypadá každá úroveň seznamu: styl číslování (1., a., i.), znak odrážky a související formátování. Když porovnáváte dokumenty, Aspose.Words ve výchozím nastavení následuje Microsoft Word a vynechává definice seznamů z porovnání. Takže pokud se změnilo jen číslování, porovnání nehlásí žádné rozdíly.

Možnost compare_list_definitions nemá v aplikaci Word ekvivalent. Říká Aspose.Words, aby zahrnoval definice seznamů do porovnání. Zde je to, co jsme viděli při porovnávání dvoupoložkových seznamů ve verzi 26.9:

Původní seznamUpravený seznamMožnost vypnutaMožnost zapnuta
Číslovaný 1. 2.Odrážkový0 revizí2 FORMAT_CHANGE
Číslovaný 1. 2.Písmenkový a. b.0 revizí2 FORMAT_CHANGE
Číslovaný, “Položka 2”Odrážkový, “Položka dva”2 (DELETION, INSERTION)4 (přidá 2 FORMAT_CHANGE)
ČíslovanýIdentický číslovaný seznam0 revizí0 revizí

Poslední řádek má v praxi význam. Zapnutí této možnosti nevytváří další revize pro seznamy, které jsou ve obou souborech stejné.

Požadavky

Potřebujete Aspose.Words for Python via .NET 26.9 nebo novější. Nainstalujte nebo aktualizujte jej z PyPI:

pip install --upgrade "aspose-words>=26.9"

Bez licence Aspose.Words běží v evaluačním režimu s omezeními. Dočasná licence ji odstraňuje během testování.

Podívejte se na rozdíl: Změny číslování s a bez možnosti

Následující skript vytvoří dva dokumenty, které obsahují stejné dva položky. První používá číslovaný seznam a druhý používá odrážkový seznam. Porovná je dvakrát, jednou s vypnutou možností a podruhé se zapnutou, abyste přesně viděli, co možnost mění.

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

Spuštění skriptu vypíše:

compare_list_definitions=False: 0 revision(s)
compare_list_definitions=True: 2 revision(s)
  FORMAT_CHANGE: Item 1
  FORMAT_CHANGE: Item 2

Jak kód funguje

  • build_list_document používá DocumentBuilder.list_format k zahájení výchozího číslovaného nebo odrážkového seznamu, zapíše dva položky a poté zavolá remove_numbers(), aby následující odstavce nebyly součástí seznamu.
  • CompareOptions.advanced_options odhaluje compare_list_definitions, který ve výchozím nastavení je False.
  • original.compare(...) porovnává original s edited a zaznamenává rozdíly jako revize uvnitř original. Metoda vrací None, takže výsledky vždy čtěte z dokumentu, na kterém jste ji zavolali.
  • parent_node každé revize je odstavec seznamu, jehož formátování se změnilo. revision_type je RevisionType.FORMAT_CHANGE pro změny číslování a odrážek.

Detekce změn číslování mezi dvěma soubory Word

Ve skutečném pracovním postupu porovnáváte dva existující soubory, například dvě verze smlouvy. Tyto porovnání obvykle obsahují i další revize, takže skript níže zachovává pouze změny formátování, které se nacházejí v odstavcích seznamu.

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

V našem testu verze 2 smlouvy změnila číslovaný seznam na odrážky a také zvýraznila tučným písmem nesouvisející větu. Výstup byl:

Total revisions: 5
Formatting changes on list paragraphs: 2
  Invoices are due in 30 days.
  Late fees apply after 45 days.

Filtr vybere dva položky seznamu a přeskočí změnu tučného písma, protože tato revize se vztahuje na text spíše než na odstavec seznamu. Mějte na paměti, že odpovídá jakékoli změně formátování na úrovni odstavce u položky seznamu, například změně odsazení, nejen číslování. Zkontrolujte uložený dokument, pokud potřebujete tyto rozdíly rozlišit.

Přezkoumat, přijmout nebo odmítnout změny číslování

Protože změny číslování jsou běžnými revizemi formátu, zacházíte s nimi stejným způsobem jako s jakoukoli jinou revizí:

  • revisions.accept_all() použije upravené formátování seznamu. V prvním příkladu se oba položky změní na odrážky.
  • revisions.reject_all() zachová původní formátování, takže položky zůstanou očíslované 1. a 2..
  • Uložení dokumentu zapíše revize jako sledované změny, takže recenzenti mohou soubor otevřít v Microsoft Word a sami rozhodnout o každé změně.

Můžete také volat accept() nebo reject() na jednotlivých objektech Revision, například jen na položkách v seznamu list_changes z předchozí sekce.

Kdy detekovat změny číslování

Zapněte tuto možnost, když číslování seznamu má pro vaše recenzenty význam. Právní a politické dokumenty jsou běžným příkladem: přečíslování odstavců z 1. na (a) mění způsob, jakým na ně odkazují jiné dokumenty, takže recenzent to musí vidět. Je to také užitečné, když migrujete dokumenty mezi systémy a chcete potvrdit, že číslování seznamu přežilo přesun beze změny.

Vypněte to, pokud vám záleží jen na formulaci. Recenze obsahu, kontrola překladů a rozdíly na úrovni textu jsou snazší číst bez smíchání revizí formátování.

Na co si dát pozor

  • ignore_formatting přepisuje volbu. Pokud nastavíte options.ignore_formatting = True, změny číslování nejsou hlášeny, i když je compare_list_definitions = True.
  • Soubory nesmí obsahovat revize před jejich porovnáním. Pokud má kterýkoli dokument již sledované změny, compare vyvolá RuntimeError s informací, že porovnávané dokumenty nesmí mít revize. Nejprve přijměte nebo odmítněte existující revize. To také znamená, že nemůžete provést druhé porovnání dokumentu, který již obsahuje výsledky prvního; soubory načtěte znovu při každém spuštění.
  • Jiné revize se stále objevují. Vložený nebo smazaný text v položce seznamu je hlášen bez ohledu na to, zda je volba zapnutá nebo vypnutá, takže zkontrolujte revision_type, pokud potřebujete oddělit změny číslování od změn textu.

Další kroky

Článek Compare Documents v dokumentaci Aspose.Words for Python pokrývá další nastavení porovnání, včetně granularity, cíle porovnání a možností ignorování.

FAQs

  1. Proč Aspose.Words nedetekuje změny číslování při porovnávání souborů Word? Ve výchozím nastavení Aspose.Words postupuje stejně jako Microsoft Word a ponechává definice seznamů, jako je styl číslování nebo znak odrážky, mimo porovnání. Seznam, který se změní z čísel na odrážky, nevytváří žádné revize, pokud nepovolíte compare_list_definitions.

  2. Jak zjistím změny číslování v Pythonu? Vytvořte CompareOptions, nastavte options.advanced_options.compare_list_definitions na True a předávejte možnosti do Document.compare. Každý odstavec seznamu, jehož číslování nebo odrážka se změnila, získá revizi FORMAT_CHANGE.

  3. Jaký typ revize vytvoří změna číslování? Každý ovlivněný odstavec seznamu získá revizi typu RevisionType.FORMAT_CHANGE. Přijetím se použije formátování seznamu upraveného souboru a odmítnutím se zachová původní.

  4. Funguje tato možnost společně s ignore_formatting? Ne. Když je CompareOptions.ignore_formatting nastaven na True, změny číslování nejsou hlášeny, i když je compare_list_definitions nastaven na True.

  5. Co vrací Document.compare? Nic. Zapíše rozdíly jako revize do dokumentu, na kterém je volána, takže je čtete z kolekce revisions tohoto dokumentu.

  6. Která verze Aspose.Words for Python přidala tuto možnost? Vlastnost compare_list_definitions třídy AdvancedCompareOptions byla přidána v Aspose.Words for Python via .NET 26.9.

Získejte bezplatnou licenci a podporu