Сравнение PDF документов

Обратите внимание, что все инструменты сравнения доступны в библиотеке Aspose.PDF.Drawing.

Способы сравнения PDF документов

При работе с PDF документами бывают случаи, когда вам нужно сравнить содержимое двух документов, чтобы выявить различия. Библиотека Aspose.PDF for .NET предоставляет мощный набор инструментов для этой цели. В этой статье мы рассмотрим, как сравнивать PDF документы с помощью нескольких простых фрагментов кода.

Функциональность сравнения в Aspose.PDF позволяет вам сравнивать два PDF документа постранично. Вы можете выбрать, чтобы сравнить либо конкретные страницы, либо целые документы. Результирующий документ сравнения выделяет различия, что упрощает выявление изменений между двумя файлами.

Вот список возможных способов сравнения PDF документов с использованием библиотеки Aspose.PDF for .NET:

  1. Сравнение конкретных страниц - Сравните первые страницы двух PDF документов.

  2. Сравнение целых документов - Сравните все содержимое двух PDF документов.

  3. Сравнить PDF документы графически:

  • Сравнить PDF с методом GetDifference - отдельные изображения, где изменения отмечены.

  • Сравнить PDF с методом CompareDocumentsToPdf - PDF документ с изображениями, где изменения отмечены.

Сравнение конкретных страниц

Первый фрагмент кода демонстрирует, как сравнить первые страницы двух PDF документов.

  1. Инициализация документа. Код начинается с инициализации двух PDF документов с использованием их соответствующих путей к файлам (documentPath1 и documentPath2). Пути в данный момент указаны как пустые строки, но на практике вы замените их на фактические пути к файлам.

  2. Процесс сравнения.

  • Выбор страниц - сравнение ограничивается первой страницей каждого документа (‘Pages[1]’).
  • Опции сравнения:

‘AdditionalChangeMarks = true’ - эта опция гарантирует, что дополнительные маркеры изменений отображаются. Эти маркеры выделяют различия, которые могут присутствовать на других страницах, даже если они не находятся на текущей странице, которая сравнивается.

‘ComparisonMode = ComparisonMode.IgnoreSpaces’ - этот режим говорит сравнивателю игнорировать пробелы в тексте, сосредоточившись только на изменениях внутри слов.

  1. Результирующий документ сравнения, который выделяет различия между двумя страницами, сохраняется по пути файла, указанному в ‘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
            });
        }
    }
}

Сравнение целых документов

Второй фрагмент кода расширяет область для сравнения всего содержимого двух 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
                });
        }
    }
}

Результаты сравнения, сгенерированные этими фрагментами кода, являются PDF документами, которые вы можете открыть в просмотрщике, таком как Adobe Acrobat. Если вы используете двухстраничный вид в Adobe Acrobat, вы увидите изменения рядом:

  • Удаления - они отмечены на левой странице.
  • Вставки - они отмечены на правой странице.

Установив ‘AdditionalChangeMarks’ в ’true’, вы также можете увидеть маркеры для изменений, которые могут происходить на других страницах, даже если эти изменения не находятся на текущей странице.

Aspose.PDF for .NET предоставляет надежные инструменты для сравнения PDF документов, независимо от того, нужно ли вам сравнить конкретные страницы или целые документы. Используя такие опции, как ‘AdditionalChangeMarks’ и различные настройки ‘ComparisonMode’, вы можете адаптировать процесс сравнения под ваши конкретные нужды. Результирующий документ предоставляет четкий, бок о бок вид изменений, что упрощает отслеживание изменений и обеспечивает точность документа.

Сравниватель PDF документов бок о бок возвращает результаты сравнения в виде объектов следующих классов

