Семантическое сравнение content stream
HPDFContentStream умеет нормализовать декодированное содержимое PDF в ограниченные канонические события и сравнивать эти события, не считая безобидные решения сериализации изменениями
Объявление
function HPDFNormalizeContentStreamGraphicsState(
const Bytes: TBytes; out Canonical: TBytes;
out Statistics: THPDFContentSemanticStatistics;
NumberTolerance: Double = 1E-9;
MaxOperations: Integer = 1000000;
MaxCanonicalBytes: Int64 = 67108864
): boolean;
function HPDFCompareContentStreamsSemantic(
const Left, Right: TBytes;
out Info: THPDFContentSemanticCompareInfo;
NumberTolerance: Double = 1E-9;
MaxOperations: Integer = 1000000;
MaxCanonicalBytes: Int64 = 67108864
): boolean;
Нормализация
- Числа квантуются с допуском вызывающего и выводятся в независимом от locale написании
- Literal и hex-строки сравниваются по декодированному байтовому значению, а массивы сохраняют тип элементов и порядок
- Сеттеры graphics и text state обновляют эффективный снимок, а избыточные сеттеры не создают событий
qиQведут полный стек состояний, но сами по себе событиями не становятся- Подряд идущие операторы
cmперемножаются в порядке PDF, поэтому эквивалентные факторизации матриц сравниваются как равные - Каждый сохранённый оператор несёт эффективные матрицу, line, цвет, external graphics и text state, действующие в этой точке
- Ключи inline-изображений нормализует tokenizer, а payload используют идентичности SHA-256, чтобы избежать раздувания канонического stream
Диагностика и границы
THPDFContentSemanticStatistics сообщает информацию о token, операциях, state-операциях, избыточных состояниях, нормализованных событиях, максимальной глубине стека, канонических байтах, смещении ошибки, валидности и лимитах. Сравнение дополнительно сообщает первое различающееся нормализованное событие
Битые вложенные операнды-словари, невалидная арность state-операторов, непарные или незакрытые области graphics state, хвостовые операнды, переполнение операций и переполнение канонических байтов приводят к отказу целиком и никогда не сообщают об эквивалентности
Передавайте декодированные байты содержимого. Декодирование stream filter и согласование имён ресурсов между разными словарями ресурсов остаются на ответственности вызывающего