Сравнение документов
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 и приводят к безопасному отказу
Режимы сравнения
cmPageCountсравнивает количество страницcmPageTextвыравнивает и сравнивает извлечённый текст страницcmObjectCountсохраняет прежнее значение селектора и теперь выполняет структурное сравнение объектов и страницcmRenderedImageвыполняет перцептивное сравнение отрендеренного с опциями по умолчанию или заданными вызывающимcmFullобъединяет сравнение количества страниц, структурное и отрендеренноеcmStructuralсравнивает страницы и граф объектов без рендеринга
Формат результата
Отчёт включает счётчики источника, телеметрию обхода, нормализованные структурные и рендер-лимиты, differenceCount, reportedDifferenceCount, differencesTruncated, comparisonComplete, identical и массив differences
Рендер-режимы также возвращают массив renderedPages со статусом страниц, размерами, метриками, изменёнными областями и опциональными путями оверлеев, плюс агрегированные счётчики страниц и пикселей
Каждое различие может содержать стабильные значения pathA и pathB, индексы страниц, номера объектов, тип и строку деталей
Связанные API
THPDFDocComparison · CompareWithOptions · THPDFRenderedCompareOptions · THPDFComparisonMode · HPDFDocCompareDocuments