Класс Назначение Ключевые свойства Как использовать
SideBySideDocsComparisonResult Представляет результат бок о бок сравнения двух PDF документов. * HasChanges – указывает, были ли обнаружены изменения.
* FirstDocChanges – список изменений, сгруппированных по страницам первой версии документа.
* SecondDocChanges – список изменений, сгруппированных по страницам второй версии документа.
* FullChanges – полная последовательность изменений, где каждый элемент соответствует паре сравниваемых страниц и содержит все операции сравнения для этой пары страниц.
Возвращается методом SideBySidePdfComparer.Compare(Document, Document, string, SideBySideComparisonOptions). После получения экземпляра вы можете определить, существуют ли какие-либо изменения (HasChanges) и перебрать коллекции, чтобы получить подробную информацию о том, какие страницы и фрагменты изменились.
SideBySidePagesComparisonResult Представляет результат бок о бок сравнения двух отдельных PDF страниц. * HasChanges – указывает, существуют ли какие-либо различия между страницами.
* FirstPageChanges – список изменений, обнаруженных на первой странице.
* SecondPageChanges – список изменений, обнаруженных на второй странице.
* FullChanges – полная последовательность операций сравнения между двумя страницами.
Возвращается методом SideBySidePdfComparer.Compare(Page, Page, string, SideBySideComparisonOptions). После получения экземпляра вы можете определить, существуют ли какие-либо изменения (HasChanges) и перебрать коллекции, чтобы получить полный список различий.

Подробные свойства

Свойство Тип Описание
HasChanges bool Указывает, существует ли хотя бы одно различие.
FirstDocChanges / FirstPageChanges List<List<EditContainer>> / List<EditContainer> Содержит изменения, обнаруженные в первом (документе/странице). Для документов это список списков, где каждый вложенный список соответствует одной странице.
SecondDocChanges / SecondPageChanges List<List<EditContainer>> / List<EditContainer> Содержит изменения, обнаруженные во втором (документе/странице). Для документов это список списков, где каждый вложенный список соответствует одной странице.
FullChanges List<List<DiffOperation>> (документы)
List<DiffOperation> (страницы)
Консолидированный набор всех операций сравнения. Для документов это двумерный список, где каждый внешний элемент соответствует паре сравниваемых страниц. Для страниц это плоский список операций.
DiffOperation (внешний тип) Описывает конкретное изменение (вставка, удаление, равенство).

Пример использования

  // 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 - это вспомогательный объект, который описывает отдельное изменение, обнаруженное во время сравнения PDF страниц (или документов). Он служит “контейнером”, который хранит идентификатор изменения, тип различия, дополнительные маркерные флаги и геометрические координаты (прямоугольники), указывающие точное местоположение изменения на странице.

Свойство Тип Описание
Id int Уникальный идентификатор изменения. Он позволяет отличить одно изменение от другого в результате сравнения. Используется в аннотациях изменений на страницах.
Operation DiffOperation Тип операции различия, описывающий природу изменения (вставка, удаление, замена и т.д.).
Rects List<Rectangle> Коллекция прямоугольных областей, покрывающих измененный фрагмент на странице.

Сравнение PDF документов с использованием GraphicalPdfComparer

При совместной работе над документами, особенно в профессиональной среде, вы часто получаете несколько версий одного и того же файла.

Вы можете использовать класс GraphicalPdfComparer для сравнения PDF документов и страниц. Класс подходит для сравнения изменений в графическом содержимом страницы.

С Aspose.PDF for .NET можно сравнивать документы и страницы и выводить результат сравнения в PDF документ или файл изображения.

Вы можете установить следующие свойства класса:

  • Разрешение - разрешение в единицах DPI для выходных изображений, а также для изображений, создаваемых во время сравнения.
  • Цвет - цвет маркеров изменений.
  • Порог - порог изменения в процентах. Значение по умолчанию - ноль. Установка значения, отличного от нуля, позволяет игнорировать графические изменения, которые для вас незначительны.

Класс имеет метод, который позволяет получить различия изображений страниц в форме, подходящей для дальнейшей обработки: ImagesDifference GetDifference(Page page1, Page page2).

Этот метод возвращает объект класса ImagesDifference, который содержит изображение первой сравниваемой страницы и массив различий. Массив различий и оригинальное изображение имеют формат пикселей RGB24bpp.

ImagesDifference позволяет вам сгенерировать другое изображение и получить изображение второй сравниваемой страницы, добавив массив различий к оригинальному изображению. Для этого используйте методы ImagesDifference.GetDestinationImage и ImagesDifference.DifferenceToImage.

Сравнение PDF с методом GetDifference

Предоставленный код определяет метод GetDifference, который сравнивает два PDF документа и генерирует визуальные представления различий между ними.

Этот метод сравнивает первые страницы двух PDF файлов и генерирует два PNG изображения:

  • Одно изображение (diffPngFilePath) выделяет различия между страницами красным цветом.
  • Другое изображение (destPngFilePath) является визуальным представлением целевой (второй) PDF страницы.

Этот процесс может быть полезен для визуального сравнения изменений или различий между двумя версиями документа.

