Сравнение документов через 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-вывод может опустить выходной путь и остаться в конверте результата

Выходные пути должны отличаться от обоих исходных файлов, включая существующие алиасы жёстких ссылок; временный файл в каталоге назначения сбрасывается на диск и атомарно публикуется после прохождения всех проверок, а при сбое существующий вывод сохраняется

Смежные темы

Сравнение документов · Сравнение контрактов · Экспорт аннотированного потока