Comparação semântica de fluxos de conteúdo
HPDFContentStream consegue normalizar conteúdo PDF descodificado em eventos canónicos delimitados e comparar esses eventos sem tratar como alterações escolhas de serialização inofensivas
Declarações
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;
Normalization
- Os números são quantizados pela tolerância de quem chama e emitidos com uma grafia independente do locale
- As literal strings e as hexadecimal strings comparam-se pelo valor de byte descodificado, enquanto os arrays mantêm o tipo e a ordem dos itens
- Os setters de graphics e de text state atualizam um snapshot efetivo, e os setters redundantes não criam eventos
qeQmantêm uma pilha de estado completa, mas não se tornam eventos por si só- Operadores
cmsucessivos são multiplicados pela ordem do PDF, pelo que fatorizações equivalentes da matriz comparam como iguais - Cada operador retido transporta a matriz efetiva, o estado de linha, de cor, de gráficos externos e de texto que se aplica nesse ponto
- As chaves de inline images são normalizadas pelo tokenizer e os payloads usam identidades SHA-256, para evitar a expansão do stream canónico
Diagnostics and bounds
THPDFContentSemanticStatistics reporta informação sobre tokens, operações, operações de estado, estado redundante, eventos normalizados, profundidade máxima da pilha, bytes canónicos, offset do erro, validade e limites. A comparação reporta também o primeiro evento normalizado que difere
Operandos de dicionário aninhado malformados, aridade inválida de operadores de estado, âmbitos de graphics state sem par ou por fechar, operandos finais, overflow de operações e overflow de bytes canónicos falham em modo fechado e nunca reportam equivalência
Passe os bytes de conteúdo já descodificados. A descodificação dos filtros do stream e a reconciliação de nomes de recursos entre dicionários de recursos diferentes continuam a ser responsabilidade de quem chama