Validação de grafo de segmentos JBIG2
O HotPDF valida imagens JBIG2 embutidas e streams JBIG2Globals antes que um decodificador nativo ou externo os receba
O validador executa uma caminhada de segmentos com limite, seguida de uma travessia iterativa do grafo de dependências, usando busca indexada por número de segmento em vez de varreduras repetidas
Valide antes do processamento 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 relata contagens de segmentos e arestas, novos símbolos declarados, profundidade máxima de dependência e o stream, o deslocamento de byte, o número de segmento e o número de referência associados à primeira falha
Os orçamentos vivem em um registro TJBIG2SegmentGraphValidationOptions cujos campos MaxSegments, MaxReferencesPerSegment, MaxTotalReferences, MaxReferenceDepth e MaxSymbols limitam cada caminhada
O estado terminal é um valor de TJBIG2SegmentGraphValidationStatus que vai de not-checked e valid até rejeição de opções, falhas de cabeçalho e de referência, ciclos e violações de dicionário de símbolos, e o HPDFJBIG2SegmentGraphValidationStatusName o renderiza como texto
FailureStreamKind usa TJBIG2SegmentStreamKind para dizer se a primeira falha foi encontrada no stream de globals (jbsskGlobals) ou no stream de imagem (jbsskImage)
THPDFJBIG2Decoder.LastSegmentGraphValidationInfo retém o mesmo relatório após LoadFromByteArray ou LoadRegionFromByteArray
Condições fail-closed
A validação rejeita cabeçalhos malformados ou truncados, cabeçalhos de arquivo standalone em streams embutidos, tabelas de referência curtas proibidas e longas excessivas, identificadores de segmento duplicados ou ausentes, dependências fisicamente para frente, ciclos de dependência, profundidade excessiva e estouro dos orçamentos de segmentos ou arestas configurados
Segmentos de imagem devem usar associação de página 1, segmentos globais devem usar associação de página 0, e um segmento global não pode depender de um segmento de imagem
Segmentos embutidos de fim de página, fim de arquivo e paleta de cores são rejeitados, assim como segmentos de região somente de página e de informação de página colocados em JBIG2Globals
Os cabeçalhos de dicionário de símbolos são inspecionados antes da decodificação, para que contagens declaradas de novos e exportados símbolos, pools agregados de símbolos de entrada e totais de exportação impossíveis falhem antes da alocação de bitmap
Fronteira entre decodificador e cache de globais
THPDFJBIG2Decoder, HPDFJBIG2NativeMMRDecode, HPDFJBIG2NativeRegionDecode e as chamadas embutidas de HPDFJBIG2DecDecodeEx compartilham a mesma política
Os backends nativo e externo registrados usam caminhos internos já validados, evitando uma caminhada duplicada do grafo na decodificação normal
THPDFJBIG2GlobalsPool.Register aceita apenas um stream de segmentos global válido, impedindo que dicionários compartilhados malformados entrem na reutilização em nível de documento
Arquivos JBIG2 standalone passados com Embedded = False mantêm seu caminho de decodificação separado orientado a arquivo
Veja JBIG2 compression support, THPDFJBIG2Decoder.LoadFromByteArray e THPDFJBIG2Decoder.LoadRegionFromByteArray