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 = Truezgł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=Trueukrywa 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 oryginalna | Lista edytowana | Opcja wyłączona | Opcja włączona |
|---|---|---|---|
Numerowane 1. 2. | Wypunktowana | 0 poprawek | 2 FORMAT_CHANGE |
Numerowane 1. 2. | Z literami a. b. | 0 poprawek | 2 FORMAT_CHANGE |
| Numerowane, “Pozycja 2” | Wypunktowana, “Pozycja dwa” | 2 (DELETION, INSERTION) | 4 (dodaje 2 FORMAT_CHANGE) |
| Numerowane | Identyczna lista numerowana | 0 poprawek | 0 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_documentużywaDocumentBuilder.list_format, aby rozpocząć domyślną listę numerowaną lub wypunktowaną, zapisuje dwa elementy, a następnie wywołujeremove_numbers(), więc późniejsze akapity nie są częścią listy.CompareOptions.advanced_optionsudostępniacompare_list_definitions, które domyślnie ma wartośćFalse.original.compare(...)porównujeoriginalzeditedi zapisuje różnice jako rewizje woriginal. Metoda zwracaNone, więc zawsze odczytuj wyniki z dokumentu, na którym została wywołana.parent_nodekażdej rewizji to akapit listy, którego formatowanie się zmieniło.revision_typetoRevisionType.FORMAT_CHANGEdla 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ą ponumerowane1.i2..- 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_formattingnadpisuje opcję. Jeśli ustawiszoptions.ignore_formatting = True, zmiany numeracji nie są zgłaszane, nawet przycompare_list_definitions = True.- Pliki nie mogą zawierać wersji przed ich porównaniem. Jeśli którykolwiek dokument już ma śledzone zmiany,
comparepodnosiRuntimeErrorz 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
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.Jak wykryć zmiany numeracji w Pythonie? Utwórz
CompareOptions, ustawoptions.advanced_options.compare_list_definitionsnaTruei przekaż opcje doDocument.compare. Każdy akapit listy, którego numeracja lub wypunktowanie uległo zmianie, otrzymuje rewizjęFORMAT_CHANGE.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ł.Czy opcja działa razem z ignore_formatting? Nie. Gdy
CompareOptions.ignore_formattingjestTrue, zmiany numeracji nie są zgłaszane, nawet jeślicompare_list_definitionsjestTrue.Co zwraca Document.compare? Nic. Zapisuje różnice jako rewizje w dokumencie, na którym jest wywoływany, więc odczytujesz je z kolekcji
revisionstego dokumentu.Która wersja Aspose.Words for Python dodała tę opcję? Właściwość
compare_list_definitionsklasyAdvancedCompareOptionszostała dodana w Aspose.Words for Python via .NET 26.9.
