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