Comparación de documentos
Comparación de documentos
Esta guía muestra cómo comparar dos ejecuciones de texto y producir la secuencia de ediciones entre ellas usando el motor de diferencias de texto FOSS Aspose.PDF para .NET. El punto de entrada para este modelo de comparación es DiffOperation, una sola edición etiquetada con un Operation (Equal, Delete, o Insert), junto con el DiffUtils clase auxiliar para localizar texto común y reensamblar una diferencia de vuelta a su texto de origen y destino. Un paso de optimización separado, descrito en Optimización de Diferencias, canoniza la salida de diferencias sin procesar producida de esta manera antes de que se renderice o aplique.
Modelo de Diff: Operación y DiffOperation
Operation es el enum que clasifica cada edición en un diff: Equal indica una secuencia de texto que no ha cambiado, Delete indica una secuencia eliminada del origen, y Insert indica una secuencia añadida en el destino. DiffOperation empareja un valor Operation con el Text al que se aplica, e implementa IEquatable<DiffOperation> para que dos ediciones puedan compararse por igualdad.
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 común con DiffUtils
DiffUtils es una clase auxiliar estática utilizada por el motor de diff para encontrar el prefijo y sufijo comunes compartidos por dos cadenas antes de que se diferee la sección media diferente. FindCommonStartParts localiza el prefijo común, y FindCommonEndParts localiza el sufijo común; una sobrecarga de FindCommonEndParts acepta un startIndex para que la búsqueda del sufijo pueda limitarse al texto que sigue a un prefijo ya 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 un diff
Una vez que un diff se expresa como una secuencia de valores DiffOperation, DiffUtils puede reconstruir cualquiera de los dos lados de la comparación: AssemblySourceText reconstruye el texto original a partir de los Equal y Delete runs, y AssemblyDestinationText reconstruye el texto revisado a partir de los Equal y Insert runs.
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"Comparar y reportar ediciones
DiffOperation sobrescribe Equals, GetHashCode y ToString, de modo que las ediciones pueden compararse por igualdad o escribirse en registros y salida de pruebas sin código de conversión adicional.
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());Consejos y mejores prácticas
DiffOperationes inmutable e implementaIEquatable<DiffOperation>— useEqualspara comparar dos ediciones en lugar de la igualdad de referencia.- Localice el prefijo común con
FindCommonStartPartsprimero, luego pase su longitud a la sobrecargastartIndexdeFindCommonEndPartspara evitar que un prefijo común corto se cuente dos veces como parte del sufijo. - Utilice
AssemblySourceTextyAssemblyDestinationTextpara verificar que una secuencia de valoresDiffOperationrecorra ida y vuelta al texto original y revisado exacto antes de confiar en ella en otro lugar. - Trate los
Operation.Equalruns como no-ops al renderizar un diff visual, y solo resalte losDeleteyInsertruns. - Este motor compara diferencias de texto, no documentos directamente — extrae el texto que deseas comparar (por ejemplo, de una página o documento) antes de generar una diferencia.
Problemas comunes
| Problema | Causa | Corrección |
|---|---|---|
La salida de AssemblySourceText / AssemblyDestinationText no coincide con los originales | La lista diffs está incompleta o sus entradas DiffOperation están fuera de orden | Incluya cada edición en la secuencia, en el orden original en que se produjeron las ediciones |
FindCommonEndParts devuelve un resultado inesperado en cadenas cortas y similares | La búsqueda de sufijo común se superpone con el texto ya coincidente por FindCommonStartParts | Pase la longitud devuelta por FindCommonStartParts como argumento startIndex |
Equals devuelve false para ediciones que se ven idénticas | Los valores de Text difieren por espacios en blanco o mayúsculas/minúsculas | Normaliza el texto (recorta / convierte a minúsculas) antes de construir los valores de DiffOperation que deseas comparar |
| La salida del diff parece ruidosa o innecesariamente fragmentada | Las secuencias crudas de DiffOperation aún no están canonizadas | Ejecuta la secuencia a través de la pasada de optimización descrita en Optimización de Diff |
FAQ
¿Qué compara el motor Diff?
Compara bloques de texto y produce una secuencia de valores DiffOperation que describen las ediciones — texto sin cambios, eliminado o insertado — necesarios para convertir una cadena en otra.
¿Qué tipos de edición admite Operation?
Tres: Equal para texto sin cambios, Delete para texto eliminado de la fuente y Insert para texto añadido en el destino.
¿Cómo verifico si dos ediciones son iguales?
Llame a Equals en una instancia de DiffOperation, o compare directamente sus propiedades Operation y Text.
¿Puedo recuperar el texto original y el revisado de un diff?
Sí — pase la lista de valores DiffOperation a DiffUtils.AssemblySourceText para el texto original y DiffUtils.AssemblyDestinationText para el texto revisado.
¿Esta página cubre la fusión o la limpieza de un diff?
No — canonizar un diff crudo (fusionar ejecuciones adyacentes, deslizar ediciones a través de igualdades) se cubre por separado en Optimización de diff.
API Reference Resumen
| Clase / Método | Descripción |
|---|---|
Operation | Enumeración que clasifica una edición como Equal, Delete o Insert |
DiffOperation | Una única edición: un Operation emparejado con el Text al que se aplica |
DiffOperation.Operation | El valor Operation de esta edición |
DiffOperation.Text | El bloque de texto al que se aplica esta edición |
DiffOperation.Equals | Compara dos ediciones para igualdad por Operation y Text |
DiffOperation.ToString | Renderiza una edición como cadena para registro o visualización |
DiffUtils | Clase estática de ayuda con utilidades de diff de texto |
DiffUtils.FindCommonStartParts | Encuentra el prefijo común compartido por dos cadenas |
DiffUtils.FindCommonEndParts | Encuentra el sufijo común compartido por dos cadenas, opcionalmente comenzando desde un índice |
DiffUtils.AssemblySourceText | Reensambla el texto original a partir de una lista de valores DiffOperation |
DiffUtils.AssemblyDestinationText | Reensambla el texto revisado a partir de una lista de valores DiffOperation |