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