Comparar documentos PDF

Tenga en cuenta que todas las herramientas de comparación están disponibles en la biblioteca Aspose.PDF.Drawing.

Formas de comparar documentos PDF

Al trabajar con documentos PDF, hay momentos en los que necesitas comparar el contenido de dos documentos para identificar diferencias. La biblioteca Aspose.PDF for .NET proporciona un conjunto de herramientas poderoso para este propósito. En este artículo, exploraremos cómo comparar documentos PDF utilizando un par de fragmentos de código simples.

La funcionalidad de comparación en Aspose.PDF te permite comparar dos documentos PDF página por página. Puedes elegir comparar ya sea páginas específicas o documentos completos. El documento de comparación resultante resalta las diferencias, facilitando la identificación de cambios entre los dos archivos.

Aquí hay una lista de posibles formas de comparar documentos PDF utilizando la biblioteca Aspose.PDF for .NET:

  1. Comparar Páginas Específicas - Comparar las primeras páginas de dos documentos PDF.

  2. Comparar Documentos Completos - Comparar todo el contenido de dos documentos PDF.

  3. Comparar documentos PDF gráficamente:

  • Comparar PDF con el método GetDifference - imágenes individuales donde se marcan los cambios.

  • Comparar PDF con el método CompareDocumentsToPdf - documento PDF con imágenes donde se marcan los cambios.

Comparando Páginas Específicas

El primer fragmento de código demuestra cómo comparar las primeras páginas de dos documentos PDF.

  1. Inicialización del Documento. El código comienza inicializando dos documentos PDF utilizando sus respectivas rutas de archivo (documentPath1 y documentPath2). Las rutas se especifican como cadenas vacías por ahora, pero en la práctica, reemplazarías estas con las rutas de archivo reales.

  2. Proceso de Comparación.

  • Selección de Página - la comparación se limita a la primera página de cada documento (‘Pages[1]’).
  • Opciones de Comparación:

‘AdditionalChangeMarks = true’ - esta opción asegura que se muestren marcadores de cambios adicionales. Estos marcadores resaltan diferencias que podrían estar presentes en otras páginas, incluso si no están en la página actual que se está comparando.

‘ComparisonMode = ComparisonMode.IgnoreSpaces’ - este modo le dice al comparador que ignore los espacios en el texto, enfocándose solo en los cambios dentro de las palabras.

  1. El documento de comparación resultante, que resalta las diferencias entre las dos páginas, se guarda en la ruta de archivo especificada en ‘resultPdfPath’.
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ComparingSpecificPages()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();

    // Open PDF documents
    using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparingSpecificPages1.pdf"))
    {
        using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparingSpecificPages2.pdf"))
        {
            // Compare
            Aspose.Pdf.Comparison.SideBySidePdfComparer.Compare(document1.Pages[1], document2.Pages[1], dataDir + "ComparingSpecificPages_out.pdf", new Aspose.Pdf.Comparison.SideBySideComparisonOptions
            {
                AdditionalChangeMarks = true,
                ComparisonMode = Aspose.Pdf.Comparison.ComparisonMode.IgnoreSpaces,
                DeleteColor = Color.DarkGray,
                InsertColor = Color.LightYellow
            });
        }
    }
}

Comparando Documentos Completos

El segundo fragmento de código amplía el alcance para comparar todo el contenido de dos documentos PDF.

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ComparingEntireDocuments()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();

    // Open PDF documents
    using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparingEntireDocuments1.pdf"))
    {
        using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparingEntireDocuments2.pdf"))
        {
            // Compare
            Aspose.Pdf.Comparison.SideBySidePdfComparer.Compare(
                document1,
                document2,
                dataDir + "ComparingEntireDocuments_out.pdf",
                new Aspose.Pdf.Comparison.SideBySideComparisonOptions
                {
                    AdditionalChangeMarks = true,
                    ComparisonMode = Aspose.Pdf.Comparison.ComparisonMode.IgnoreSpaces,
                    DeleteColor = Color.DarkGray,
                    InsertColor = Color.LightYellow
                });
        }
    }
}

Los resultados de comparación generados por estos fragmentos son documentos PDF que puedes abrir en un visor como Adobe Acrobat. Si usas la vista de dos páginas en Adobe Acrobat, verás los cambios lado a lado:

  • Eliminaciones - estas se anotan en la página izquierda.
  • Inserciones - estas se anotan en la página derecha.

Al establecer ‘AdditionalChangeMarks’ en ’true’, también puedes ver marcadores para cambios que pueden ocurrir en otras páginas, incluso si esos cambios no están en la página actual que se está visualizando.

