|
Soporte de compresión JBIG2
Visión general
HotPDF incluye compresión y decodificación JBIG2 para imágenes bilevel usadas por texto escaneado, formularios y line art
Características principales
- Compresión de alta eficiencia para imágenes bilevel
- Soporte de modos de compresión con y sin pérdida
- Optimizado para la compresión de texto y arte lineal
- Reducción significativa del tamaño de archivo frente a los métodos de compresión tradicionales
- Codificación multipágina con un único diccionario de símbolos entrenado compartido por cada XObject de imagen
- Detección exacta de páginas duplicadas antes de la clasificación y reutilización de XObjects codificados durante el ensamblado del PDF
- Presupuestos acotados de páginas y píxeles con respaldo nativo Pascal opcional
Ventajas de compresión
- Reutilización entre páginas: los símbolos repetidos se clasifican una vez y se almacenan en datos globales compartidos
- Symbol matching: con
UseSymbolDictionary, los componentes conexos negros repetidos se almacenan una vez como símbolos, y LossyLevel permite que los componentes casi idénticos compartan un mismo símbolo
- Memory Efficient: optimizado para procesar documentos escaneados grandes
Casos de uso típicos
- Documentos de texto escaneados
- Planos técnicos y blueprints
- Formularios y facturas
- Mapas y diagramas
- Documentos de contenido mixto con texto y gráficos
Implementación técnica
La implementación JBIG2 proporciona rutas Pascal nativas y un backend estático externo opcional mediante estas APIs
- THPDFJBIG2Decoder: clase de decodificación principal para datos comprimidos JBIG2
- Cobertura de codificación nativa: regiones genéricas MMR, regiones genéricas MQ, diccionarios de símbolos y regiones de texto aritméticos y de estándar-Huffman, símbolos de refinement, símbolos agregados, instancias de texto refinadas, contextos aritméticos retenidos y tablas de referencia de forma larga acotadas
- Reutilización acotada de contextos: los bancos de probabilidad genéricos y de refinement se retienen con tamaños conscientes de la plantilla, se aíslan entre dependencias de fan-out y se rechazan cuando su origen o plantilla es incompatible
- Procesado de streams: manejo eficiente de streams de datos JBIG2
- Soporte de diccionario global: diccionarios de símbolos compartidos y encadenados multinivel con identificadores de segmento de uno, dos o cuatro bytes
- Codificador de lotes entre páginas:
THPDFJBIG2Encoder.EncodePagesToByteArrays entrena sobre el lote completo y devuelve un stream de página por entrada más datos globales compartidos
- Contrato de lote:
TJBIG2BatchPage describe una página empaquetada, TJBIG2BatchEncodeBackend identifica la implementación seleccionada y TJBIG2BatchEncodeCallback define las integraciones de lote externas
- Integración con documentos:
THotPDF.AddJBIG2ImageBatch y THotPDF.AddJBIG2BitmapBatch codifican antes de mutar el grafo PDF, adjuntan un stream /JBIG2Globals compartido y devuelven índices de imagen en orden de entrada
- Telemetría de lote:
TJBIG2BatchEncodeStatistics informa del backend seleccionado, tamaños de entrada y salida, recuento de símbolos nativos y rechazos por presupuesto
- Recuperación de backend:
HPDFJBIG2EncRegisterBackends restaura ambos callbacks de codificador integrados después de limpiar las sobrescrituras temporales de la aplicación
- HPDFJBIG2SplitSymbolDictionaryGlobals: separa un stream incrustado secuencial en diccionarios globales y segmentos de imagen de página preservando las cabeceras de dependencia de forma larga
- Decodificación de región visible:
THPDFJBIG2Decoder.LoadRegionFromByteArray asigna solo la ventana solicitada, resuelve sus dependencias transitivas de diccionario, compone las regiones de página que se cruzan con recorte y omite las regiones independientes fuera de ventana antes de la decodificación de entropía
- Telemetría de decodificación de región:
LastRegionDecodeStats informa de recuentos de regiones decodificadas y omitidas más píxeles de origen decodificados, mientras UsedIncrementalRegionDecode distingue la ruta de ventana nativa del fallback de decodificación completa
- Acceso por scanlines: acceso a datos fila a fila para un procesado eficiente en memoria
Ejemplo de uso
// 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 codificador y backends
- THotPDF.JBIG2Options: el
THPDFJBIG2Options del documento, que AddImage(..., icJBIG2) convierte en TJBIG2EncodeOptions. Sus valores por defecto van bien para escaneos: Lossless=True, LossyLevel=5, RemoveIsolatedBlackPixels=True y BlackDotSize=3
- Eliminación de motas: mientras
RemoveIsolatedBlackPixels es True, los componentes conexos negros cuyo ancho y alto son menores que BlackDotSize se limpian antes de codificar, así que los valores por defecto eliminan motas de 2 x 2 píxeles o menores. Póngalo a False cuando la salida deba coincidir píxel a píxel con el bitmap
- Elección de codificador:
UseExternalEncoder (True por defecto) usa el codificador aritmético de alto rendimiento registrado; si 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 eliminación de motas
- Elección de decodificador:
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
- Backends personalizados:
RegisterJBIG2EncoderBackend y RegisterJBIG2DecoderBackend instalan callbacks de la aplicación, IsJBIG2EncoderBackendAvailable y IsJBIG2DecoderBackendAvailable los informan y ClearJBIG2Backends los elimina
Referencia de clases
THPDFJBIG2Decoder
- LoadFromByteArray: carga de datos JBIG2 desde un byte array; devuelve False cuando los datos están incompletos o no son soportados
- GetScanline: obtención de datos de una scanline concreta
- Width/Height: propiedades de dimensiones de la imagen
Optimización de rendimiento
- Un corpus fijo de escaneos 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 completa en 11 ms en lugar de 53 ms en Win64 y 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áginas codificadas repetidas se cachean para extracción por lotes en tiempo constante
- Procesado por scanlines eficiente en memoria
- Optimizado para el manejo de documentos grandes
- Huella de memoria mínima durante la descompresión
Conformidad con estándares
- Conformidad con el estándar ITU-T T.88
- Soporte del estándar ISO/IEC 14492
- Image XObjects 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 entre plataformas
Véase también
|