Validação do Grafo de Segmentos JBIG2

O HotPDF valida imagens JBIG2 incorporadas e fluxos JBIG2Globals antes de um descodificador nativo ou externo os receber

O validador executa uma percorrida limitada de segmentos seguida de uma travessia iterativa do grafo de dependências, usando pesquisa indexada por número de segmento em vez de percorridas repetidas

Validar antes de 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 reporta contagens de segmentos e arestas, símbolos novos declarados, profundidade máxima de dependência e o fluxo, deslocamento de bytes, número de segmento e número de referência associados à primeira falha

Os orçamentos vivem num registo TJBIG2SegmentGraphValidationOptions cujos campos MaxSegments, MaxReferencesPerSegment, MaxTotalReferences, MaxReferenceDepth e MaxSymbols limitam cada percurso

O estado terminal é um valor TJBIG2SegmentGraphValidationStatus que vai de não verificado e válido até à rejeição das opções, falhas de cabeçalho e de referências, ciclos e violações de dicionários de símbolos, e HPDFJBIG2SegmentGraphValidationStatusName apresenta-o como texto

FailureStreamKind usa TJBIG2SegmentStreamKind para indicar se a primeira falha foi encontrada no fluxo de globals (jbsskGlobals) ou no fluxo de imagem (jbsskImage)

THPDFJBIG2Decoder.LastSegmentGraphValidationInfo retém o mesmo relatório depois de LoadFromByteArray ou LoadRegionFromByteArray

Condições fail-closed

A validação rejeita cabeçalhos malformados ou truncados, cabeçalhos de ficheiro standalone em fluxos incorporados, tabelas de referências curtas proibidas e tabelas longas excessivas, identificadores de segmento duplicados ou em falta, dependências fisicamente para a frente, ciclos de dependência, profundidade excessiva e ultrapassagens dos orçamentos configurados de segmentos ou arestas

Os segmentos de imagem têm de usar a associação de página 1, os segmentos globais têm de usar a associação de página 0, e um segmento global não pode depender de um segmento de imagem

Segmentos de fim de página, fim de ficheiro e paleta de cores incorporados são rejeitados, tal como segmentos de região exclusiva de página e de informação de página colocados em JBIG2Globals

Os cabeçalhos de dicionários de símbolos são inspecionados antes da descodificação, para que as contagens declaradas de símbolos novos e exportados, os pools agregados de símbolos de entrada e totais de exportação impossíveis falhem antes da alocação de mapas de bits

Limite do descodificador e da cache de globais

THPDFJBIG2Decoder, HPDFJBIG2NativeMMRDecode, HPDFJBIG2NativeRegionDecode e as chamadas incorporadas de HPDFJBIG2DecDecodeEx partilham a mesma política

Os backends nativos e externos registados usam caminhos internos já validados, evitando uma percorrida duplicada do grafo na descodificação normal

THPDFJBIG2GlobalsPool.Register aceita apenas um fluxo de segmentos válido exclusivamente global, impedindo que dicionários partilhados malformados entrem na reutilização ao nível do documento

Ficheiros JBIG2 standalone passados com Embedded = False mantêm o seu caminho de descodificação separado orientado a ficheiro

Consulte Suporte de compressão JBIG2, THPDFJBIG2Decoder.LoadFromByteArray e THPDFJBIG2Decoder.LoadRegionFromByteArray