Validation du graphe de segments JBIG2
HotPDF valide les flux d'image JBIG2 intégrés et les flux JBIG2Globals avant qu'un décodeur natif ou externe ne les reçoive
Le validateur effectue un parcours de segments borné suivi d'un parcours itératif du graphe de dépendances, en utilisant une recherche indexée par numéro de segment au lieu de balayages répétés
Valider avant un traitement personnalisé
Options := DefaultJBIG2SegmentGraphValidationOptions;
Options.MaxSegments := 32768;
Options.MaxTotalReferences := 131072;
Options.MaxReferenceDepth := 512;
Options.MaxSymbols := 500000;
if not HPDFValidateJBIG2SegmentGraph(ImageData, GlobalData,
Options, Info) then
raise Exception.Create(string(
HPDFJBIG2SegmentGraphValidationStatusName(Info.Status)));
TJBIG2SegmentGraphValidationInfo rapporte les nombres de segments et d'arêtes, les nouveaux symboles déclarés, la profondeur de dépendance maximale, ainsi que le flux, le décalage d'octets, le numéro de segment et le numéro de référence associés au premier échec
Les budgets résident dans un enregistrement TJBIG2SegmentGraphValidationOptions dont les champs MaxSegments, MaxReferencesPerSegment, MaxTotalReferences, MaxReferenceDepth et MaxSymbols bornent chaque parcours
L'état terminal est une valeur TJBIG2SegmentGraphValidationStatus allant de non vérifié et valide jusqu'au rejet des options, aux échecs d'en-tête et de références, aux cycles et aux violations de dictionnaire de symboles, et HPDFJBIG2SegmentGraphValidationStatusName la restitue sous forme de texte
FailureStreamKind utilise TJBIG2SegmentStreamKind pour dire si le premier échec a été trouvé dans le flux de globals (jbsskGlobals) ou dans le flux d'image (jbsskImage)
THPDFJBIG2Decoder.LastSegmentGraphValidationInfo conserve le même rapport après LoadFromByteArray ou LoadRegionFromByteArray
Conditions de rejet par défaut
La validation rejette les en-têtes mal formés ou tronqués, les en-têtes de fichiers autonomes dans les flux intégrés, les tables de référence longues trop courtes ou trop grandes interdites, les identifiants de segment dupliqués ou manquants, les dépendances physiquement vers l'avant, les cycles de dépendances, la profondeur excessive et les dépassements de budget de segments ou d'arêtes configurés
Les segments d'image doivent utiliser l'association de page 1, les segments globaux doivent utiliser l'association de page 0, et un segment global ne peut pas dépendre d'un segment d'image
Les segments intégrés de fin de page, de fin de fichier et de palette de couleurs sont rejetés, tout comme les segments de région et d'informations de page réservés aux pages placés dans JBIG2Globals
Les en-têtes de dictionnaires de symboles sont inspectés avant le décodage afin que les nombres de symboles nouveaux et exportés déclarés, les pools de symboles d'entrée agrégés et les totaux d'exportation impossibles échouent avant l'allocation du bitmap
Frontière du décodeur et du cache de globals
THPDFJBIG2Decoder, HPDFJBIG2NativeMMRDecode, HPDFJBIG2NativeRegionDecode et les appels intégrés HPDFJBIG2DecDecodeEx partagent la même politique
Les backends natifs et externes enregistrés utilisent des chemins internes déjà validés, évitant ainsi un double parcours du graphe lors du décodage normal
THPDFJBIG2GlobalsPool.Register n'accepte qu'un flux de segments uniquement global valide, empêchant les dictionnaires partagés mal formés d'entrer dans la réutilisation au niveau du document
Les fichiers JBIG2 autonomes passés avec Embedded = False conservent leur chemin de décodage distinct orienté fichier
Voir prise en charge de la compression JBIG2, THPDFJBIG2Decoder.LoadFromByteArray, et THPDFJBIG2Decoder.LoadRegionFromByteArray