JBIG2 Compression Support

Visão geral

O HotPDF inclui compressão e decodificação JBIG2 para imagens bilevel usadas por texto escaneado, formulários e line art

Key Features

  • Compressão de alta eficiência para imagens bilevel
  • Suporte aos modos de compressão com e sem perdas
  • Otimizado para compressão de texto e line art
  • Redução significativa de tamanho de arquivo comparado aos métodos tradicionais de compressão
  • Codificação multi-página com um único dicionário de símbolos treinado compartilhado por todo Image XObject
  • Detecção exata de páginas duplicadas antes da classificação e reutilização de XObjects codificados durante a montagem do PDF
  • Orçamentos limitados de páginas e pixels com fallback nativo opcional em Pascal

Compression Benefits

  • Cross-page reuse: Símbolos repetidos são classificados uma única vez e armazenados em dados globais compartilhados
  • Symbol matching: Com UseSymbolDictionary, componentes conexos pretos repetidos são armazenados uma única vez como símbolos, e LossyLevel permite que componentes quase idênticos compartilhem um símbolo
  • Memory Efficient: Otimizado para processar documentos escaneados grandes

Typical Use Cases

  • Documentos de texto escaneados
  • Desenhos técnicos e plantas
  • Formulários e faturas
  • Mapas e diagramas
  • Documentos de conteúdo misto com texto e gráficos

Technical Implementation

A implementação JBIG2 fornece caminhos nativos em Pascal e um backend estático externo opcional por meio destas APIs

  • THPDFJBIG2Decoder: Classe central de decodificação para dados comprimidos JBIG2
  • Native Coding Coverage: Regiões genéricas MMR, regiões genéricas MQ, dicionários de símbolos e regiões de texto aritméticos e standard-Huffman, símbolos de refinamento, símbolos agregados, instâncias de texto refinadas, contextos aritméticos retidos e tabelas limitadas de referências longas
  • Bounded Context Reuse: Bancos de probabilidade genéricos e de refinamento são retidos com tamanhos conscientes do template, isolados entre dependências de fan-out e rejeitados quando a origem ou o template é incompatível
  • Stream Processing: Tratamento eficiente de streams de dados JBIG2
  • Global Dictionary Support: Dicionários de símbolos compartilhados e encadeados em múltiplos níveis com identificadores de segmento de um, dois ou quatro bytes
  • Cross-page batch encoder: THPDFJBIG2Encoder.EncodePagesToByteArrays treina pelo lote completo e retorna um stream de página por entrada mais dados globais compartilhados
  • Batch contract: TJBIG2BatchPage descreve uma página empacotada, TJBIG2BatchEncodeBackend identifica a implementação selecionada e TJBIG2BatchEncodeCallback define integrações externas de lote
  • Document integration: THotPDF.AddJBIG2ImageBatch e THotPDF.AddJBIG2BitmapBatch codificam antes de mutar o grafo PDF, anexam um stream /JBIG2Globals compartilhado e retornam índices de imagem na ordem de entrada
  • Batch telemetry: TJBIG2BatchEncodeStatistics reporta o backend selecionado, tamanhos de entrada e saída, contagem de símbolos nativos e rejeição por orçamento
  • Backend recovery: HPDFJBIG2EncRegisterBackends restaura os dois callbacks de codificação embutidos depois que sobrescritas temporárias da aplicação são limpas
  • HPDFJBIG2SplitSymbolDictionaryGlobals: Separa um stream embutido sequencial em dicionários globais e segmentos de imagem de página, preservando os headers de dependências longas
  • Visible-Region Decode: THPDFJBIG2Decoder.LoadRegionFromByteArray aloca apenas a janela solicitada, resolve as dependências transitivas de dicionários, compõe regiões de página que se intersectam com clipping e pula regiões independentes fora da janela antes da decodificação de entropia
  • Region Decode Telemetry: LastRegionDecodeStats reporta contagens de regiões decodificadas e puladas mais pixels de origem decodificados, enquanto UsedIncrementalRegionDecode distingue o caminho nativo de janela do fallback de decodificação completa
  • Scanline Access: Acesso aos dados linha a linha para processamento eficiente em memória

Usage Example


