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