Soporte mejorado de compresión ZLib

Visión general

HotPDF incluye ahora un soporte exhaustivo de compresión compatible con ZLib respaldado por zlib-ng incluido en el paquete para streams PDF y contenido. La API compatible con zlib proporciona compresión deflate/inflate eficiente, muy usada en documentos PDF para operaciones del filtro FlateDecode y compresión general de datos.

Características principales

  • API compatible con ZLib respaldada por zlib-ng incluido
  • Soporte de parámetros FlateDecode del PDF
  • Compresión y descompresión basadas en streams
  • Manejo de errores mejorado y capacidades de depuración
  • Procesamiento eficiente en memoria para streams de datos grandes
  • Puente de compresión de imagen de un solo uso en Win64 por seguridad de la ABI de longitudes de zlib-ng
  • Despacho SIMD en runtime de zlib-ng Win64x y MSVC Win64 de diagnóstico con respaldos genéricos
  • Puente de asignación C alineada a 32 bytes para búferes nativos compatibles con SIMD
  • Integración de bibliotecas C multiplataforma
  • Múltiples niveles de compresión (ninguno, el más rápido, por defecto, máximo)

Implementación técnica

El soporte mejorado de ZLib está implementado mediante la unidad HPDFZLib.pas, que proporciona:

  • Complete ZLib API: implementación completa de las funciones ZLib
  • Stream Classes: clases TCustomZStream y derivadas para procesamiento de streams
  • PDF Integration: TPDFFlateParms para parámetros específicos de PDF
  • Enhanced Functions: InflateStr e InflateStrParms para uso simplificado

Los conjuntos de objetos zlib-ng de 64 bits incluyen rutas SSE2, SSSE3, SSE4.1, SSE4.2, PCLMULQDQ y AVX2 seleccionadas en runtime. Win32 usa el conjunto de objetos zlib-ng genérico para mantener compatibilidad con la toolchain OMF de bcc32c, mientras los objetos JPEG/TIFF de Win32 siguen en el bcc32 clásico.

Cobertura de regresión

El backend Flate zlib-ng está cubierto por las suites de regresión automatizadas de Delphi y C++Builder. El conjunto de validación actual supera 20 pruebas DUnitX de Delphi en Win32 y 20 en Win64, más 17 pruebas GoogleTest de C++Builder en Win32 y 17 en Win64x. Las recompilaciones de objetos nativos también pasan desde salidas limpias: 206 objetos Win32, 205 objetos Win64x y 206 objetos MSVC Win64. Los flujos cubiertos incluyen compresión de page-streams, compresión de fuentes incrustadas y CMap ToUnicode, streams de imágenes Flate, colocación de imágenes JPEG estándar, importación TIFF, salida con muchos códigos de barras, escenarios de copia / fusión / edición y PDFs generados por las demos.

Niveles de compresión

  • Z_NO_COMPRESSION (0): sin compresión
  • Z_BEST_SPEED (1): la compresión más rápida
  • Z_BEST_COMPRESSION (9): compresión máxima
  • Z_DEFAULT_COMPRESSION (-1): equilibrio por defecto entre velocidad y compresión

Ejemplos de uso

Compresión / descompresión básica de strings


// Delphi example - Basic string inflation
function DecompressString(const CompressedData: AnsiString): AnsiString;
begin
  // Simple decompression
  Result := InflateStr(CompressedData);

  // With debug output enabled
  Result := InflateStr(CompressedData, True);
end;
        

Compresión basada en streams


// Delphi example - Stream-based decompression
procedure DecompressStream(InStream, OutStream: TStream);
begin
  // Decompress from input stream to output stream
  PLZDecompressStream(InStream, OutStream);

  // For raw deflate data (without ZLib headers)
  PLZDecompressStreamRaw(InStream, OutStream);
end;
        

PDF FlateDecode con parámetros


// Delphi example - PDF FlateDecode with parameters
function DecompressPDFStream(const CompressedData: AnsiString;
  Predictor, Colors, BitsPerComponent, Columns: Integer): AnsiString;
var
  Parms: TPDFFlateParms;
begin
  // Configure PDF parameters
  Parms.Predictor := Predictor;
  Parms.Colors := Colors;
  Parms.BitsPerComponent := BitsPerComponent;
  Parms.Columns := Columns;
  Parms.ExpandedTo8Bit := True;
  Parms.ColorSpace := 'DeviceRGB';

  // Decompress with PDF parameters
  Result := InflateStrParms(CompressedData, Parms);
