Sémantické porovnání obsahových streamů
HotPDF porovnává obsahové streamy PDF podle významu operátorů a operandů místo pouhého porovnání bajtůHPDFContentStream
Normalizace
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;
Normalizace
- Čísla se kvantují podle tolerance volajícího a emitují s pravopisem nezávislým na locale
- Literal a hexadecimální řetězce se porovnávají podle dekódované bajtové hodnoty, zatímco pole si zachovávají typ a pořadí položek
- Settery grafiky a textového stavu aktualizují efektivní snapshot a redundantní settery nevytvářejí události
qaQvedou kompletní zásobník stavů, ale samy o sobě se na události nestávají- Následné operátory
cmse násobí v pořadí PDF, takže ekvivalentní faktorizace matic se porovnají stejně - Každý zachovaný operátor nese efektivní matici, čáru, barvu, externí grafiku a textový stav platné v tomto bodě
- Klíče inline obrázků normalizuje tokenizer a payloady používají identity SHA-256, aby se zabránilo expanzi kanonického streamu
Diagnostika a meze
THPDFContentSemanticStatistics hlásí tokeny, operace, stavové operace, redundantní stavy, normalizované události, maximální hloubku zásobníku, kanonické bajty, chybový offset, platnost a limity. Porovnání navíc hlásí první odlišnou normalizovanou událost
Porovnání zohledňuje tokenizované operátory, grafický stav, odkazy na prostředky a ekvivalentní zápis čísel a řetězců
Výsledek uvádí první sémantickou odlišnost, její umístění a diagnostické informace použitelné pro regresní testy