// Delphi example - Processing JBIG2 compressed data
procedure ProcessJBIG2Data;
var
  PDF: THotPDF;
  Decoder: THPDFJBIG2Decoder;
  ImageData: TBytesArray;
  ScanlineData: TBytesArray;
  Row: Integer;
begin
  PDF := THotPDF.Create(nil);
  Decoder := THPDFJBIG2Decoder.Create;
  try
    PDF.BeginDoc;
    PDF.AddPage;

    // Load JBIG2 compressed image data
    if Decoder.LoadFromByteArray(ImageData) then
    begin
      // Process scanline by scanline for memory efficiency
      for Row := 0 to Decoder.Height - 1 do
      begin
        if Decoder.GetScanline(Row, ScanlineData) then
        begin
          // Process scanline data as needed
          // Add to PDF page
        end;
      end;
    end;

    PDF.EndDoc;
  finally
    Decoder.Free;
    PDF.Free;
  end;
end;
        

Encoder Options and Backends

  • THotPDF.JBIG2Options: O THPDFJBIG2Options do documento, que AddImage(..., icJBIG2) converte em TJBIG2EncodeOptions. Os padrões dele servem para digitalizações: Lossless=True, LossyLevel=5, RemoveIsolatedBlackPixels=True e BlackDotSize=3
  • Remoção de speckles: Enquanto RemoveIsolatedBlackPixels é True, componentes conexos pretos cujos largura e altura são ambos menores que BlackDotSize são limpos antes da codificação, de modo que os padrões removem pontos de 2 x 2 pixels e menores. Defina False quando a saída precisa corresponder ao bitmap pixel a pixel
  • Escolha do encoder: UseExternalEncoder (padrão True) usa o encoder aritmético de alto desempenho registrado; quando ele está desligado, ausente ou falha, a região genérica MMR sem perdas embutida é gravada. UseNativeArithmeticFallback=True tenta o coder aritmético Pascal embutido antes do MMR, e com UseSymbolDictionary=True ele primeiro tenta um dicionário de símbolos com text regions
  • DefaultJBIG2EncodeOptions: As opções que um THPDFJBIG2Encoder autônomo usa: sem perdas, com LossyLevel=0 e sem remoção de speckles
  • Escolha do decoder: THotPDF.UseExternalJBIG2Decoder (padrão True) decodifica imagens /JBIG2Decode carregadas com o backend de alto desempenho quando ele está disponível; False usa o decoder Pascal embutido
  • Backends personalizados: RegisterJBIG2EncoderBackend e RegisterJBIG2DecoderBackend instalam callbacks da aplicação, IsJBIG2EncoderBackendAvailable e IsJBIG2DecoderBackendAvailable os reportam, e ClearJBIG2Backends os remove

Class Reference

THPDFJBIG2Decoder

  • LoadFromByteArray: Carrega dados JBIG2 de um array de bytes; retorna False quando os dados estão incompletos ou não são suportados
  • GetScanline: Recupera dados de uma scanline específica
  • Width/Height: Propriedades de dimensões da imagem

Performance Optimization

  • Um corpus fixo de scan de 100 páginas comprime de 158.300 bytes com regiões genéricas separadas para 33.600 bytes com treinamento externo entre páginas — uma redução de 78,8%
  • O mesmo corpus conclui em 11 ms em vez de 53 ms no Win64 e 16 ms em vez de 77 ms no Win32 no benchmark de regressão
  • A consulta página-para-símbolo é indexada e streams de páginas codificadas repetidas ficam em cache para extração de lote em tempo constante
  • Processamento de scanlines eficiente em memória
  • Otimizado para lidar com documentos grandes
  • Pegada mínima de memória durante a descompressão

Standards Compliance

  • Conformidade com o padrão ITU-T T.88
  • Suporte ao padrão ISO/IEC 14492
  • Image XObjects de PDF 1.4 ou mais novo com /JBIG2Decode e /JBIG2Globals
  • O HotPDF não grava JBIG2 enquanto a saída PDF/A está ativa: AddImage(..., icJBIG2) grava icCCITT42 em vez disso, e a inserção em lote retorna False
  • Consistência entre plataformas

See Also