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