Enhanced ZLib Compression Support

Visão geral

O HotPDF agora inclui suporte abrangente de compressão compatível com ZLib, respaldado pelo zlib-ng empacotado, para streams e conteúdo PDF. A API compatível com zlib fornece compressão deflate/inflate eficiente, amplamente usada em documentos PDF para operações do filtro FlateDecode e compressão geral de dados.

Key Features

  • API compatível com ZLib respaldada pelo zlib-ng empacotado
  • Suporte a parâmetros FlateDecode do PDF
  • Compressão e descompressão baseadas em stream
  • Tratamento de erros e capacidades de depuração aprimorados
  • Processamento eficiente em memória para streams de dados grandes
  • Bridge de compressão de imagem one-shot no Win64 para segurança de ABI de comprimento do zlib-ng
  • Despacho SIMD em runtime do zlib-ng no Win64x e no MSVC Win64 de diagnóstico, com fallbacks genéricos
  • Bridge de alocação C alinhada a 32 bytes para buffers nativos SIMD-friendly
  • Integração de bibliotecas C entre plataformas
  • Múltiplos níveis de compressão (nenhum, mais rápido, padrão, máximo)

Technical Implementation

O suporte avançado a ZLib é implementado pela unit HPDFZLib.pas, que fornece:

  • Complete ZLib API: Implementação completa das funções ZLib
  • Stream Classes: TCustomZStream e classes derivadas para processamento em stream
  • PDF Integration: TPDFFlateParms para parâmetros específicos do PDF
  • Enhanced Functions: InflateStr, InflateStrParms para uso simplificado

Os conjuntos de objetos zlib-ng de 64 bits incluem caminhos SSE2, SSSE3, SSE4.1, SSE4.2, PCLMULQDQ e AVX2 selecionados em runtime. O Win32 usa o conjunto genérico de objetos zlib-ng para permanecer compatível com a toolchain OMF do bcc32c, enquanto os objetos JPEG/TIFF de Win32 seguem no bcc32 clássico.

Regression Coverage

O backend Flate do zlib-ng é coberto pelas suítes automatizadas de regressão Delphi e C++Builder. O conjunto atual de validação passa em 20 testes Delphi DUnitX no Win32 e 20 no Win64, mais 17 testes GoogleTest do C++Builder no Win32 e 17 no Win64x. Os rebuilds de objetos nativos também passam a partir de saídas limpas: 206 objetos Win32, 205 objetos Win64x e 206 objetos MSVC Win64. Os fluxos cobertos incluem compressão de streams de páginas, compressão de fontes embutidas e ToUnicode CMaps, streams de imagens Flate, posicionamento de imagens JPEG padrão, importação TIFF, saída com muitos códigos de barras, cenários de cópia/mesclagem/edição e PDFs gerados pelos demos.

Compression Levels

  • Z_NO_COMPRESSION (0): Sem compressão
  • Z_BEST_SPEED (1): Compressão mais rápida
  • Z_BEST_COMPRESSION (9): Compressão máxima
  • Z_DEFAULT_COMPRESSION (-1): Equilíbrio padrão entre velocidade e compressão

Usage Examples

Compressão/descompressão 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;
        

Compressão baseada em stream


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

FlateDecode PDF com 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;
        

Operações ZLib de baixo nível


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

PDF FlateDecode Parameters

TPDFFlateParms Structure

  • Predictor: Função de predictor (1=sem predição, 2=TIFF, 10-15=PNG)
  • Colors: Número de componentes de cor
  • BitsPerComponent: 1, 2, 4, 8 ou 16 bits por componente de cor
  • Columns: Número de amostras por linha
  • ExpandedTo8Bit: Campo de compatibilidade mantido para chamadores existentes
  • ColorSpace: Campo de compatibilidade para o identificador do espaço de cor de origem

Shared Predictor API

Adicione a unidade HPDFPredictor quando a reversão de predictors for necessária independentemente da decodificação Flate ou 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 dispara EHPDFPredictorError quando uma linha está truncada, uma tag de linha PNG está fora de 0 a 4, a geometria estoura ou o limite de saída é excedido
  • HPDFTryDecodePredictor retorna o mesmo resultado de validação sem disparar exceção e fornece uma mensagem de erro para log
  • A decodificação TIFF preserva os bits de padding não usados e aplica diferenciação horizontal por componente em profundidades packed e de 16 bits
  • A decodificação PNG usa a tag explícita de filtro no início de cada linha para valores de Predictor de 10 a 15
  • InflateStrParms aplica este decodificador compartilhado depois de ler a saída Flate real e reporta falhas de predictor como EZDecompressionError

Enhanced Features

  • Memory Management: Alocação e liberação de memória otimizadas
  • Error Handling: Checagem e report abrangentes de erros
  • Debug Support: Saída de debug opcional para diagnóstico de problemas
  • Performance Optimization: Algoritmos de compressão altamente otimizados
  • Stream Integration: Integração sem costura com as classes de stream do Delphi

Performance Benefits

  • Velocidades rápidas de compressão e descompressão
  • Excelentes razões de compressão para texto e gráficos simples
  • Pegada baixa de memória durante o processamento
  • Otimizado para content streams PDF
  • Sobrecarga mínima de CPU

Standards Compliance

  • RFC 1950 (especificação do formato ZLib)
  • RFC 1951 (algoritmo de compressão Deflate)
  • Especificação do filtro FlateDecode do PDF
  • Suporte ao algoritmo de predictor PNG
  • Suporte ao algoritmo de predictor TIFF

Códigos e tratamento de erros

  • Z_OK (0): Success
  • Z_STREAM_END (1): Fim do stream alcançado
  • Z_NEED_DICT (2): Dicionário exigido
  • Z_ERRNO (-1): Erro de arquivo
  • Z_STREAM_ERROR (-2): Erro de estado do stream
  • Z_DATA_ERROR (-3): Erro de integridade de dados
  • Z_MEM_ERROR (-4): Erro de alocação de memória
  • Z_BUF_ERROR (-5): Erro de tamanho de buffer

See Also