Aspose.PDF for .NET proporciona herramientas robustas para comparar documentos PDF, ya sea que necesites comparar páginas específicas o documentos completos. Al usar opciones como ‘AdditionalChangeMarks’ y diferentes configuraciones de ‘ComparisonMode’, puedes adaptar el proceso de comparación a tus necesidades específicas. El documento resultante proporciona una vista clara, lado a lado de los cambios, facilitando el seguimiento de revisiones y asegurando la precisión del documento.

El comparador de documentos PDF lado a lado devuelve resultados de comparación como objetos de las siguientes clases

Clase Propósito Propiedades Clave Cómo Usar
SideBySideDocsComparisonResult Representa el resultado de una comparación lado a lado de dos documentos PDF. * HasChanges – indica si se detectaron cambios.
* FirstDocChanges – una lista de cambios agrupados por páginas de la primera versión del documento.
* SecondDocChanges – una lista de cambios agrupados por páginas de la segunda versión del documento.
* FullChanges – la secuencia completa de cambios, donde cada elemento corresponde a un par de páginas comparadas y contiene todas las operaciones de comparación para ese par de páginas.
Devuelto por el método SideBySidePdfComparer.Compare(Document, Document, string, SideBySideComparisonOptions). Después de obtener la instancia, puedes determinar si existen cambios (HasChanges) e iterar a través de las colecciones para recuperar información detallada sobre qué páginas y fragmentos han cambiado.
SideBySidePagesComparisonResult Representa el resultado de una comparación lado a lado de dos páginas PDF individuales. * HasChanges – indica si existen diferencias entre las páginas.
* FirstPageChanges – una lista de cambios detectados en la primera página.
* SecondPageChanges – una lista de cambios detectados en la segunda página.
* FullChanges – la secuencia completa de operaciones de comparación entre las dos páginas.
Devuelto por el método SideBySidePdfComparer.Compare(Page, Page, string, SideBySideComparisonOptions). Después de obtener la instancia, puedes determinar si existen cambios (HasChanges) e iterar a través de las colecciones para recuperar la lista completa de diferencias.

Propiedades Detalladas

Propiedad Tipo Descripción
HasChanges bool Indica si existe al menos una diferencia.
FirstDocChanges / FirstPageChanges List<List<EditContainer>> / List<EditContainer> Contiene cambios detectados en el primero (documento/página). Para documentos, esta es una lista de listas, donde cada lista anidada corresponde a una sola página.
SecondDocChanges / SecondPageChanges List<List<EditContainer>> / List<EditContainer> Contiene cambios detectados en el segundo (documento/página). Para documentos, esta es una lista de listas, donde cada lista anidada corresponde a una sola página.
FullChanges List<List<DiffOperation>> (documentos)
List<DiffOperation> (páginas)
Un conjunto consolidado de todas las operaciones de comparación. Para documentos, esta es una lista bidimensional donde cada elemento externo corresponde a un par de páginas comparadas. Para páginas, es una lista plana de operaciones.
DiffOperation (tipo externo) Describe un cambio específico (inserción, eliminación, igualdad).

Ejemplo de Uso

  // For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
  private static void ComparingEntireDocuments()
  {
      // The path to the documents directory
      var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();

      // --- Comparing pages ----------------------------

      // Open PDF documents
      using (Document doc1 = new Document(dataDir + "ComparingEntireDocuments1.pdf"),
             doc2 = new Document(dataDir + "ComparingEntireDocuments2.pdf"))
      {
          // Compare
          SideBySidePagesComparisonResult pageResult = SideBySidePdfComparer.Compare(
              doc1.Pages[1],
              doc2.Pages[1],
              dataDir + "ComparingEntireDocuments_out.pdf",
              new SideBySideComparisonOptions
              {
                  AdditionalChangeMarks = false,
                  ComparisonMode = ComparisonMode.Normal
              });

          Console.WriteLine("=== Page Comparison ===");

          Console.WriteLine(pageResult.HasChanges ? "Changes were detected" : "No changes detected");

          Console.WriteLine($"First page changes count : {pageResult.FirstPageChanges.Count}");
          Console.WriteLine($"Second page changes count: {pageResult.SecondPageChanges.Count}");
          Console.WriteLine($"Total changes count      : {pageResult.FullChanges.Count}");
      }

      // --- Comparing documents ----------------------------

      // Open PDF documents
      using (Document doc1 = new Document(dataDir + "ComparingEntireDocuments1.pdf"),
             doc2 = new Document(dataDir + "ComparingEntireDocuments2.pdf"))
      {
          // Compare
          SideBySideDocsComparisonResult docResult = SideBySidePdfComparer.Compare(
              doc1,
              doc2,
              dataDir + "ComparingEntireDocuments_out.pdf",
              new SideBySideComparisonOptions
              {
                  AdditionalChangeMarks = false,
                  ComparisonMode = ComparisonMode.Normal
              });

          Console.WriteLine("\n=== Document Comparison ===");

          Console.WriteLine(docResult.HasChanges ? "Changes were detected" : "No changes detected");

          Console.WriteLine($"First document changes count : {Count(docResult.FirstDocChanges)} ");
          Console.WriteLine($"Second document changes count: {Count(docResult.SecondDocChanges)}");
          Console.WriteLine($"Total changes count          : {Count(docResult.FullChanges)}");
      }
  }

 private static int Count<T>(List<List<T>> list)
  {
      int count = 0;
      foreach (var innerList in list)
      {
          count += innerList.Count;
      }
      return count;
  }

