Kiedy porównujesz dwa pliki Word i jedyną różnicą jest sposób numeracji listy, na przykład klauzule, które były 1. i 2., a teraz są a. i b., lub lista numerowana zamieniła się w listę punktowaną, Aspose.Words domyślnie nie zgłasza żadnych różnic. Ten samouczek pokazuje, jak wykrywać zmiany numeracji podczas porównywania plików Word w Pythonie. Wyjaśnia także, jak przeglądać, akceptować lub odrzucać wykryte zmiany.

Najważniejsze wnioski

  • Domyślnie zmiana stylu numeracji listy lub znaku wypunktowania nie generuje żadnych zmian przy porównywaniu plików Word.
  • Ustawienie options.advanced_options.compare_list_definitions = True zgłasza każdy zmieniony akapit listy jako zmianę FORMAT_CHANGE.
  • Zmiany tekstu wewnątrz elementów listy są zgłaszane w każdym przypadku. Opcja dodaje jedynie zmiany numeracji i wypunktowania.
  • ignore_formatting=True ukrywa zmiany numeracji, nawet gdy opcja jest włączona.

Dlaczego zmiany numeracji nie są wyświetlane domyślnie

Numeracja i wypunktowanie w Word pochodzą z definicji listy. Opisuje ona, jak wygląda każdy poziom listy: styl numeracji (1., a., i.), znak wypunktowania oraz powiązane formatowanie. Gdy porównujesz dokumenty, Aspose.Words domyślnie podąża za Microsoft Word i pomija definicje list w porównaniu. Dlatego jeśli zmieniła się tylko numeracja, porównanie nie wykrywa żadnych różnic.

Opcja compare_list_definitions nie ma odpowiednika w Wordzie. Informuje Aspose.Words, aby uwzględnić definicje list w porównaniu. Oto, co zobaczyliśmy, porównując listy dwuelementowe w wersji 26.9:

Lista oryginalnaLista edytowanaOpcja wyłączonaOpcja włączona
Numerowane 1. 2.Wypunktowana0 poprawek2 FORMAT_CHANGE
Numerowane 1. 2.Z literami a. b.0 poprawek2 FORMAT_CHANGE
Numerowane, “Pozycja 2”Wypunktowana, “Pozycja dwa”2 (DELETION, INSERTION)4 (dodaje 2 FORMAT_CHANGE)
NumerowaneIdentyczna lista numerowana0 poprawek0 poprawek

Ostatni wiersz ma znaczenie w praktyce. Włączenie tej opcji nie tworzy dodatkowych wersji dla list, które są takie same w obu plikach.

Wymagania wstępne

Potrzebujesz Aspose.Words for Python via .NET 26.9 lub nowszej wersji. Zainstaluj lub zaktualizuj ją z PyPI.

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

Bez licencji Aspose.Words działa w trybie ewaluacyjnym z ograniczeniami. Tymczasowa licencja usuwa je podczas testów.

Zobacz różnicę: zmiany numeracji z i bez opcji

Poniższy skrypt tworzy dwa dokumenty zawierające te same dwa elementy. Pierwszy używa listy numerowanej, a drugi listy wypunktowanej. Porównuje je dwukrotnie, raz z wyłączoną opcją i raz z włączoną, abyś mógł dokładnie zobaczyć, co zmienia opcja.

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

Uruchomienie skryptu wypisuje:

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

Jak działa kod

  • build_list_document używa DocumentBuilder.list_format, aby rozpocząć domyślną listę numerowaną lub wypunktowaną, zapisuje dwa elementy, a następnie wywołuje remove_numbers(), więc późniejsze akapity nie są częścią listy.
  • CompareOptions.advanced_options udostępnia compare_list_definitions, które domyślnie ma wartość False.
  • original.compare(...) porównuje original z edited i zapisuje różnice jako rewizje w original. Metoda zwraca None, więc zawsze odczytuj wyniki z dokumentu, na którym została wywołana.
  • parent_node każdej rewizji to akapit listy, którego formatowanie się zmieniło. revision_type to RevisionType.FORMAT_CHANGE dla zmian numeracji i wypunktowania.

Wykrywanie zmian numeracji między dwoma plikami Word

W rzeczywistym przepływie pracy porównujesz dwa istniejące pliki, na przykład dwie wersje umowy. Takie porównania zazwyczaj zawierają także inne zmiany, więc poniższy skrypt zachowuje tylko zmiany formatowania, które dotyczą akapitów listy.

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

W naszym teście wersja 2 umowy zmieniła numerowaną listę na wypunktowaną i dodatkowo pogrubiła niepowiązane zdanie. Wynik był:

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

