Quando confronti due file Word e l’unica differenza è il modo in cui una lista è numerata, ad esempio le clausole che erano 1. e 2. ora sono a. e b., o una lista numerata è diventata puntata, Aspose.Words non segnala differenze per impostazione predefinita. Questo tutorial mostra come rilevare le modifiche di numerazione durante il confronto di file Word in Python. Spiega anche come revisionare, accettare o rifiutare le modifiche rilevate.

Punti chiave

  • Per impostazione predefinita, una modifica allo stile di numerazione o al carattere di elenco non produce revisioni quando confronti file Word.
  • Impostando options.advanced_options.compare_list_definitions = True segnala ogni paragrafo di elenco interessato come una revisione FORMAT_CHANGE.
  • Le modifiche di testo all’interno degli elementi dell’elenco vengono segnalate comunque. L’opzione aggiunge solo le modifiche di numerazione e di puntatore.
  • ignore_formatting=True nasconde le modifiche di numerazione anche quando l’opzione è attiva.

Perché le modifiche alla numerazione non vengono visualizzate per impostazione predefinita

La numerazione e i punti elenco in Word provengono da una definizione di elenco. Descrive come appare ogni livello dell’elenco: lo stile del numero (1., a., i.), il carattere del punto elenco e la formattazione correlata. Quando confronti i documenti, Aspose.Words segue Microsoft Word per impostazione predefinita e omette le definizioni di elenco dal confronto. Quindi, se è cambiata solo la numerazione, il confronto non rileva nulla da segnalare.

L’opzione compare_list_definitions non ha un equivalente in Word. Indica ad Aspose.Words di includere le definizioni di elenco nel confronto. Ecco ciò che abbiamo visto confrontando elenchi a due elementi nella versione 26.9:

Elenco originaleElenco modificatoOpzione disattivataOpzione attivata
Numerato 1. 2.Puntato0 revisioni2 FORMAT_CHANGE
Numerato 1. 2.Con lettere a. b.0 revisioni2 FORMAT_CHANGE
Numerato, “Elemento 2”Puntato, “Elemento due”2 (DELETION, INSERTION)4 (aggiunge 2 FORMAT_CHANGE)
NumeratoElenco numerato identico0 revisioni0 revisioni

L’ultima riga è importante nella pratica. Attivare l’opzione non crea revisioni aggiuntive per gli elenchi che sono identici in entrambi i file.

Prerequisiti

È necessario Aspose.Words for Python via .NET 26.9 o versioni successive. Installalo o aggiornalo da PyPI:

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

Senza una licenza, Aspose.Words funziona in modalità di valutazione con limitazioni. Una licenza temporanea le rimuove durante il test.

Vedi la differenza: le modifiche alla numerazione con e senza l’opzione

Lo script seguente crea due documenti che contengono gli stessi due elementi. Il primo utilizza un elenco numerato, e il secondo utilizza un elenco puntato. Lo confronta due volte, una volta con l’opzione disattivata e una volta con essa attivata, così puoi vedere esattamente cosa cambia l’opzione.

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

L’esecuzione dello script stampa:

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

Come funziona il codice

  • build_list_document utilizza DocumentBuilder.list_format per avviare un elenco numerato o puntato predefinito, scrive due elementi e poi chiama remove_numbers() in modo che i paragrafi successivi non facciano parte dell’elenco.
  • CompareOptions.advanced_options espone compare_list_definitions, che per impostazione predefinita è False.
  • original.compare(...) confronta original con edited e registra le differenze come revisioni all’interno di original. Il metodo restituisce None, quindi leggi sempre i risultati dal documento su cui è stato chiamato.
  • Il parent_node di ogni revisione è il paragrafo dell’elenco la cui formattazione è cambiata. revision_type è RevisionType.FORMAT_CHANGE per le modifiche di numerazione e di punti elenco.

Rilevare le modifiche di numerazione tra due file Word

In un flusso di lavoro reale, si confrontano due file esistenti, ad esempio due versioni di un contratto. Questi confronti di solito contengono anche altre revisioni, quindi lo script qui sotto mantiene solo le modifiche di formattazione che si trovano nei paragrafi di elenco.

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

Nel nostro test, la versione 2 del contratto ha trasformato un elenco numerato in puntini e ha anche reso grassetto una frase non correlata. L’output era:

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