EditContainer es un objeto auxiliar que describe un cambio individual detectado durante la comparación de páginas (o documentos) PDF. Sirve como un “contenedor” que almacena el identificador del cambio, el tipo de diferencia, marcadores adicionales y coordenadas geométricas (rectángulos) que indican la ubicación exacta del cambio en la página.

Propiedad Tipo Descripción
Id int Un identificador único del cambio. Permite distinguir un cambio de otro en el resultado de la comparación. Se utiliza en anotaciones de cambios en las páginas.
Operation DiffOperation El tipo de operación de diferencia que describe la naturaleza del cambio (inserción, eliminación, reemplazo, etc.).
Rects List<Rectangle> Una colección de regiones rectangulares que cubren el fragmento modificado en la página.

Comparar documentos PDF usando GraphicalPdfComparer

Al colaborar en documentos, especialmente en entornos profesionales, a menudo terminas con múltiples versiones del mismo archivo.

Puedes usar la clase GraphicalPdfComparer para comparar documentos y páginas PDF. La clase es adecuada para comparar cambios en el contenido gráfico de una página.

Con Aspose.PDF for .NET, es posible comparar documentos y páginas y exportar el resultado de la comparación a un documento PDF o archivo de imagen.

Puedes establecer las siguientes propiedades de la clase:

  • Resolución - resolución en unidades DPI para imágenes de salida, así como para imágenes generadas durante la comparación.
  • Color - el color de las marcas de cambio.
  • Umbral - umbral de cambio en porcentaje. El valor predeterminado es cero. Establecer un valor diferente de cero permite ignorar cambios gráficos que son insignificantes para ti.

La clase tiene un método que te permite obtener diferencias de imagen de página en una forma adecuada para un procesamiento posterior: ImagesDifference GetDifference(Page page1, Page page2).

Este método devuelve un objeto de la clase ImagesDifference, que contiene una imagen de la primera página que se compara y un array de diferencias. El array de diferencias y la imagen original tienen el formato de píxel RGB24bpp.

ImagesDifference te permite generar una imagen diferente y obtener una imagen de la segunda página que se compara al agregar un array de diferencias a la imagen original. Para hacer esto, utiliza los métodos ImagesDifference.GetDestinationImage y ImagesDifference.DifferenceToImage.

Comparar PDF con el método GetDifference

El código proporcionado define un método GetDifference que compara dos documentos PDF y genera representaciones visuales de las diferencias entre ellos.

Este método compara las primeras páginas de dos archivos PDF y genera dos imágenes PNG:

  • Una imagen (diffPngFilePath) resalta las diferencias entre las páginas en rojo.
  • La otra imagen (destPngFilePath) es una representación visual de la página PDF de destino (segunda).

Este proceso puede ser útil para comparar visualmente cambios o diferencias entre dos versiones de un documento.

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ComparePDFWithGetDifferenceMethod()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();

    // Open PDF documents
    using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparePDFWithGetDifferenceMethod1.pdf"))
    {
        using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparePDFWithGetDifferenceMethod2.pdf"))
        {
            // Create comparer 
            var comparer = new Aspose.Pdf.Comparison.GraphicalPdfComparer();
            // Compare
            using (var imagesDifference = comparer.GetDifference(document1.Pages[1], document2.Pages[1]))
            {
                using (var diffImg = imagesDifference.DifferenceToImage(Aspose.Pdf.Color.Red, Aspose.Pdf.Color.White))
                {
                    diffImg.Save(dataDir + "ComparePDFWithGetDifferenceMethodDiffPngFilePath_out.png");
                }
                using (var destImg = imagesDifference.GetDestinationImage())
                {
                    destImg.Save(dataDir + "ComparePDFWithGetDifferenceMethodDestPngFilePath_out.png");
                }
            }
        }
    }
}

Comparar PDF con el método CompareDocumentsToPdf

