Сравнение документов через JSON и C ABI
Сравнивайте два загруженных документа через THPDFJobProcessor.ExecuteLoadedOperationWithComparison, два хэндла C ABI через hpdf_document_compare_json_v1 или два файла через процессор JSON-заданий
Общие режимы
type=compare принимает значения mode pageCount, pageText, objectCount, renderedImage, full и structural; по умолчанию structural
Режимы сохраняют поведение нативного THPDFDocComparison, включая выравнивание страниц и структурные подписи объектов; objectCount дополнительно сравнивает структуру страниц и объектов
{
"schemaVersion": 1,
"type": "compare",
"mode": "full",
"render": {"dpi": 72, "colorSpace": "rgb", "colorTolerance": 8},
"options": {"maxDifferences": 1000, "maxStreamBytes": 1048576},
"budget": {"memoryBytes": 268435456, "resultBytes": 16777216,
"outputBytes": 67108864, "timeMilliseconds": 60000, "pixels": 10000000}
}
Конверт результата включает comparison, comparisonComplete, identical, documentUpdated=false, затраченное время и размер вывода; опциональный бинарный вывод содержит JSON сравнения без конверта
Лимиты обхода, потоков, значений, удержанных различий и рендеринга дают status=incomplete, comparisonComplete=false и identical=false, даже если проверенное подмножество равно
Ревью контрактов
type=compare.contract выравнивает абзацы, находит перемещения и сообщает вставки, удаления и замены слов или предложений с контекстом и расположением
{
"schemaVersion": 1,
"type": "compare.contract",
"format": "pdf",
"side": "after",
"options": {"granularity": "word", "ignoreRepeatedHeadersFooters": true,
"excludedLineTexts": ["CONFIDENTIAL COPY"], "maxWorkUnits": 50000000}
}
format принимает json, html или pdf; умолчание JSON, а HTML или PDF требует выходной поток или callback
Типы изменений — insert, delete, replace и move; индексы страниц и абзацев нумеруются с нуля, начальные позиции символов — позиции UTF-16 с единицы, а прямоугольники покрывают семантические строки в пользовательском пространстве PDF, а не точные четырёхугольники глифов
PDF выбирает side=before или side=after, сверяет выбранный документ с каждым семантическим снимком страниц, добавляет выделения и комментарии Before/After, сохраняет копию для ревью и всегда откатывает графовую транзакцию источника
PDF для ревью — полная перезапись и требует отдельной проверки подписей; сравнение оставляет заимствованные исходные документы и их подписи нетронутыми
Опции и границы
Общие options принимают maxObjects, maxEdges, maxPages, maxDepth, maxDifferences, maxStreamBytes, maxTotalStreamBytes, maxValueBytes и maxPathBytes
Рендеринг принимает dpi, colorSpace (rgb или luminance), colorTolerance, minimumSimilarity, maxChangedPixelRatio, tileSize и maxChangedRegions; callback-операции не пишут тепловые карты на файловую систему
Контрактные options принимают булевы поля, поля отступов, схожести, boilerplate и ресурсов из THPDFContractCompareOptions в camelCase-именах; granularity — word или sentence
Общие бюджеты — memoryBytes, outputBytes, resultBytes, timeMilliseconds, pixels, objectCount и pageCount; опции зажимаются по этим бюджетам
Бюджеты памяти выделяют консервативные запасы на оба пути декодирования, пиксели рендеринга, хранилище выравнивания и приватный вывод; это лимиты нагрузки, а не потолок RSS операционной системы, и уже загруженные графы объектов остаются во владении вызывающего
Аллокация JSON проверяется консервативной оценкой эскейпированного размера, которая может отвергнуть результат, чьё итоговое UTF-8-представление поместилось бы; HTML использует консервативный запас символов в рамках бюджета выходных байтов
Сбои бюджета возвращают ABI-статус 8, отмена — статус 4; отмена кооперативная, на границах страниц, объектов, блоков потоков, объектов рендеринга, строк пикселей и выравнивания
Контрольный конверт ошибок C ABI имеет независимый максимум 8 КиБ и обрезает детали до 1 024 кодовых единиц UTF-16, что позволяет сообщить об ошибке бюджета, даже когда запрошенный бюджет результата слишком мал для ответа с ошибкой
Заимствованные хэндлы C ABI
Загрузите каждый хэндл со своим источником hpdf_io_v1 и вызовите hpdf_document_compare_json_v1(handle_a, handle_b, operation); раскладки записей ABI v1 и исходный экспорт execute не изменились
operation.input_io должен быть NULL, result_io обязан предоставлять write, а опциональный output_io принимает артефакт; файловые ключи JSON input, otherInput и output отвергаются
Оба независимых источника могут возвращать короткие random-access чтения, и оба callback'а отмены опрашиваются, даже когда их декодированные объекты закэшированы; один и тот же хэндл можно передать дважды для самосравнения
Держите входные callback'и и их контексты живыми всё время жизни хэндла и активных вызовов и сериализуйте операции на каждом хэндле; ссылки на хэндлы удерживаются до возврата сравнения
Артефакты собираются и валидируются в приватных ограниченных буферах до публикации через callback; callback'и, упавшие во время публикации, могут удержать уже принятые байты, при этом исходные документы остаются неизменными
Файловые задания
{"operations":[{"type":"compare.contract","input":"before.pdf",
"otherInput":"after.pdf","format":"html","output":"review.html"}]}
password и otherPassword независимо открывают два файла; JSON-вывод может опустить выходной путь и остаться в конверте результата
Выходные пути должны отличаться от обоих исходных файлов, включая существующие алиасы жёстких ссылок; временный файл в каталоге назначения сбрасывается на диск и атомарно публикуется после прохождения всех проверок, а при сбое существующий вывод сохраняется
Смежные темы
Сравнение документов · Сравнение контрактов · Экспорт аннотированного потока