Supporto ZLib migliorato Supporto ZLib migliorato Supporto ZLib migliorato

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: