Soporte mejorado de compresión ZLib

Descripción general

HotPDF ahora incluye un soporte integral de compresión compatible con ZLib respaldado por zlib-ng incluido para flujos y contenido PDF`r`n La API compatible con zlib ofrece compresión deflate/inflate eficiente, muy usada en documentos PDF para`r`n operaciones del filtro FlateDecode y compresión general de datos

Funciones principales

  • API compatible con ZLib respaldada por zlib-ng incluido
  • Compatibilidad con parámetros PDF FlateDecode
  • Compresión y descompresión basadas en flujos
  • Manejo de errores y capacidades de depuración mejoradas
  • Procesamiento eficiente en memoria para flujos de datos grandes
  • Puente de compresión de imágenes de una sola pasada para Win64 con seguridad de ABI de longitud de zlib-ng
  • Win64x y despacho SIMD en tiempo de ejecución de zlib-ng para MSVC Win64 con alternativas genéricas
  • Puente de asignación C alineado a 32 bytes para buffers nativos compatibles con SIMD
  • Integración de biblioteca C multiplataforma
  • Varios niveles de compresión (ninguno, más rápido, predeterminado, máximo)

Implementación técnica

El soporte mejorado de ZLib se implementa mediante la unidad HPDFZLib.pas, que ofrece:

  • API completa de ZLib: Implementación total de las funciones de ZLib
  • Clases de flujo: TCustomZStream y clases derivadas para procesamiento de flujos
  • Integración PDF: TPDFFlateParms para parámetros específicos de PDF
  • Funciones mejoradas: InflateStr, InflateStrParms para un uso simplificado

Los conjuntos de objetos de zlib-ng de 64 bits incluyen rutas SSE2, SSSE3, SSE4.1, SSE4.2, PCLMULQDQ y AVX2 seleccionadas en tiempo de ejecución. Win32 usa el conjunto genérico de objetos de zlib-ng para seguir siendo compatible con la cadena de herramientas OMF bcc32c, mientras que Win32 JPEG/TIFF permanecen en el bcc32 clásico

Cobertura de regresión

El backend Flate de 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 Delphi DUnitX en Win32 y 20 en Win64, además de 17 pruebas GoogleTest de C++Builder en Win32 y 17 en Win64x. Las reconstrucciones de objetos nativos también pasan desde salidas limpias: 206 objetos Win32, 205 objetos Win64x y 206 objetos MSVC Win64. Los flujos de trabajo cubiertos incluyen compresión de flujos de página, compresión de fuentes incrustadas y mapas ToUnicode CMap, flujos de imágenes Flate, colocación estándar de imágenes JPEG, importación TIFF, salida con muchas barras, escenarios de copia/fusión/edición y PDF generados por los demos

Niveles de compresión

  • Z_NO_COMPRESSION (0): Sin compresión
  • Z_BEST_SPEED (1): Compresión más rápida
  • Z_BEST_COMPRESSION (9): Compresión máxima
  • Z_DEFAULT_COMPRESSION (-1): equilibrio predeterminado entre velocidad y compresión

Ejemplos de uso

Compresión y descompresión básicas de cadenas


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


// 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 de bajo nivel de ZLib


// 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: Cantidad de componentes de color
  • BitsPerComponent: Bits por componente de color
  • Columns: Cantidad de muestras por fila
  • ExpandedTo8Bit: Si expandir a componentes de 8 bits
  • ColorSpace: Identificador del espacio de color

Funciones mejoradas

  • Administración de memoria: asignación y liberación optimizadas de memoria
  • Manejo de errores: comprobación y reporte exhaustivos de errores
  • Compatibilidad de depuración: salida de depuración opcional para solucionar problemas
  • Optimización de rendimiento: algoritmos de compresión altamente optimizados
  • Integración de flujos: integración fluida con las clases de flujo de Delphi

Beneficios de rendimiento

  • Velocidades rápidas de compresión y descompresión
  • Excelentes relaciones de compresión para texto y gráficos simples
  • Bajo consumo de memoria durante el procesamiento
  • Optimizado para flujos de contenido PDF
  • Sobrecarga mínima de CPU

Cumplimiento de estándares

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

Códigos de error y manejo

  • Z_OK (0): Éxito
  • Z_STREAM_END (1): Se alcanzó el final del flujo
  • Z_NEED_DICT (2): Se requiere un diccionario
  • Z_ERRNO (-1): Error de archivo
  • Z_STREAM_ERROR (-2): Error de estado del flujo
  • 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 búfer

Véase también