Validación del grafo de segmentos JBIG2

HotPDF valida los streams de imágenes JBIG2 embebidos y los JBIG2Globals antes de que un decoder nativo o externo los reciba

El validador realiza un recorrido acotado de segmentos seguido de un recorrido iterativo del grafo de dependencias, usando búsqueda de números de segmento indexada en lugar de escaneos repetidos

Validación antes del procesamiento personalizado

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 reporta los conteos de segmentos y de aristas, los símbolos nuevos declarados, la profundidad máxima de dependencias, y el stream, el offset de bytes, el número de segmento y el número de referencia asociados a la primera falla

Los presupuestos viven en un record TJBIG2SegmentGraphValidationOptions cuyos campos MaxSegments, MaxReferencesPerSegment, MaxTotalReferences, MaxReferenceDepth y MaxSymbols acotan cada recorrido

El estado terminal es un valor TJBIG2SegmentGraphValidationStatus que va desde not-checked y valid hasta el rechazo por opciones, las fallas de header y de referencias, los ciclos y las violaciones de symbol dictionaries, y HPDFJBIG2SegmentGraphValidationStatusName lo renderiza como texto

FailureStreamKind usa TJBIG2SegmentStreamKind para indicar si la primera falla se encontró en el stream de globals (jbsskGlobals) o en el stream de imagen (jbsskImage)

THPDFJBIG2Decoder.LastSegmentGraphValidationInfo retiene el mismo reporte después de LoadFromByteArray o LoadRegionFromByteArray

Condiciones de fail-closed

La validación rechaza headers malformados o truncados, file headers independientes en streams embebidos, tablas de referencia cortas prohibidas y sobredimensionadas, identificadores de segmento duplicados o faltantes, dependencias físicas hacia adelante, ciclos de dependencias, profundidad excesiva y exceder los presupuestos configurados de segmentos o aristas

Los segmentos de imagen deben usar la asociación de página 1, los segmentos globales deben usar la asociación de página 0, y un segmento global no puede depender de un segmento de imagen

Los segmentos embebidos de end-of-page, end-of-file y paleta de color se rechazan, al igual que los segmentos de región exclusivos de página y de información de página colocados en JBIG2Globals

Los headers de symbol dictionaries se inspeccionan antes de la decodificación, de modo que los conteos declarados de símbolos nuevos y exportados, los pools de símbolos de entrada agregados y los totales de exportación imposibles fallen antes de la asignación de bitmaps

Frontera del decoder y del cache de globals

THPDFJBIG2Decoder, HPDFJBIG2NativeMMRDecode, HPDFJBIG2NativeRegionDecode y las llamadas embebidas a HPDFJBIG2DecDecodeEx comparten la misma política

Los backends nativos y externos registrados usan rutas internas ya validadas, evitando un recorrido duplicado del grafo en la decodificación normal

THPDFJBIG2GlobalsPool.Register acepta solo un stream válido de segmentos exclusivamente globales, lo que impide que diccionarios compartidos malformados entren en la reutilización a nivel de documento

Los archivos JBIG2 independientes pasados con Embedded = False conservan su ruta de decodificación separada orientada a archivos

Vea Soporte de compresión JBIG2, THPDFJBIG2Decoder.LoadFromByteArray y THPDFJBIG2Decoder.LoadRegionFromByteArray