Comparação de Documentos

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 implementa IEquatable<DiffOperation> — use Equals para comparar duas edições ao invés de igualdade de referência.
  • Localize o prefixo comum com FindCommonStartParts primeiro, então passe seu comprimento para a sobrecarga startIndex de FindCommonEndParts para evitar que um prefixo comum curto seja contado duas vezes como parte do sufixo.
  • Use AssemblySourceText e AssemblyDestinationText para verificar se uma sequência de valores DiffOperation faz o percurso de ida e volta ao texto original e revisado exato antes de utilizá-lo em outro lugar.
  • Trate as execuções Operation.Equal como no-ops ao renderizar um diff visual, e destaque apenas as execuções Delete e Insert.
  • 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

ProblemaCausaCorreção
AssemblySourceText / AssemblyDestinationText a saída não corresponde aos originaisA lista diffs está incompleta ou suas entradas DiffOperation estão fora de ordemInclua 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 semelhantesA pesquisa de sufixo comum sobrepõe texto já correspondido por FindCommonStartPartsPasse o comprimento retornado por FindCommonStartParts como o argumento startIndex
Equals retorna false para edições que parecem idênticasOs valores de Text diferem por espaços em branco ou maiúsculas/minúsculasNormalize o texto (trim / case-fold) antes de construir os valores de DiffOperation que pretende comparar
A saída do diff parece ruidosa ou desnecessariamente fragmentadaSequências brutas de DiffOperation ainda não foram canonizadasExecute 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étodoDescrição
OperationEnum que classifica uma edição como Equal, Delete ou Insert
DiffOperationUma única edição: um Operation emparelhado com o Text ao qual se aplica
DiffOperation.OperationO valor Operation para esta edição
DiffOperation.TextO trecho de texto ao qual esta edição se aplica
DiffOperation.EqualsCompara duas edições para igualdade por Operation e Text
DiffOperation.ToStringRenderiza uma edição como string para registro ou exibição
DiffUtilsClasse auxiliar estática com utilitários de diff de texto
DiffUtils.FindCommonStartPartsEncontra o prefixo comum compartilhado por duas strings
DiffUtils.FindCommonEndPartsEncontra o sufixo comum compartilhado por duas strings, opcionalmente começando a partir de um índice
DiffUtils.AssemblySourceTextReconstitui o texto original a partir de uma lista de valores DiffOperation
DiffUtils.AssemblyDestinationTextReconstitui o texto revisado a partir de uma lista de valores DiffOperation

Ver também

 Português