Validación del grafo de segmentos JBIG2

HotPDF valida las imágenes JBIG2 incrustadas y los flujos JBIG2Globals antes de que un decodificador nativo o externo los reciba

El validador realiza un recorrido de segmentos acotado seguido de un recorrido iterativo del grafo de dependencias, usando una búsqueda indexada por número de segmento 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 informa de los recuentos de segmentos y bordes, de los nuevos símbolos declarados, de la profundidad máxima de dependencia y del flujo, desplazamiento de bytes, número de segmento y número de referencia asociados con el primer fallo

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

El estado terminal es un valor TJBIG2SegmentGraphValidationStatus que va de no comprobado y válido hasta rechazo de opciones, fallos de encabezado y de referencias, ciclos y violaciones del diccionario de símbolos, y HPDFJBIG2SegmentGraphValidationStatusName lo representa como texto

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

THPDFJBIG2Decoder.LastSegmentGraphValidationInfo conserva el mismo informe después de LoadFromByteArray o LoadRegionFromByteArray

Condiciones de fallo cerrado

La validación rechaza encabezados malformados o truncados, encabezados de archivo independientes en flujos incrustados, tablas de referencias largas demasiado grandes y cortas prohibidas, identificadores de segmento duplicados o ausentes, dependencias físicamente hacia adelante, ciclos de dependencia, profundidad excesiva y superaciones de los presupuestos de segmentos o bordes configurados

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

Se rechazan los segmentos incrustados de fin de página, fin de archivo y paleta de colores, así como los segmentos de región solo de página y de información de página colocados en JBIG2Globals

Los encabezados de las tablas de símbolos se inspeccionan antes de la decodificación para que los recuentos de símbolos nuevos y exportados declarados, los grupos de símbolos agregados de entrada y los totales de exportación imposibles fallen antes de la asignación de mapas de bits

Límite entre decodificador y caché de globals

THPDFJBIG2Decoder, HPDFJBIG2NativeMMRDecode, HPDFJBIG2NativeRegionDecode y las llamadas incrustadas 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 solo acepta un flujo de segmentos global-válido exclusivo, evitando 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

Consulte soporte de compresión JBIG2, THPDFJBIG2Decoder.LoadFromByteArray y THPDFJBIG2Decoder.LoadRegionFromByteArray