Il filtro individua i due elementi dell’elenco e ignora la modifica in grassetto, perché quella revisione si applica al testo anziché a un paragrafo dell’elenco. Tieni presente che corrisponde a qualsiasi modifica di formattazione a livello di paragrafo su un elemento dell’elenco, come un rientro modificato, non solo alla numerazione. Controlla il documento salvato se devi distinguere tra di loro.

Revisiona, Accetta o Rifiuta le Modifiche di Numerazione

Poiché le modifiche di numerazione sono revisioni di formato ordinarie, le gestisci allo stesso modo di qualsiasi altra revisione.

  • revisions.accept_all() applica la formattazione della lista modificata. Nel primo esempio, entrambi gli elementi diventano punti elenco.
  • revisions.reject_all() mantiene la formattazione originale, quindi gli elementi rimangono numerati 1. e 2..
  • Salvare il documento scrive le revisioni come modifiche tracciate, così i revisori possono aprire il file in Microsoft Word e decidere su ogni modifica autonomamente.

Puoi anche chiamare accept() o reject() su singoli oggetti Revision, ad esempio solo sugli elementi della lista list_changes della sezione precedente.

Quando rilevare le modifiche di numerazione

Attiva l’opzione quando la numerazione di un elenco ha un significato per i tuoi revisori. I documenti legali e di policy sono un caso comune: rinumerare le clausole da 1. a (a) cambia il modo in cui altri documenti vi fanno riferimento, quindi un revisore deve vederlo. È anche utile quando migri documenti tra sistemi e vuoi confermare che la numerazione dell’elenco sia rimasta invariata durante lo spostamento.

Disattivalo quando ti interessa solo il testo. Le revisioni dei contenuti, i controlli di traduzione e le differenze a livello di testo sono più facili da leggere senza le revisioni di formattazione mescolate.

Cose da tenere d’occhio

  • ignore_formatting sovrascrive l’opzione. Se imposti options.ignore_formatting = True, le modifiche di numerazione non vengono segnalate, anche con compare_list_definitions = True.
  • I file non devono contenere revisioni prima di confrontarli. Se uno dei documenti ha già modifiche tracciate, compare genera un RuntimeError che indica che i documenti confrontati non devono contenere revisioni. Accetta o rifiuta prima le revisioni esistenti. Questo significa anche che non puoi eseguire un secondo confronto su un documento che contiene già i risultati del primo; ricarica i file ogni volta.
  • Altre revisioni compaiono comunque. Il testo inserito o eliminato in un elemento di elenco viene segnalato sia che l’opzione sia attiva sia che sia disattiva, quindi controlla revision_type se devi separare le modifiche di numerazione da quelle di testo.

Prossimi passi

L’articolo Compare Documents nella documentazione di Aspose.Words for Python copre le altre impostazioni di confronto, inclusa la granularità, il target di confronto e le opzioni di ignorare.

Domande frequenti

  1. Perché Aspose.Words non rileva le modifiche di numerazione durante il confronto dei file Word? Per impostazione predefinita, Aspose.Words segue Microsoft Word e lascia le definizioni delle liste, come lo stile di numerazione o il carattere del punto elenco, fuori dal confronto. Un elenco che passa da numeri a punti elenco non produce revisioni a meno che non si abiliti compare_list_definitions.

  2. Come rilevo le modifiche di numerazione in Python? Crea CompareOptions, imposta options.advanced_options.compare_list_definitions su True e passa le opzioni a Document.compare. Ogni paragrafo di elenco la cui numerazione o punto elenco è cambiato riceve una revisione FORMAT_CHANGE.

  3. Che tipo di revisione crea una modifica di numerazione? Ogni paragrafo di elenco interessato ottiene una revisione di tipo RevisionType.FORMAT_CHANGE. Accettandola si applica la formattazione dell’elenco del file modificato, e rifiutandola si mantiene l’originale.

  4. L’opzione funziona insieme a ignore_formatting?
    No. Quando CompareOptions.ignore_formatting è True, le modifiche di numerazione non vengono segnalate, anche se compare_list_definitions è True.

  5. Cosa restituisce Document.compare?
    Nessuno. Scrive le differenze come revisioni nel documento su cui lo chiami, quindi le leggi dalla collezione revisions di quel documento.

  6. Quale versione di Aspose.Words for Python ha aggiunto questa opzione? La proprietà compare_list_definitions di AdvancedCompareOptions è stata aggiunta in Aspose.Words for Python via .NET 26.9.

Ottieni una Licenza Gratuita e Supporto