|
Supporto esteso compressione ZLib
Panoramica
HotPDF ora include un supporto completo di compressione compatibile ZLib basato su zlib-ng incluso nel pacchetto per gli stream e il contenuto PDF L'API compatibile zlib fornisce compressione deflate/inflate efficiente ampiamente usata nei documenti PDF per le operazioni del filtro FlateDecode e la compressione generale dei dati.
Caratteristiche principali
- API compatibile ZLib basata su zlib-ng inclusa
- supporto dei parametri PDF FlateDecode
- Compressione e decompressione basate su stream
- Gestione degli errori e capacità di debug estese
- Elaborazione efficiente in memoria per grandi stream di dati
- Ponte Win64 one-shot di compressione immagini per la sicurezza ABI delle lunghezze zlib-ng
- dispatch SIMD a runtime zlib-ng Win64x e MSVC Win64 diagnostico con fallback generici
- Ponte di allocazione C allineata a 32 byte per buffer nativi SIMD-friendly
- Integrazione con librerie C cross-platform
- Multiple compression levels (none, fastest, default, maximum)
Implementazione tecnica
Il supporto ZLib esteso è implementato tramite l'unità HPDFZLib.pas, che fornisce:
- API ZLib completa: Implementazione completa delle funzioni ZLib
- Classi stream: TCustomZStream e classi derivate per l'elaborazione a stream
- Integrazione PDF: TPDFFlateParms per i parametri specifici PDF
- Funzioni estese: InflateStr, InflateStrParms per un uso semplificato
I set di oggetti zlib-ng a 64 bit includono percorsi SSE2, SSSE3, SSE4.1, SSE4.2, PCLMULQDQ e AVX2 selezionati a runtime. Win32 usa il set di oggetti zlib-ng generico per restare compatibile con la toolchain OMF bcc32c, mentre gli oggetti JPEG/TIFF Win32 restano sul classico bcc32.
Copertura di regressione
Il backend Flate zlib-ng è coperto dalle suite di regressione automatiche Delphi e C++Builder. L'attuale set di validazione supera 20 test DUnitX Delphi su Win32 e 20 su Win64, più 17 test GoogleTest C++Builder su Win32 e 17 su Win64x. Le ricostruzioni degli oggetti nativi passano anche da output puliti: 206 oggetti Win32, 205 oggetti Win64x e 206 oggetti MSVC Win64. I flussi di lavoro coperti includono compressione degli stream di pagina, compressione di font incorporati e CMap ToUnicode, stream immagine Flate, posizionamento di immagini JPEG standard, importazione TIFF, output ricco di codici a barre, scenari di copia/fusione/modifica e PDF generati dai demo.
Livelli di compressione
- Z_NO_COMPRESSION (0): Nessuna compressione
- Z_BEST_SPEED (1): Compressione più veloce
- Z_BEST_COMPRESSION (9): Compressione massima
- Z_DEFAULT_COMPRESSION (-1): Equilibrio predefinito tra velocità e compressione
Esempi d'uso
Compressione/decompressione base di stringhe
// Esempio Delphi - Inflazione base di stringhe function DecompressString(const CompressedData: AnsiString): AnsiString; begin // Decompressione semplice Result := InflateStr(CompressedData); // Con output di debug abilitato Result := InflateStr(CompressedData, True); end;
Compressione basata su stream
// Esempio Delphi - Decompressione basata su stream procedure DecompressStream(InStream, OutStream: TStream); begin // Decompresse dallo stream di input allo stream di output PLZDecompressStream(InStream, OutStream); // Per dati deflate grezzi (senza header ZLib) PLZDecompressStreamRaw(InStream, OutStream); end;
PDF FlateDecode con parametri
// Esempio Delphi - PDF FlateDecode con parametri function DecompressPDFStream(const CompressedData: AnsiString; Predictor, Colors, BitsPerComponent, Columns: Integer): AnsiString; var Parms: TPDFFlateParms; begin // Configura i parametri PDF Parms.Predictor := Predictor; Parms.Colors := Colors; Parms.BitsPerComponent := BitsPerComponent; Parms.Columns := Columns; Parms.ExpandedTo8Bit := True; Parms.ColorSpace := 'DeviceRGB'; // Decompresse con i parametri PDF Result := InflateStrParms(CompressedData, Parms); end;
Operazioni ZLib a basso livello
// 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;
Parametri PDF FlateDecode
Struttura TPDFFlateParms
- Predictor: Predictor function (1=no prediction, 2=TIFF, 10-15=PNG)
- Colori: Numero di componenti di colore
- BitsPerComponent: 1, 2, 4, 8 o 16 bit per componente di colore
- Colonne: Numero di campioni per riga
- ExpandedTo8Bit: Campo di compatibilità mantenuto per i chiamanti esistenti
- ColorSpace: Campo di compatibilità per l'identificatore dello spazio colore sorgente
API dei predittori condivisa
Aggiungi il HPDFPredictor quando serve l'inversione del predittore indipendentemente dalla decodifica 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 raises EHPDFPredictorError quando una riga è troncata, un tag di riga PNG è fuori dall'intervallo 0-4, la geometria va in overflow o il limite di output è superato
HPDFTryDecodePredictor restituisce lo stesso risultato di validazione senza sollevare e fornisce un messaggio di errore per il log
- La decodifica TIFF preserva i bit di padding inutilizzati e applica la differenziazione orizzontale per componente alle profondità compresse e a 16 bit
- La decodifica PNG usa il tag filtro esplicito all'inizio di ogni riga per i valori del predittore da 10 a 15
InflateStrParms applica questo decoder condiviso dopo aver letto l'output Flate reale e riporta i fallimenti del predittore come EZDecompressionError
Funzionalità estese
- Gestione della memoria: Allocazione e deallocazione di memoria ottimizzate
- Gestione degli errori: Controllo e segnalazione completa degli errori
- Supporto del debug: Output di debug opzionale per la risoluzione dei problemi
- Ottimizzazione delle prestazioni: Algoritmi di compressione altamente ottimizzati
- Integrazione con gli stream: Integrazione senza attrito con le classi stream Delphi
Vantaggi di prestazione
- Veloci compressioni e decompressioni
- Eccellenti rapporti di compressione per testo e grafica semplice
- Footprint di memoria ridotto durante l'elaborazione
- Ottimizzato per i content stream PDF
- Overhead CPU minimo
Conformità agli standard
- RFC 1950 (ZLib format specification)
- RFC 1951 (Deflate compression algorithm)
- Specifica del filtro PDF FlateDecode
- supporto dell'algoritmo del predittore PNG
- supporto dell'algoritmo del predittore TIFF
Codici di errore e gestione
- Z_OK (0): Success
- Z_STREAM_END (1): End of stream reached
- Z_NEED_DICT (2): Dizionario richiesto
- Z_ERRNO (-1): Errore di file
- Z_STREAM_ERROR (-2): Errore di stato dello stream
- Z_DATA_ERROR (-3): Errore di integrità dei dati
- Z_MEM_ERROR (-4): Errore di allocazione di memoria
- Z_BUF_ERROR (-5): Errore di dimensione del buffer
Vedi anche:
|