Введение

PDF — де‑факто стандарт для контрактов, спецификаций, отчётов и регуляторных подач, и при наличии множества версий в обращении быстро становится утомительно отследить, что именно изменилось между двумя файлами. Прокрутка документов рядом и ручная аннотация различий не масштабируется, а даже специализированные инструменты, такие как функция Compare в Adobe Acrobat, требуют ручного вмешательства для каждой пары файлов.

GroupDocs.Comparison for .NET позволяет выполнять сравнение PDF полностью из кода и точно задавать, как будет представлен результат. Версия 26.4 представила отдельный класс PdfCompareOptions с тремя режимами отображения результата:

  1. Inline (по умолчанию) — единственный объединённый PDF, где удаления и вставки выделены разными цветами на тех же страницах. Это классическое поведение и самый простой способ поделиться результатом как отдельным файлом.
  2. Side‑by‑Side — каждая страница результата показывает исходную и целевую страницы, размещённые рядом, без наложения содержимого. Идеально, когда документы сильно различаются и смешивание контента на одной странице будет путать.
  3. Interleaved — результат содержит чередующиеся страницы: нечётные — исходные (удаления выделены), чётные — целевые (вставки выделены). Изменения представлены как нативные аннотации PDF — встроенный тип объектов PDF, который несёт метаданные, такие как тип изменения и имя автора. Большинство PDF‑просмотрщиков (Adobe Acrobat Reader, Foxit и др.) позволяют открыть панель аннотаций и принять или удалить отдельные аннотации, что делает процесс лёгким без дополнительного ПО. Открытие такого файла в режиме «Two Page View» PDF‑просмотрщика даёт естественное сравнение слева‑справа.

В этой статье мы пройдёмся по всем трём режимам с работающими примерами на C#, изучим PdfCompareOptions и его свойства, а также кратко рассмотрим, как ту же задачу можно выполнить вручную в Adobe Acrobat.


Сравнение PDF в Adobe Acrobat

Прежде чем переходить к программному подходу, стоит знать, что предлагает Adobe Acrobat Pro «из коробки». Встроенный инструмент Compare Files (доступен через Tools → Compare Files) создаёт отчёт рядом, где подсвечиваются изменения текста, различия изображений и смещения форматирования.

Чтобы выполнить сравнение в Acrobat Pro:

  1. Откройте Acrobat Pro и выберите Tools → Compare Files.
  2. Выберите Older File (исходный) и Newer File (целевой).
  3. Нажмите Compare. Acrobat генерирует интерактивный отчёт сравнения с обзорной страницей и встроенными маркерами изменений.

Это удобно для редких ручных проверок. Однако у инструмента сравнения Acrobat есть существенные ограничения, когда сравнение должно быть частью автоматизированного конвейера.

Когда сравнение должно происходить на сервере, в CI/CD‑конвейере или в рамках пользовательского рабочего процесса, библиотека, ориентированная на код, — это правильный выбор.


Требования

Перед началом:

  • .NET 6.0 или новее.
  • GroupDocs.Comparison for .NET 26.4 или новее — установите через NuGet:
dotnet add package GroupDocs.Comparison
  • Файл лицензии (GroupDocs.Comparison.lic). Без него библиотека работает в режиме оценки с водяными знаками и ограничением количества страниц. Вы можете запросить временную лицензию для тестирования.
  • Два PDF‑файла для сравнения — мы будем называть их source.pdf и target.pdf. Пример содержимого:
source.pdf target.pdf

Режим 1: Inline‑сравнение (по умолчанию)

Когда использовать: нужен один самодостаточный PDF‑файл, который любой может открыть и сразу увидеть, что изменилось, без специального просмотрщика или двухстраничного макета. Типичный сценарий — отправка контракта с пометками контрагенту.

using GroupDocs.Comparison;
using GroupDocs.Comparison.Options;

using (var comparer = new Comparer("source.pdf"))
{
    comparer.Add("target.pdf");

    var options = new PdfCompareOptions
    {
        DisplayMode = PdfCompareOptions.ComparisonDisplayMode.Inline
    };

    comparer.Compare("result_inline.pdf", options);
}

Примечание: Inline — значение DisplayMode по умолчанию, поэтому блок options выше необязателен. Вызов comparer.Compare("result_inline.pdf") даст тот же результат.

Полученный документ в режиме Inline:

PDF comparison result in Inline mode