// 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");
                }
            }
        }
    }
}

Сравнение PDF с методом CompareDocumentsToPdf

Предоставленный фрагмент кода использует метод CompareDocumentsToPdf, который сравнивает два документа и генерирует PDF отчет о результатах сравнения.

// 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");
        }
    }
}

Универсальный метод для сравнения документов

Вы можете использовать класс TextPdfComparer для сравнения документов и отдельных страниц. Класс позволяет сравнивать документы постранично или как один непрерывный поток содержимого (без разделения на страницы). Методы сравнения возвращают массив различий, который можно передать любому классу, реализующему интерфейсы IStringOutputGenerator или IFileOutputGenerator, чтобы получить форматированный вывод сравнения. Поддерживается вывод в: HTML, Markdown, PDF и JSON. Вы также можете использовать класс ComparisonStatistics, чтобы получить статистику по выполненным операциям сравнения.

Метод Описание Параметры Возвращаемое значение
CompareDocumentsPageByPage(Document document1, Document document2, ComparisonOptions options) Сравнивает два PDF документа постранично. * document1 – первый документ.
* document2 – второй документ.
* options – параметры сравнения (см. ниже).
List<List<DiffOperation>> – список различий для каждой страницы.
CompareDocumentsPageByPage(Document document1, Document document2, ComparisonOptions options, string resultPdfDocumentPath) То же самое, но также сохраняет результаты сравнения в PDF файл. Те же параметры, что и выше + resultPdfDocumentPath – путь к выходному файлу. List<List<DiffOperation>> – список различий.
CompareFlatDocuments(Document document1, Document document2, ComparisonOptions options) Сравнивает два PDF документа как один непрерывный текст (объединяя все страницы). Те же параметры, что и в CompareDocumentsPageByPage. List<DiffOperation> – список всех различий.
CompareFlatDocuments(Document document1, Document document2, ComparisonOptions options, string resultPdfDocumentPath) Сравнение плоских документов с результатом, сохраненным в PDF файл. Те же параметры, что и в CompareFlatDocuments + resultPdfDocumentPath. List<DiffOperation> – список различий.
ComparePages(Page page1, Page page2, ComparisonOptions options) Сравнивает две отдельные страницы. * page1 – первая страница.
* page2 – вторая страница.
* options – параметры сравнения.
List<DiffOperation> – список различий страниц.
CreateComparisonStatistics(List<DiffOperation> diffs) Генерирует статистику сравнения для списка операций (одна страница). diffs – список DiffOperation. TextItemComparisonStatistics (см. ниже).
CreateComparisonStatistics(List<List<DiffOperation>> diffs) Генерирует статистику сравнения для списка операций по страницам (уровень документа). diffs – список списков DiffOperation. DocumentComparisonStatistics (см. ниже).
AssemblySourcePageText(List<DiffOperation> diffs) Восстанавливает оригинальный (до изменения) текст страницы. diffs – список операций. string – оригинальный текст.
AssemblyDestinationPageText(List<DiffOperation> diffs) Восстанавливает измененный (после изменения) текст страницы. diffs – список операций. string – измененный текст.

Связанные публичные классы

ComparisonOptions

Параметры, влияющие на процесс сравнения:

Свойство Тип Описание
ExtractionArea Rectangle Область, из которой будет извлечен текст. Не совместимо с ExcludeTables, ExcludeAreas1/2.
ExcludeTables bool Исключить таблицы из сравнения. Не совместимо с ExtractionArea.
ExcludeAreas1 Rectangle[] Массив областей, которые следует исключить для первого документа.
ExcludeAreas2 Rectangle[] Массив областей, которые следует исключить для второго документа.
EditOperationsOrder EditOperationsOrder (enum) Порядок применения операций вставки/удаления (по умолчанию DeleteFirst).

DiffOperation

Представляет одну операцию различия. Содержит:

Свойство Тип Описание
Operation Operation (enum) Тип операции (Equal, Delete, Insert).
Text string Текст, связанный с операцией.

ComparisonStatistics

Класс Описание
TextItemComparisonStatistics Статистика для отдельного текста (страницы). Включает общее количество символов, количество вставок, удалений и соответствующих операций.
DocumentComparisonStatistics (наследует от TextItemComparisonStatistics) Расширенная статистика для всего документа, включая список PagesStatistics (статистика по страницам).

Пример использования