El fragmento de código proporcionado utiliza el método CompareDocumentsToPdf que compara dos documentos y genera un informe PDF de los resultados de la comparación.

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ComparePDFWithCompareDocumentsToPdfMethod()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();

    // Open PDF documents
    using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparePDFWithCompareDocumentsToPdfMethod1.pdf"))
    {
        using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparePDFWithCompareDocumentsToPdfMethod2.pdf"))
        {
            // Create comparer
            var comparer = new Aspose.Pdf.Comparison.GraphicalPdfComparer()
            {
                Threshold = 3.0,
                Color = Aspose.Pdf.Color.Blue,
                Resolution = new Aspose.Pdf.Devices.Resolution(300)
            };
            // Compare
            comparer.CompareDocumentsToPdf(document1, document2, dataDir + "compareDocumentsToPdf_out.pdf");
        }
    }
}

Método Universal para Comparación de Documentos

Puedes usar la clase TextPdfComparer para comparar documentos y páginas individuales. La clase permite comparar documentos página por página o como un único flujo de contenido continuo (sin separación de páginas). Los métodos de comparación devuelven un array de diferencias que se pueden pasar a cualquier clase que implemente las interfaces IStringOutputGenerator o IFileOutputGenerator para producir una salida de comparación formateada. La salida es compatible en: HTML, Markdown, PDF y JSON. También puedes usar la clase ComparisonStatistics para obtener estadísticas sobre las operaciones de comparación realizadas.

Método Descripción Parámetros Valor de Retorno
CompareDocumentsPageByPage(Document document1, Document document2, ComparisonOptions options) Compara dos documentos PDF página por página. * document1 – el primer documento.
* document2 – el segundo documento.
* options – opciones de comparación (ver abajo).
List<List<DiffOperation>> – lista de diferencias para cada página.
CompareDocumentsPageByPage(Document document1, Document document2, ComparisonOptions options, string resultPdfDocumentPath) Igual que el anterior, pero también guarda los resultados de comparación en un archivo PDF. Mismos parámetros que arriba + resultPdfDocumentPath – ruta al archivo de salida. List<List<DiffOperation>> – lista de diferencias.
CompareFlatDocuments(Document document1, Document document2, ComparisonOptions options) Compara dos documentos PDF como un único texto continuo (fusionando todas las páginas). Mismos parámetros que en CompareDocumentsPageByPage. List<DiffOperation> – lista de todas las diferencias.
CompareFlatDocuments(Document document1, Document document2, ComparisonOptions options, string resultPdfDocumentPath) Comparación de documentos planos con resultado guardado en un archivo PDF. Mismos parámetros que en CompareFlatDocuments + resultPdfDocumentPath. List<DiffOperation> – lista de diferencias.
ComparePages(Page page1, Page page2, ComparisonOptions options) Compara dos páginas individuales. * page1 – la primera página.
* page2 – la segunda página.
* options – opciones de comparación.
List<DiffOperation> – lista de diferencias de página.
CreateComparisonStatistics(List<DiffOperation> diffs) Genera estadísticas de comparación para una lista de operaciones (página única). diffs – lista de DiffOperation. TextItemComparisonStatistics (ver abajo).
CreateComparisonStatistics(List<List<DiffOperation>> diffs) Genera estadísticas de comparación para una lista de operaciones a través de páginas (nivel de documento). diffs – lista de listas de DiffOperation. DocumentComparisonStatistics (ver abajo).
AssemblySourcePageText(List<DiffOperation> diffs) Reconstruye el texto original (pre-cambio) de la página. diffs – lista de operaciones. string – texto original.
AssemblyDestinationPageText(List<DiffOperation> diffs) Reconstruye el texto modificado (post-cambio) de la página. diffs – lista de operaciones. string – texto modificado.

Clases Públicas Relacionadas

ComparisonOptions

Parámetros que afectan el proceso de comparación:

Propiedad Tipo Descripción
ExtractionArea Rectangle El área de la cual se extraerá el texto. No compatible con ExcludeTables, ExcludeAreas1/2.
ExcludeTables bool Excluir tablas de la comparación. No compatible con ExtractionArea.
ExcludeAreas1 Rectangle[] Array de áreas a excluir para el primer documento.
ExcludeAreas2 Rectangle[] Array de áreas a excluir para el segundo documento.
EditOperationsOrder EditOperationsOrder (enum) Orden de aplicación de operaciones de inserción/eliminación (el valor predeterminado es DeleteFirst).

DiffOperation

Representa una única operación de diferencia. Contiene:

Propiedad Tipo Descripción
Operation Operation (enum) Tipo de operación (Equal, Delete, Insert).
Text string Texto asociado con la operación.

ComparisonStatistics

Clase Descripción
TextItemComparisonStatistics Estadísticas para un texto individual (página). Incluye caracteres totales, número de inserciones, eliminaciones y operaciones correspondientes.
DocumentComparisonStatistics (hereda de TextItemComparisonStatistics) Estadísticas extendidas para todo el documento, incluyendo una lista de PagesStatistics (estadísticas por página).

Ejemplo de Uso