Вступ

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). Без нього бібліотека працює в режимі оцінки з водяними знаками та обмеженням кількості сторінок. Ви можете запросити temporary license для тестування.
  • Два 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 }
};

Успадковані властивості базового CompareOptionsInsertedItemStyle, 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 зі сторінки офіційних релізів. Для необмеженого тестування запросіть temporary license — кредитна картка не потрібна.


Часті запитання

Q: Чи потрібен мені Adobe Acrobat або інше ПЗ для роботи з PDF на сервері?
A: Ні. GroupDocs.Comparison — це автономна .NET‑бібліотека, яка читає і записує PDF‑файли без будь‑яких сторонніх залежностей.

Q: Який режим відображення слід використовувати за замовчуванням?
A: Починайте з Inline — він створює найкомпактніший результат і найпростіший у поширенні. Перейдіть на SideBySide, коли великі правки ускладнюють читання inline‑виду, або використовуйте Interleaved, коли рецензенти відкриватимуть результат у режимі «Two Page View» PDF‑переглядача.

Q: Чи можу я порівнювати документи в інших форматах, крім PDF?
A: Так — бібліотека підтримує Word‑документи, Excel‑таблиці, PowerPoint‑презентації, прості текстові файли та багато іншого. Повний список у documentation.

Q: Що станеться, якщо я не встановлю ліцензію?
A: Бібліотека працюватиме в режимі оцінки. Вихідні документи міститимуть водяний знак і обробка буде обмежена лише кількома першими сторінками. temporary license знімає ці обмеження для тестування.

Q: Чи можу я порівнювати лише зображення всередині PDF і ігнорувати текстові зміни?
A: Використайте CompareImagesPdf = true у PdfCompareOptions, щоб включити порівняння зображень. Щоб зосередитися виключно на зображеннях, можна комбінувати це з властивістю ImagesInheritanceMode; деталі у довідці API.


Висновок

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

Обирайте режим, який відповідає вашому робочому процесу, або генеруйте всі три і дайте аудиторії вибрати улюблений вигляд.

Додаткові ресурси