Что происходит «под капотом»:

  • Удалённый контент из исходного документа выделяется одним цветом (по умолчанию — красный).
  • Вставленный контент из целевого документа выделяется другим цветом (по умолчанию — зелёный).
  • Оба набора изменений находятся на одних и тех же страницах, поэтому результат компактен, но может выглядеть загроможденно при сильных различиях. При значительных правках текста удалённый и вставленный контент могут физически накладываться — например, заменённый абзац отображается поверх оригинального, образуя нечитаемый беспорядок. В таких случаях лучше выбрать режим SideBySide или Interleaved.

Режим 2: Сравнение Side‑by‑Side

Когда использовать: документы сильно различаются, и размещение удалений и вставок на одной странице делает результат трудно читаемым. Side‑by‑Side сохраняет исходный и целевой контент строго раздельно, облегчая быстрый просмотр каждой страницы.

using GroupDocs.Comparison;
using GroupDocs.Comparison.Options;

using (var comparer = new Comparer("source.pdf"))
{
    comparer.Add("target.pdf");

    var options = new PdfCompareOptions
    {
        DisplayMode = PdfCompareOptions.ComparisonDisplayMode.SideBySide
    };

    comparer.Compare("result_side_by_side.pdf", options);
}

Полученный документ в режиме Side‑by‑Side:

PDF comparison result in Side-by-Side mode

Что происходит «под капотом»:

  • Каждая страница результата — по сути широкое полотно, разделённое пополам.
  • Левая половина показывает соответствующую страницу исходного документа с выделенными удалениями.
  • Правая половина показывает страницу целевого документа с выделенными вставками.
  • Контент из двух документов никогда не перекрывается, поэтому даже сильно отредактированные страницы остаются читаемыми.

Режим 3: Interleaved‑сравнение

Когда использовать: нужно просматривать изменения постранично в обычном PDF‑просмотрщике, используя режим Two Page View (или «Facing Pages»). Каждая исходная страница находится слева, её соответствующая целевая страница — справа; физический макет страниц повторяет то, что Side‑by‑Side отображает на едином полотне, но каждая страница сохраняет свой полный размер.

using GroupDocs.Comparison;
using GroupDocs.Comparison.Options;

using (var comparer = new Comparer("source.pdf"))
{
    comparer.Add("target.pdf");

    var options = new PdfCompareOptions
    {
        DisplayMode = PdfCompareOptions.ComparisonDisplayMode.Interleaved,
        AnnotationAuthorName = "GroupDocs"
    };

    comparer.Compare("result_interleaved.pdf", options);
}

Полученный документ в режиме Interleaved (показан в Two Page View):

PDF comparison result in Interleaved mode viewed in Two Page View

Что происходит «под капотом»:

  • В результирующем документе 2 × N страниц для пары из N страниц исходного и целевого файлов.
  • Нечётные страницы (1, 3, 5 …) — страницы исходного документа с выделенными удалениями.
  • Чётные страницы (2, 4, 6 …) — страницы целевого документа с выделенными вставками.
  • AnnotationAuthorName ставит имя автора на PDF‑аннотации, создаваемые во время сравнения — полезно, когда результат попадает в рабочий процесс обзора, где необходимо различать комментарии разных авторов.

Совет: откройте результат в Adobe Acrobat Reader или любом просмотрщике, поддерживающем View → Page Display → Two Page View, чтобы автоматически получить нужный левый/правый макет.


Ограничение сравнения диапазоном страниц

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

using GroupDocs.Comparison;
using GroupDocs.Comparison.Options;

using (var comparer = new Comparer("source.pdf"))
{
    comparer.Add("target.pdf");

    var options = new PdfCompareOptions
    {
        DisplayMode = PdfCompareOptions.ComparisonDisplayMode.SideBySide,
        PagesSetup = new PagesSetup
        {
            StartPage = 3,
            EndPage = 10
        }
    };

    comparer.Compare("result_pages_3_to_10.pdf", options);
}

Если PagesSetup = null (или не задано), сравниваются все страницы — поведение, как в предыдущих версиях.


Обзор PdfCompareOptions

PdfCompareOptions — подкласс CompareOptions, специфичный для PDF, аналогичный WordCompareOptions, появившемуся в версии 26.2. Он собирает все настройки, относящиеся только к PDF, в одном месте, чтобы случайно не применить параметры, предназначенные для Word или электронных таблиц.