Filtr wybiera dwa elementy listy i pomija zmianę pogrubienia, ponieważ ta rewizja znajduje się w tekście, a nie w akapicie listy. Pamiętaj, że dopasowuje on każdą zmianę formatowania na poziomie akapitu w elemencie listy, taką jak zmieniony wcięcie, a nie tylko numerację. Sprawdź zapisany dokument, jeśli musisz je odróżnić.

Przeglądaj, akceptuj lub odrzucaj zmiany numeracji

Ponieważ zmiany numeracji są zwykłymi poprawkami formatowania, obsługujesz je tak samo jak każdą inną poprawkę.

  • revisions.accept_all() stosuje sformatowaną listę po edycji. W pierwszym przykładzie oba elementy stają się punktami.
  • revisions.reject_all() zachowuje oryginalne formatowanie, więc elementy pozostają ponumerowane 1. i 2..
  • Zapis dokumentu zapisuje zmiany jako śledzone poprawki, dzięki czemu recenzenci mogą otworzyć plik w Microsoft Word i sami zdecydować o każdej zmianie.

Możesz również wywołać accept() lub reject() na pojedynczych obiektach Revision, na przykład tylko na elementach listy list_changes z poprzedniej sekcji.

Kiedy wykrywać zmiany numeracji

Włącz tę opcję, gdy numeracja listy ma znaczenie dla recenzentów. Dokumenty prawne i polityczne są typowym przypadkiem: zmiana numeracji klauzul z 1. na (a) zmienia sposób, w jaki inne dokumenty się do nich odwołują, więc recenzent musi to zobaczyć. Jest to również przydatne, gdy migrujesz dokumenty między systemami i chcesz potwierdzić, że numeracja listy przetrwała przeniesienie niezmieniona.

Wyłącz go, gdy zależy Ci tylko na treści. Przeglądy treści, kontrole tłumaczeń i różnice na poziomie tekstu są łatwiejsze do odczytania bez mieszania poprawek formatowania.

Things to Watch For

  • ignore_formatting nadpisuje opcję. Jeśli ustawisz options.ignore_formatting = True, zmiany numeracji nie są zgłaszane, nawet przy compare_list_definitions = True.
  • Pliki nie mogą zawierać wersji przed ich porównaniem. Jeśli którykolwiek dokument już ma śledzone zmiany, compare podnosi RuntimeError z informacją, że porównywane dokumenty nie mogą mieć wersji. Najpierw zaakceptuj lub odrzuć istniejące wersje. Oznacza to również, że nie możesz wykonać drugiego porównania na dokumencie, który już zawiera wyniki pierwszego; załaduj pliki ponownie za każdym razem.
  • Inne wersje nadal się pojawiają. Wstawiony lub usunięty tekst w elemencie listy jest zgłaszany niezależnie od tego, czy opcja jest włączona, czy wyłączona, więc sprawdź revision_type, jeśli musisz oddzielić zmiany numeracji od zmian w treści.

Kolejne kroki

Artykuł Porównaj dokumenty w dokumentacji Aspose.Words for Python opisuje pozostałe ustawienia porównywania, w tym szczegółowość, cel porównania oraz opcje ignorowania.

FAQs

  1. Dlaczego Aspose.Words nie wykrywa zmian numeracji podczas porównywania plików Word? Domyślnie Aspose.Words zachowuje się jak Microsoft Word i pomija definicje list, takie jak styl numeracji czy znak wypunktowania, w porównaniu. Lista, która zmienia się z numerów na wypunktowanie, nie generuje żadnych zmian, chyba że włączysz compare_list_definitions.

  2. Jak wykryć zmiany numeracji w Pythonie? Utwórz CompareOptions, ustaw options.advanced_options.compare_list_definitions na True i przekaż opcje do Document.compare. Każdy akapit listy, którego numeracja lub wypunktowanie uległo zmianie, otrzymuje rewizję FORMAT_CHANGE.

  3. Jaki rodzaj rewizji tworzy zmiana numeracji? Każdy dotknięty akapit listy otrzymuje rewizję typu RevisionType.FORMAT_CHANGE. Akceptacja stosuje formatowanie listy w edytowanym pliku, a odrzucenie zachowuje oryginał.

  4. Czy opcja działa razem z ignore_formatting? Nie. Gdy CompareOptions.ignore_formatting jest True, zmiany numeracji nie są zgłaszane, nawet jeśli compare_list_definitions jest True.

  5. Co zwraca Document.compare? Nic. Zapisuje różnice jako rewizje w dokumencie, na którym jest wywoływany, więc odczytujesz je z kolekcji revisions tego dokumentu.

  6. Która wersja Aspose.Words for Python dodała tę opcję? Właściwość compare_list_definitions klasy AdvancedCompareOptions została dodana w Aspose.Words for Python via .NET 26.9.

Uzyskaj darmową licencję i wsparcie