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