Confronto Semantico dei Flussi di Contenuto
HPDFContentStream può normalizzare il contenuto PDF decodificato in eventi canonici delimitati e confrontare questi eventi senza trattare le scelte di serializzazione innocue come modifiche
Dichiarazioni
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;
Normalizzazione
- I numeri vengono quantizzati con la tolleranza del chiamante ed emessi con ortografia indipendente dalla locale
- Le stringhe letterali ed esadecimali vengono confrontate per valore di byte decodificato, mentre gli array conservano tipo e ordine degli elementi
- I setter dello stato grafico e di testo aggiornano uno snapshot effettivo e i setter ridondanti non creano eventi
qeQmantengono uno stack di stato completo ma non diventano eventi da soli- Gli operatori
cmsuccessivi vengono moltiplicati in ordine PDF, quindi fattorizzazioni di matrice equivalenti si confrontano in modo uguale - Ogni operatore conservato porta la matrice effettiva, lo stato di linea, colore, grafica esterna e testo che si applica in quel punto
- Le chiavi delle immagini inline vengono normalizzate dal tokenizer e i payload usano identità SHA-256 per evitare l'espansione del flusso canonico
Diagnostica e limiti
THPDFContentSemanticStatistics riporta le informazioni su token, operazione, operazione di stato, stato ridondante, evento normalizzato, profondità massima dello stack, byte canonici, offset di errore, validità e limite. Il confronto riporta anche il primo evento normalizzato diverso
Operandi di dizionario annidati non validi, arità non valida degli operatori di stato, ambiti di stato grafico non appaiati o non chiusi, operandi finali, overflow di operazioni e overflow di byte canonici falliscono chiudendosi e non riportano mai equivalenza
Passare i byte di contenuto decodificato. La decodifica dei filtri di flusso e la riconciliazione dei nomi di risorsa tra dizionari di risorse diversi restano responsabilità del chiamante