Comparación semántica de content streams
HPDFContentStream puede normalizar contenido PDF decodificado en eventos canónicos acotados y comparar esos eventos sin tratar elecciones de serialización inofensivas como cambios
Declaración
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;
Normalización
- Los números se cuantizan según la tolerancia del caller y se emiten con escritura independiente del locale
- Las cadenas literal y hexadecimal se comparan por valor de bytes decodificado, mientras que los arrays conservan el tipo y el orden de sus elementos
- Los setters de graphics y text-state actualizan un snapshot efectivo y los setters redundantes no generan eventos
qyQmantienen un state stack completo, pero por sí mismos no se convierten en eventos- Los operadores
cmsucesivos se multiplican en orden PDF, de modo que factorizaciones de matriz equivalentes comparan igual - Cada operador retenido lleva la matriz, línea, color, gráficos externos y text state efectivos que aplican en ese punto
- Las claves de inline-images las normaliza el tokenizer y los payloads usan identidades SHA-256 para evitar la expansión del canonical stream
Diagnóstico y límites
THPDFContentSemanticStatistics reporta información de tokens, operaciones, state-operations, estados redundantes, eventos normalizados, profundidad máxima del stack, bytes canónicos, offset de error, validez y límites. La comparación además reporta el primer evento normalizado que difiere
Los operandos de diccionario anidados malformados, la aridad inválida de operadores de estado, los scopes de graphics-state sin cerrar o sin emparejar, los operandos sobrantes, el overflow de operaciones y el overflow de bytes canónicos fallan de forma cerrada y nunca reportan equivalencia
Pase bytes de contenido decodificados. La decodificación de stream filters y la reconciliación de nombres de recursos entre diccionarios de recursos distintos siguen siendo responsabilidad del caller