Свойство Тип Описание
DisplayMode ComparisonDisplayMode Управляет макетом результата: Inline (по умолчанию), SideBySide или Interleaved.
PagesSetup PagesSetup Диапазон страниц для сравнения. При null обрабатываются все страницы.
CompareImagesPdf bool Включать ли встроенные изображения в сравнение.
AnnotationAuthorName string Имя автора, ставимое на PDF‑аннотации (используется в режиме Interleaved).
ImagesInheritanceMode enum Определяет, какой документ предоставляет изображения, когда сравнение изображений отключено.

Полностью сконфигурированный пример:

var options = new PdfCompareOptions
{
    DisplayMode = PdfCompareOptions.ComparisonDisplayMode.Interleaved,
    CompareImagesPdf = true,
    AnnotationAuthorName = "Review Bot",
    PagesSetup = new PagesSetup { StartPage = 1, EndPage = 5 }
};

Унаследованные свойства базового CompareOptions — InsertedItemStyle, DeletedItemStyle, ChangedItemStyle — тоже доступны, позволяя переопределять цвета подсветки по необходимости.


Получение изменений программно

Независимо от выбранного режима отображения, вы можете получить структурированный список всех обнаруженных различий через Comparer.GetChanges(). Это удобно для построения пользовательских отчётов, интеграции результатов в систему обзора или сбора статистики о масштабе правок.

using (var comparer = new Comparer("source.pdf"))
{
    comparer.Add("target.pdf");

    comparer.Compare("result.pdf");

    var changes = comparer.GetChanges(); // возвращает ChangeInfo[]
    Console.WriteLine($"Total changes detected: {changes.Length}");
}

Подробности в официальной справке API: Comparer.GetChanges.


Работа с PDF, защищёнными паролем

PDF‑файлы, защищённые паролем, полностью поддерживаются. Передайте пароль через LoadOptions при создании Comparer:

using GroupDocs.Comparison;
using GroupDocs.Comparison.Options;

using (var comparer = new Comparer("source_protected.pdf",
    new LoadOptions { Password = "secret" }))
{
    comparer.Add("target_protected.pdf", new LoadOptions { Password = "secret" });

    var options = new PdfCompareOptions
    {
        DisplayMode = PdfCompareOptions.ComparisonDisplayMode.SideBySide
    };

    comparer.Compare("result_protected.pdf", options);
}

Получить бесплатную пробную версию

Вы можете скачать GroupDocs.Comparison for .NET со страницы официальных релизов. Для неограниченного тестирования запросите временную лицензию — кредитная карта не требуется.


Часто задаваемые вопросы

В: Нужно ли устанавливать Adobe Acrobat или другое PDF‑ПО на сервер?
О: Нет. GroupDocs.Comparison — самодостаточная .NET‑библиотека, которая читает и пишет PDF без сторонних зависимостей.

В: Какой режим отображения использовать по умолчанию?
О: Начните с Inline — он даёт самый компактный результат и проще всего им делиться. Перейдите на SideBySide, если обильные правки делают inline‑вид нечитаемым, или используйте Interleaved, когда обозреватели откроют результат в режиме «Two Page View».

В: Можно ли сравнивать документы в форматах, отличных от PDF?
О: Да — библиотека поддерживает Word‑документы, Excel‑таблицы, PowerPoint‑презентации, обычный текст и многие другие форматы. Полный список в документации.

В: Что происходит, если я не укажу лицензию?
О: Библиотека работает в режиме оценки. Выходные документы будут содержать водяной знак, а обработка будет ограничена несколькими первыми страницами. Временная лицензия снимает эти ограничения для тестов.

В: Можно ли сравнивать только изображения внутри PDF, игнорируя изменения текста?
О: Установите CompareImagesPdf = true в PdfCompareOptions, чтобы включить сравнение изображений. Чтобы сосредоточиться исключительно на изображениях, комбинируйте это с параметром ImagesInheritanceMode; детали см. в справке API.


Заключение

GroupDocs.Comparison for .NET 26.4 предоставляет точный, управляемый кодом контроль над тем, как отображаются результаты сравнения PDF. Inline — наиболее распространённый вариант — один совместный PDF с пометками. SideBySide сохраняет сильно изменённый контент чистым и читаемым. Interleaved естественно сочетается с режимом Two Page View любого PDF‑просмотрщика, позволяя просматривать страницы в полном размере. Кроме того, фильтрация по диапазону страниц позволяет сосредоточиться только на нужных разделах, а PdfCompareOptions собирает все PDF‑специфичные настройки в одном удобном классе.

Выберите режим, соответствующий вашему рабочему процессу, или сгенерируйте все три и дайте каждой аудитории выбрать предпочтительный вид.

Дополнительные ресурсы