Quando você compara dois arquivos Word e a única diferença está em como uma lista é numerada, por exemplo cláusulas que eram 1. e 2. agora são a. e b., ou uma lista numerada se transformou em uma com marcadores, o Aspose.Words não relata diferenças por padrão. Este tutorial mostra como detectar alterações de numeração ao comparar arquivos Word em Python. Ele também explica como revisar, aceitar ou rejeitar as alterações encontradas.
Principais pontos
- Por padrão, uma alteração no estilo de numeração ou no caractere de marcador de uma lista não gera revisões ao comparar arquivos Word.
- Definir
options.advanced_options.compare_list_definitions = Truerelata cada parágrafo de lista afetado como uma revisãoFORMAT_CHANGE. - Alterações de texto dentro dos itens da lista são relatadas de qualquer forma. A opção apenas adiciona alterações de numeração e marcadores.
ignore_formatting=Trueoculta alterações de numeração mesmo quando a opção está ativada.
Por que as alterações de numeração não são exibidas por padrão
Numeração e marcadores no Word vêm de uma definição de lista. Ela descreve como cada nível da lista aparece: o estilo de número (1., a., i.), o caractere de marcador e a formatação relacionada. Quando você compara documentos, Aspose.Words segue o Microsoft Word por padrão e deixa as definições de lista fora da comparação. Portanto, se apenas a numeração foi alterada, a comparação não detecta nada a relatar.
A opção compare_list_definitions não tem equivalente no Word. Ela informa ao Aspose.Words para incluir definições de lista na comparação. Aqui está o que vimos ao comparar listas de dois itens na versão 26.9:
| Lista original | Lista editada | Opção desativada | Opção ativada |
|---|---|---|---|
Numerado 1. 2. | Com marcadores | 0 revisões | 2 FORMAT_CHANGE |
Numerado 1. 2. | Com letras a. b. | 0 revisões | 2 FORMAT_CHANGE |
| Numerado, “Item 2” | Com marcadores, “Item two” | 2 (DELETION, INSERTION) | 4 (adiciona 2 FORMAT_CHANGE) |
| Numerado | Lista numerada idêntica | 0 revisões | 0 revisões |
A última linha é importante na prática. Ativar a opção não cria revisões extras para listas que são iguais em ambos os arquivos.
Pré-requisitos
Você precisa de Aspose.Words for Python via .NET 26.9 ou posterior. Instale ou atualize‑o a partir de PyPI:
pip install --upgrade "aspose-words>=26.9"
Sem uma licença, o Aspose.Words funciona no modo de avaliação com limitações. Uma licença temporária remove essas limitações enquanto você testa.
Veja a Diferença: Alterações de Numeração Com e Sem a Opção
O script a seguir cria dois documentos que contêm os mesmos dois itens. O primeiro usa uma lista numerada e o segundo usa uma lista com marcadores. Ele os compara duas vezes, uma vez com a opção desativada e outra com a opção ativada, para que você possa ver exatamente o que a opção altera.
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")
Executando o script imprime:
compare_list_definitions=False: 0 revision(s)
compare_list_definitions=True: 2 revision(s)
FORMAT_CHANGE: Item 1
FORMAT_CHANGE: Item 2
Como o Código Funciona
build_list_documentusaDocumentBuilder.list_formatpara iniciar uma lista numerada ou com marcadores padrão, escreve dois itens e então chamaremove_numbers()para que quaisquer parágrafos posteriores não façam parte da lista.CompareOptions.advanced_optionsexpõecompare_list_definitions, que tem o padrãoFalse.original.compare(...)comparaoriginalcomeditede registra as diferenças como revisões dentro deoriginal. O método retornaNone, portanto sempre leia os resultados do documento no qual ele foi chamado.- O
parent_nodede cada revisão é o parágrafo da lista cuja formatação foi alterada.revision_typeéRevisionType.FORMAT_CHANGEpara alterações de numeração e marcadores.
Detect Numbering Changes Between Two Word Files
Em um fluxo de trabalho real, você compara dois arquivos existentes, como duas versões de um contrato. Essas comparações geralmente contêm outras revisões também, portanto o script abaixo mantém apenas as alterações de formatação que estão em parágrafos de lista.
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")
Em nosso teste, a versão 2 do contrato mudou uma lista numerada para marcadores e também deixou uma frase não relacionada em negrito. A saída foi:
Total revisions: 5
Formatting changes on list paragraphs: 2
Invoices are due in 30 days.
Late fees apply after 45 days.
O filtro seleciona os dois itens da lista e ignora a alteração em negrito, porque essa revisão está no texto em vez de em um parágrafo da lista. Lembre‑se de que ele corresponde a qualquer alteração de formatação em nível de parágrafo em um item da lista, como uma mudança de recuo, não apenas à numeração. Verifique o documento salvo se precisar distinguir esses casos.
Revisar, Aceitar ou Rejeitar Alterações de Numeração
Como as alterações de numeração são revisões de formato comuns, você as trata da mesma forma que qualquer outra revisão:
revisions.accept_all()aplica a formatação de lista editada. No primeiro exemplo, ambos os itens se tornam marcadores.revisions.reject_all()mantém a formatação original, de modo que os itens permanecem numerados1.e2..- Salvar o documento grava as revisões como alterações rastreadas, permitindo que os revisores abram o arquivo no Microsoft Word e decidam sobre cada alteração eles mesmos.
Você também pode chamar accept() ou reject() em objetos individuais Revision, por exemplo, apenas nos itens da lista list_changes da seção anterior.
Quando Detectar Alterações de Numeração
Ative a opção quando a numeração de uma lista tem significado para seus revisores. Documentos legais e de políticas são um caso comum: renumerar cláusulas de 1. para (a) altera a forma como outros documentos as referenciam, portanto um revisor precisa vê‑la. Também é útil quando você migra documentos entre sistemas e deseja confirmar que a numeração da lista sobreviveu à transferência sem alterações.
Desative-o quando você se preocupa apenas com a redação. Revisões de conteúdo, verificações de tradução e diffs em nível de texto são mais fáceis de ler sem revisões de formatação misturadas.
Coisas a observar
ignore_formattingsubstitui a opção. Se você definiroptions.ignore_formatting = True, as alterações de numeração não são relatadas, mesmo comcompare_list_definitions = True.- Os arquivos não devem conter revisões antes de compará-los. Se algum dos documentos já possuir alterações rastreadas,
comparegera umRuntimeErrorinformando que os documentos comparados não devem ter revisões. Aceite ou rejeite as revisões existentes primeiro. Isso também significa que você não pode executar uma segunda comparação em um documento que já contém os resultados da primeira; recarregue os arquivos a cada vez. - Outras revisões ainda aparecem. Texto inserido ou excluído em um item de lista é relatado independentemente de a opção estar ativada ou desativada, portanto verifique
revision_typese precisar separar alterações de numeração de alterações de texto.
Próximos passos
O artigo Comparar Documentos na documentação do Aspose.Words for Python cobre as outras configurações de comparação, incluindo granularidade, o alvo da comparação e as opções de ignorar.
Perguntas Frequentes
Por que o Aspose.Words não detecta alterações de numeração ao comparar arquivos Word? Por padrão, o Aspose.Words segue o Microsoft Word e deixa as definições de lista, como o estilo de numeração ou o caractere de marcador, fora da comparação. Uma lista que muda de números para marcadores não gera revisões, a menos que você habilite
compare_list_definitions.Como detectar alterações de numeração em Python? Crie
CompareOptions, definaoptions.advanced_options.compare_list_definitionscomoTruee passe as opções paraDocument.compare. Cada parágrafo de lista cuja numeração ou marcador foi alterado recebe uma revisãoFORMAT_CHANGE.Que tipo de revisão uma mudança de numeração cria? Cada parágrafo de lista afetado recebe uma revisão do tipo
RevisionType.FORMAT_CHANGE. Aceitá‑la aplica a formatação de lista do arquivo editado, e rejeitá‑la mantém o original.A opção funciona junto com ignore_formatting?
Não. QuandoCompareOptions.ignore_formattingéTrue, as alterações de numeração não são relatadas, mesmo secompare_list_definitionsforTrue.O que o Document.compare retorna? Nada. Ele grava as diferenças como revisões no documento em que você o chama, portanto você as lê da coleção
revisionsdesse documento.Qual versão do Aspose.Words for Python adicionou esta opção? A propriedade
compare_list_definitionsdeAdvancedCompareOptionsfoi adicionada no Aspose.Words for Python via .NET 26.9.
