Soporte de compresión JBIG2

Descripción general

HotPDF ahora incluye compatibilidad completa con compresión JBIG2 (Joint Bi-level Image Experts Group 2) JBIG2 es un estándar de compresión con pérdida o sin pérdida diseñado específicamente para imágenes binivel (monocromas), comúnmente usado en documentos PDF para páginas de texto escaneadas y arte lineal

Funciones clave

  • High-efficiency compression for bilevel images
  • Compresión de alta eficiencia para imágenes binivel
  • Compatibilidad con modos de compresión con pérdida y sin pérdida
  • Optimizado para compresión de texto y arte lineal
  • Reducción significativa del tamaño de archivo frente a métodos de compresión tradicionales
  • Compatibilidad completa con conformidad PDF/A
  • Compatibilidad con documentos multipágina mediante diccionarios compartidos

Ventajas de compresión

  • Relaciones de compresión superiores: Hasta 3-5 veces mejor compresión que Group 4 CCITT
  • Symbol matching: Con UseSymbolDictionary, los componentes conexos negros repetidos se guardan una vez como símbolos, y LossyLevel permite que los componentes casi idénticos compartan un símbolo
  • Eficiente en memoria: Optimizado para procesar documentos escaneados grandes

Casos de uso típicos

  • Documentos de texto escaneados
  • Dibujos técnicos y planos
  • Formularios y facturas
  • Mapas y diagramas
  • Documentos de contenido mixto con texto y gráficos

Implementación técnica

El soporte JBIG2 se implementa mediante la unidad HPDFJBIG2.pas, que ofrece:

  • THPDFJBIG2Decoder: Clase decodificadora principal para datos comprimidos JBIG2
  • Procesamiento de flujos: Manejo eficiente de flujos de datos JBIG2
  • Compatibilidad con diccionario global: Diccionarios de símbolos compartidos para documentos multipágina
  • Acceso por scanline: Acceso a datos fila por fila para procesamiento eficiente en memoria
  • Soporte de diccionarios globales: Diccionarios de símbolos compartidos y encadenados de varios niveles, con identificadores de segmento de uno, dos o cuatro bytes
  • Codificador por lotes entre páginas: THPDFJBIG2Encoder.EncodePagesToByteArrays entrena con el lote completo y devuelve un stream por cada página de entrada, más los datos globales compartidos
  • Contrato de lotes: TJBIG2BatchPage describe una página empaquetada, TJBIG2BatchEncodeBackend identifica la implementación seleccionada y TJBIG2BatchEncodeCallback define las integraciones externas de lotes
  • Integración con el documento: THotPDF.AddJBIG2ImageBatch y THotPDF.AddJBIG2BitmapBatch codifican antes de modificar el grafo del PDF, adjuntan un stream /JBIG2Globals compartido y devuelven los índices de imagen en el orden de entrada
  • Telemetría de lotes: TJBIG2BatchEncodeStatistics informa el backend seleccionado, los tamaños de entrada y salida, la cantidad de símbolos nativos y el rechazo por presupuesto
  • Recuperación de backends: HPDFJBIG2EncRegisterBackends restaura ambos callbacks de codificador integrados después de limpiar las anulaciones temporales de la aplicación
  • HPDFJBIG2SplitSymbolDictionaryGlobals: Separa un stream incrustado secuencial en diccionarios globales y segmentos de imagen de página, conservando los encabezados de dependencia en formato largo
  • Decodificación de la región visible: THPDFJBIG2Decoder.LoadRegionFromByteArray asigna solo la ventana solicitada, resuelve sus dependencias transitivas de diccionarios, compone las regiones de página que se intersecan aplicando recorte y omite las regiones independientes fuera de la ventana antes de la decodificación de entropía
  • Telemetría de decodificación de regiones: LastRegionDecodeStats informa la cantidad de regiones decodificadas y omitidas, además de los píxeles de origen decodificados, mientras que UsedIncrementalRegionDecode distingue la ruta nativa por ventana del fallback de decodificación completa
  • Acceso por scanline: Acceso a los datos fila por fila para un procesamiento eficiente en memoria

Usage Ejemplo


// 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;
        

Opciones del encoder y backends

  • THotPDF.JBIG2Options: El THPDFJBIG2Options del documento, que AddImage(..., icJBIG2) convierte en TJBIG2EncodeOptions. Sus valores predeterminados sirven para escaneos: Lossless=True, LossyLevel=5, RemoveIsolatedBlackPixels=True y BlackDotSize=3
  • Speckle removal: Mientras RemoveIsolatedBlackPixels sea True, los componentes conexos negros cuyo ancho y alto sean ambos menores que BlackDotSize se limpian antes de codificar, así que los valores predeterminados eliminan puntos de 2 x 2 píxeles y menores. Póngalo en False cuando la salida deba coincidir píxel a píxel con el bitmap
  • Encoder choice: UseExternalEncoder (True por defecto) usa el codificador aritmético de alto rendimiento registrado; cuando está apagado, falta o falla, se escribe la región genérica MMR sin pérdida integrada. UseNativeArithmeticFallback=True prueba el codificador aritmético Pascal integrado antes que MMR, y con UseSymbolDictionary=True prueba primero un diccionario de símbolos con regiones de texto
  • DefaultJBIG2EncodeOptions: Las opciones que usa un THPDFJBIG2Encoder independiente: sin pérdida, con LossyLevel=0 y sin limpieza de puntos
  • Decoder choice: THotPDF.UseExternalJBIG2Decoder (True por defecto) decodifica imágenes /JBIG2Decode cargadas con el backend de alto rendimiento cuando está disponible; False usa el decodificador Pascal integrado
  • Custom backends: RegisterJBIG2EncoderBackend y RegisterJBIG2DecoderBackend instalan callbacks de la aplicación, IsJBIG2EncoderBackendAvailable y IsJBIG2DecoderBackendAvailable los reportan, y ClearJBIG2Backends los elimina

Class Reference

THPDFJBIG2Decoder

  • LoadFromByteArray: Carga datos JBIG2 desde un byte array; devuelve False cuando los datos están incompletos o no son compatibles
  • GetScanline: Retrieve specific scanline data
  • Width/Height: Image dimensions properties

Performance Optimization

  • Un corpus fijo de escaneo de 100 páginas se comprime de 158,300 bytes con regiones genéricas separadas a 33,600 bytes con entrenamiento cruzado externo entre páginas, una reducción del 78,8 por ciento
  • El mismo corpus se completa en 11 ms en lugar de 53 ms en Win64 y en 16 ms en lugar de 77 ms en Win32 en el benchmark de regresión
  • La búsqueda página-a-símbolo está indexada y los streams de página codificados repetidos se guardan en cache para extracción por lotes en tiempo constante
  • Procesamiento de scanlines eficiente en memoria
  • Optimizado para el manejo de documentos grandes
  • Huella de memoria mínima durante la descompresión

Véase también

  • Conformidad con el estándar ITU-T T.88
  • Soporte del estándar ISO/IEC 14492
  • Image XObjects de PDF 1.4 o posterior con /JBIG2Decode y /JBIG2Globals
  • HotPDF no escribe JBIG2 mientras la salida PDF/A está activa: AddImage(..., icJBIG2) escribe icCCITT42 en su lugar y la inserción por lotes devuelve False
  • Consistencia multiplataforma

Ver también