Comparação de Documentos
Comparação de Documentos
Este guia mostra como comparar duas execuções de texto e produzir a sequência de edições entre elas usando o Aspose.PDF FOSS text-diff engine para .NET. O ponto de entrada para este modelo de comparação é DiffOperation, uma única edição marcada com um Operation (Equal, Delete, ou Insert), juntamente com o DiffUtils classe auxiliar para localizar texto comum e remontar um diff de volta ao texto de origem e destino. Uma passagem de otimização separada, descrita em Otimização de Diff, canoniza a saída bruta de diff produzida dessa forma antes de ser renderizada ou aplicada.
O Modelo de Diff: Operação e DiffOperation
Operation é o enum que classifica cada edição em um diff: Equal marca uma sequência de texto que permanece inalterada, Delete marca uma sequência removida da fonte, e Insert marca uma sequência adicionada no destino. DiffOperation associa um valor Operation ao Text ao qual ele se aplica, e implementa IEquatable<DiffOperation> para que duas edições possam ser comparadas quanto à igualdade.
using Aspose.Pdf.Comparison.Diff;
// A single edit consists of an Operation and the run of text it applies to.
var unchanged = new DiffOperation(Operation.Equal, "Aspose.PDF ");
var removed = new DiffOperation(Operation.Delete, "for .NET Framework");
var added = new DiffOperation(Operation.Insert, "FOSS for .NET");
Console.WriteLine(unchanged.Operation); // Equal
Console.WriteLine(added.Text); // "FOSS for .NET"Localizando Texto Comum com DiffUtils
DiffUtils é uma classe auxiliar estática usada pelo motor de diff para encontrar o prefixo e sufixo comuns compartilhados por duas strings antes que a seção intermediária divergente seja difada. FindCommonStartParts localiza o prefixo comum, e FindCommonEndParts localiza o sufixo comum; uma sobrecarga de FindCommonEndParts aceita um startIndex para que a busca de sufixo possa ser limitada ao texto que segue um prefixo já localizado.
string original = "The quick brown fox";
string revised = "The quick red fox jumps";
var commonStart = DiffUtils.FindCommonStartParts(original, revised);
var commonEnd = DiffUtils.FindCommonEndParts(original, revised);Reensamblando Texto a partir de um Diff
Uma vez que um diff é expresso como uma sequência de valores DiffOperation, DiffUtils pode reconstruir qualquer lado da comparação: AssemblySourceText reconstrói o texto original a partir das execuções Equal e Delete, e AssemblyDestinationText reconstrói o texto revisado a partir das execuções Equal e Insert.
using System.Collections.Generic;
var diffs = new List<DiffOperation>
{
new DiffOperation(Operation.Equal, "The quick "),
new DiffOperation(Operation.Delete, "brown"),
new DiffOperation(Operation.Insert, "red"),
new DiffOperation(Operation.Equal, " fox")
};
string sourceText = DiffUtils.AssemblySourceText(diffs);
string destinationText = DiffUtils.AssemblyDestinationText(diffs);
Console.WriteLine(sourceText); // "The quick brown fox"
Console.WriteLine(destinationText); // "The quick red fox"Comparando e Reportando Edits
DiffOperation sobrescreve Equals, GetHashCode e ToString, permitindo que as edições sejam comparadas por igualdade ou gravadas em logs e saída de teste sem código de conversão extra.
var a = new DiffOperation(Operation.Equal, "PDF");
var b = new DiffOperation(Operation.Equal, "PDF");
bool same = a.Equals(b); // true - same Operation and Text
Console.WriteLine(a.ToString());Dicas e Melhores Práticas
DiffOperationé imutável e implementaIEquatable<DiffOperation>— useEqualspara comparar duas edições ao invés de igualdade de referência.- Localize o prefixo comum com
FindCommonStartPartsprimeiro, então passe seu comprimento para a sobrecargastartIndexdeFindCommonEndPartspara evitar que um prefixo comum curto seja contado duas vezes como parte do sufixo. - Use
AssemblySourceTexteAssemblyDestinationTextpara verificar se uma sequência de valoresDiffOperationfaz o percurso de ida e volta ao texto original e revisado exato antes de utilizá-lo em outro lugar. - Trate as execuções
Operation.Equalcomo no-ops ao renderizar um diff visual, e destaque apenas as execuçõesDeleteeInsert. - Este mecanismo compara diferenças de texto, não documentos diretamente — extraia o texto que você deseja comparar (por exemplo, de uma página ou documento) antes de criar um diff.
Problemas Comuns
| Problema | Causa | Correção |
|---|---|---|
AssemblySourceText / AssemblyDestinationText a saída não corresponde aos originais | A lista diffs está incompleta ou suas entradas DiffOperation estão fora de ordem | Inclua todas as edições na sequência, na ordem original em que as edições ocorreram |
FindCommonEndParts retorna um resultado inesperado em cadeias curtas e semelhantes | A pesquisa de sufixo comum sobrepõe texto já correspondido por FindCommonStartParts | Passe o comprimento retornado por FindCommonStartParts como o argumento startIndex |
Equals retorna false para edições que parecem idênticas | Os valores de Text diferem por espaços em branco ou maiúsculas/minúsculas | Normalize o texto (trim / case-fold) antes de construir os valores de DiffOperation que pretende comparar |
| A saída do diff parece ruidosa ou desnecessariamente fragmentada | Sequências brutas de DiffOperation ainda não foram canonizadas | Execute a sequência através da passagem de otimização descrita em Otimização de Diff |
FAQ
O que o mecanismo Diff compara?
Ele compara trechos de texto e produz uma sequência de valores DiffOperation que descrevem as edições — texto inalterado, excluído ou inserido — necessárias para transformar uma string em outra.
Quais tipos de edição Operation suporta?
Três: Equal para texto inalterado, Delete para texto removido da origem e Insert para texto adicionado no destino.
Como verifico se duas edições são iguais?
Chame Equals em uma instância DiffOperation, ou compare diretamente suas propriedades Operation e Text.
Posso recuperar o texto original e o revisado de um diff?
Sim — passe a lista de valores DiffOperation para DiffUtils.AssemblySourceText para o texto original e DiffUtils.AssemblyDestinationText para o texto revisado.
Esta página aborda a mesclagem ou a limpeza de um diff?
Não — a canonização de um diff bruto (mesclando execuções adjacentes, deslizando edições através de igualdades) é coberta separadamente em Otimização de Diff.
API Reference Resumo
| Classe / Método | Descrição |
|---|---|
Operation | Enum que classifica uma edição como Equal, Delete ou Insert |
DiffOperation | Uma única edição: um Operation emparelhado com o Text ao qual se aplica |
DiffOperation.Operation | O valor Operation para esta edição |
DiffOperation.Text | O trecho de texto ao qual esta edição se aplica |
DiffOperation.Equals | Compara duas edições para igualdade por Operation e Text |
DiffOperation.ToString | Renderiza uma edição como string para registro ou exibição |
DiffUtils | Classe auxiliar estática com utilitários de diff de texto |
DiffUtils.FindCommonStartParts | Encontra o prefixo comum compartilhado por duas strings |
DiffUtils.FindCommonEndParts | Encontra o sufixo comum compartilhado por duas strings, opcionalmente começando a partir de um índice |
DiffUtils.AssemblySourceText | Reconstitui o texto original a partir de uma lista de valores DiffOperation |
DiffUtils.AssemblyDestinationText | Reconstitui o texto revisado a partir de uma lista de valores DiffOperation |