end;
        

Operaciones ZLib de bajo nivel


// Delphi example - Low-level ZLib operations
procedure CompressData;
var
  strm: z_stream;
  ret: Integer;
  input: AnsiString;
  output: AnsiString;
begin
  input := 'Data to compress';
  SetLength(output, Length(input) * 2);

  // Initialize stream
  FillChar(strm, SizeOf(strm), 0);
  ret := deflateInit(strm, Z_DEFAULT_COMPRESSION);

  if ret = Z_OK then
  try
    // Set input
    strm.next_in := PByte(PAnsiChar(input));
    strm.avail_in := Length(input);

    // Set output
    strm.next_out := PByte(PAnsiChar(output));
    strm.avail_out := Length(output);

    // Compress
    ret := deflate(strm, Z_FINISH);

    if ret = Z_STREAM_END then
    begin
      // Compression successful
      SetLength(output, Length(output) - strm.avail_out);
    end;
  finally
    deflateEnd(strm);
  end;
end;
        

Parámetros PDF FlateDecode

Estructura TPDFFlateParms

  • Predictor: función predictor (1=sin predicción, 2=TIFF, 10-15=PNG)
  • Colors: número de componentes de color
  • BitsPerComponent: 1, 2, 4, 8 o 16 bits por componente de color
  • Columns: número de muestras por fila
  • ExpandedTo8Bit: campo de compatibilidad conservado para los llamadores existentes
  • ColorSpace: campo de compatibilidad para el identificador del espacio de color de origen

API del predictor compartido

Añada la unidad HPDFPredictor cuando se necesite invertir el predictor de forma independiente de la decodificación Flate o LZW

function HPDFDecodePredictor(const Data: AnsiString; Predictor, Colors,
  BitsPerComponent, Columns: Integer;
  MaxOutputBytes: Int64 = 0): AnsiString;

function HPDFTryDecodePredictor(const Data: AnsiString; Predictor, Colors,
  BitsPerComponent, Columns: Integer; MaxOutputBytes: Int64;
  out Output: AnsiString; out ErrorMessage: string): Boolean;
  • HPDFDecodePredictor lanza EHPDFPredictorError cuando una fila está truncada, una etiqueta de fila PNG está fuera de 0 a 4, la geometría desborda o se supera el límite de salida
  • HPDFTryDecodePredictor devuelve el mismo resultado de validación sin lanzar y proporciona un mensaje de error para el log
  • La decodificación TIFF preserva los bits de relleno no usados y aplica diferenciación horizontal por componente a profundidades empaquetadas y de 16 bits
  • La decodificación PNG usa la etiqueta de filtro explícita al inicio de cada fila para valores de Predictor de 10 a 15
  • InflateStrParms aplica este decodificador compartido tras leer la salida Flate real e informa de los fallos del predictor como EZDecompressionError

Características mejoradas

  • Gestión de memoria: asignación y liberación de memoria optimizadas
  • Manejo de errores: comprobación e informe de errores exhaustivos
  • Soporte de depuración: salida de depuración opcional para diagnóstico
  • Optimización de rendimiento: algoritmos de compresión altamente optimizados
  • Integración con streams: integración perfecta con las clases stream de Delphi

Ventajas de rendimiento

  • Velocidades altas de compresión y descompresión
  • Ratios de compresión excelentes para texto y gráficos simples
  • Huella de memoria baja durante el procesado
  • Optimizado para content streams PDF
  • Sobrecoste de CPU mínimo

Conformidad con estándares

  • RFC 1950 (especificación del formato ZLib)
  • RFC 1951 (algoritmo de compresión Deflate)
  • Especificación del filtro PDF FlateDecode
  • Soporte del algoritmo predictor PNG
  • Soporte del algoritmo predictor TIFF

Códigos de error y manejo

  • Z_OK (0): éxito
  • Z_STREAM_END (1): fin de stream alcanzado
  • Z_NEED_DICT (2): diccionario requerido
  • Z_ERRNO (-1): error de archivo
  • Z_STREAM_ERROR (-2): error de estado del stream
  • Z_DATA_ERROR (-3): error de integridad de datos
  • Z_MEM_ERROR (-4): error de asignación de memoria
  • Z_BUF_ERROR (-5): error de tamaño de buffer

Véase también