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 = Truesegnala ogni paragrafo di elenco interessato come una revisioneFORMAT_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=Truenasconde 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 originale | Elenco modificato | Opzione disattivata | Opzione attivata |
|---|---|---|---|
Numerato 1. 2. | Puntato | 0 revisioni | 2 FORMAT_CHANGE |
Numerato 1. 2. | Con lettere a. b. | 0 revisioni | 2 FORMAT_CHANGE |
| Numerato, “Elemento 2” | Puntato, “Elemento due” | 2 (DELETION, INSERTION) | 4 (aggiunge 2 FORMAT_CHANGE) |
| Numerato | Elenco numerato identico | 0 revisioni | 0 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_documentutilizzaDocumentBuilder.list_formatper avviare un elenco numerato o puntato predefinito, scrive due elementi e poi chiamaremove_numbers()in modo che i paragrafi successivi non facciano parte dell’elenco.CompareOptions.advanced_optionsesponecompare_list_definitions, che per impostazione predefinita èFalse.original.compare(...)confrontaoriginalconeditede registra le differenze come revisioni all’interno dioriginal. Il metodo restituisceNone, quindi leggi sempre i risultati dal documento su cui è stato chiamato.- Il
parent_nodedi ogni revisione è il paragrafo dell’elenco la cui formattazione è cambiata.revision_typeèRevisionType.FORMAT_CHANGEper 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 numerati1.e2..- 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_formattingsovrascrive l’opzione. Se impostioptions.ignore_formatting = True, le modifiche di numerazione non vengono segnalate, anche concompare_list_definitions = True.- I file non devono contenere revisioni prima di confrontarli. Se uno dei documenti ha già modifiche tracciate,
comparegenera unRuntimeErrorche 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_typese 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
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.Come rilevo le modifiche di numerazione in Python? Crea
CompareOptions, impostaoptions.advanced_options.compare_list_definitionssuTruee passa le opzioni aDocument.compare. Ogni paragrafo di elenco la cui numerazione o punto elenco è cambiato riceve una revisioneFORMAT_CHANGE.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.L’opzione funziona insieme a ignore_formatting?
No. QuandoCompareOptions.ignore_formattingèTrue, le modifiche di numerazione non vengono segnalate, anche secompare_list_definitionsèTrue.Cosa restituisce Document.compare?
Nessuno. Scrive le differenze come revisioni nel documento su cui lo chiami, quindi le leggi dalla collezionerevisionsdi quel documento.Quale versione di Aspose.Words for Python ha aggiunto questa opzione? La proprietà
compare_list_definitionsdiAdvancedCompareOptionsè stata aggiunta in Aspose.Words for Python via .NET 26.9.
