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

THPDFDocComparison сравнивает два загруженных документа THotPDF и возвращает детерминированный JSON-отчёт

Структурное сравнение

cmStructural стартует от catalog каждого документа, идёт по косвенным ссылкам и строит пути из отсортированных ключей словарей и индексов массивов, например $Catalog/Pages/Kids[0]/Contents

Скалярные значения и декодированные байты stream хэшируются SHA-256, поэтому большие stream сравниваются инкрементально, без создания ещё одной полной копии

Объекты с одинаковым путём, но разными сигнатурами попадают в отчёт как objectChanged; одинаковые сигнатуры на разных путях — это objectMoved; оставшиеся без пары объекты — objectInserted или objectDeleted

Выравнивание страниц

Страницы с извлекаемым текстом выравниваются по семантической текстовой сигнатуре, а при пустом или недоступном тексте откатываются к структурной сигнатуре

Проход по наибольшей возрастающей подпоследовательности сохраняет порядок страниц при вставках и удалениях, а настоящее изменение порядка попадает в отчёт как pageMoved

Оставшиеся без пары страницы становятся pageChanged, pageInserted или pageDeleted; метаданные страниц подписываются независимо от /Parent, /Contents и /Resources, чтобы отсечь шум от кодирования font subset

Сравнение отрендеренного

cmRenderedImage и cmFull рендерят общие страницы с настроенным DPI и один раз сканируют каждый bitmap, вычисляя изменившиеся пиксели, их долю, среднюю абсолютную цветовую ошибку, максимальную цветовую дельту и глобальную похожую на SSIM оценку яркости

THPDFRenderedCompareOptions выбирает RGB- или яркостную разницу, допустимое отклонение цвета на пиксель, минимальную похожесть, максимальную долю изменившихся пикселей, размер tile, сохранение изменённых областей, пиксельные бюджеты и опциональные PNG-оверлеи

Страницы считаются похожими, только когда проходят оба порога — доля изменившихся пикселей и похожесть; метрики считаются с полной точностью и округляются до шести знаков после запятой лишь для детерминированного JSON-отчёта

Изменившиеся tile объединяются в детерминированные четырёхсвязные области и попадают в отчёт с границами в пиксельном пространстве, числом изменившихся пикселей и максимальными цветовыми дельтами

Если тепловые карты включены, изменившиеся пиксели смешиваются от жёлтого к красному поверх документа A и сохраняются файлами вида page-000001-diff.png в выбранной вызывающим директории

Ограничения и полнота

THPDFStructuralCompareLimits управляет лимитами на объекты, рёбра, страницы, глубину, различия, байты stream, байты значений и байты путей

Если обход упирается в лимит, отчёт включает comparisonBudget, выставляет comparisonComplete в false и не вправе объявить документы идентичными

Рендер-работа оценивается до выделения памяти и ограничивается на страницу и на сравнение; сбои рендеринга, выделения памяти или оверлеев добавляют renderBudget или renderError, выставляют renderComparisonComplete и comparisonComplete в false и приводят к безопасному отказу

Режимы сравнения

Формат результата

Отчёт включает счётчики источника, телеметрию обхода, нормализованные структурные и рендер-лимиты, differenceCount, reportedDifferenceCount, differencesTruncated, comparisonComplete, identical и массив differences

Рендер-режимы также возвращают массив renderedPages со статусом страниц, размерами, метриками, изменёнными областями и опциональными путями оверлеев, плюс агрегированные счётчики страниц и пикселей

Каждое различие может содержать стабильные значения pathA и pathB, индексы страниц, номера объектов, тип и строку деталей

Связанные API

THPDFDocComparison · CompareWithOptions · THPDFRenderedCompareOptions · THPDFComparisonMode · HPDFDocCompareDocuments