Supporto compressione LZW Supporto compressione LZW Supporto compressione LZW Supporto compressione LZW Supporto compressione LZW Supporto compressione LZW Supporto compressione LZW Supporto compressione LZW

Supporto compressione LZW

Panoramica

HotPDF decodifica gli stream PDF legacy che usano il LZWDecode e può invertire i predittori TIFF o PNG comunemente abbinati a quel filtro

Caratteristiche principali

  • PDF EarlyChange=1 e EarlyChange=0 transizioni di larghezza di codice
  • Ordine di riempimento bit più significativo e bit meno significativo
  • Reset clear-code, fine-informazione, e KwKwK gestione dell'espansione
  • Output diretto a un TStream senza costruire una seconda stringa risultato
  • Limiti di output configurabili e controlli facoltativi rigorosi di clear iniziale e fine-informazione
  • TIFF Predictor 2 a 1, 2, 4, 8 o 16 bit per componente
  • filtri di riga PNG None, Sub, Up, Average e Paeth
  • Statistiche per decodifica su larghezze di codice, crescita del dizionario, reset, espansioni e byte di output

Types

  • TPDFLZWDecompressor è la classe decoder riutilizzabile
  • TPDFLZWCompressor è la classe encoder corrispondente
  • TPDFLZWParms riporta la geometria del predittore PDF
  • TPDFLZWFillOrder selects foTop oppure foBottom ordine dei bit
  • EHPDFLZWError riporta input malformati, geometrie non supportate e fallimenti dei limiti configurati

Proprietà di configurazione

  • FillOrder seleziona l'ordine dei bit compressi
  • EarlyChange seleziona la regola di transizione della larghezza del dizionario PDF e il predefinito è True
  • InitialCodeSize accetta valori da 2 a 9 e il predefinito è 9 per il PDF
  • Per alfabeti ridotti, ogni byte non compresso deve essere più piccolo di 1 shl (InitialCodeSize - 1); la compressione solleva EHPDFLZWError prima di scrivere l'output se un byte è fuori da quell'intervallo
  • MaxOutputBytes ferma l'espansione eccessiva prima che venga superato il limite configurato, con zero che significa illimitato
  • RequireInitialClear richiede che il primo codice reimposti il dizionario
  • RequireEndOfInformation rifiuta uno stream che termina senza il suo terminatore

Metodi

function Decompress(const Input: AnsiString): AnsiString; overload;
function Decompress(const Input: AnsiString;
  Parms: TPDFLZWParms): AnsiString; overload;
function TryDecompress(const Input: AnsiString;
  out Output: AnsiString): Boolean; overload;
function TryDecompress(const Input: AnsiString; Parms: TPDFLZWParms;
  out Output: AnsiString): Boolean; overload;
function DecompressToStream(const Input: AnsiString;
  OutputStream: TStream): Int64;
function DecompressStream(InputStream, OutputStream: TStream;
  RestoreInputPosition: Boolean = True): Int64;
  • Decompress raises EHPDFLZWError su input non valido
  • TryDecompress returns False ed espone il motivo tramite LastError
  • DecompressToStream e DecompressStream restituiscono il numero di byte decodificati scritti
  • DecompressStream legge dalla posizione di input corrente e ripristina quella posizione per impostazione predefinita quando lo stream è riposizionabile

Decompressione LZW di base

TPDFLZWCompressor.CompressToStream e CompressStream restituiscono il numero di byte codificati scritti, incluso il clear code e il codice end-of-information per input vuoto; la configurazione PDF predefinita scrive 3 byte per un input vuoto

uses
  HPDFLZW;

procedure DecompressLZWData;
var
  Decompressor: TPDFLZWDecompressor;
  CompressedData: AnsiString;
  DecompressedData: AnsiString;
begin
  Decompressor := TPDFLZWDecompressor.Create;
  try
    Decompressor.FillOrder := foTop;
    Decompressor.EarlyChange := True;
    Decompressor.MaxOutputBytes := 64 * 1024 * 1024;
    DecompressedData := Decompressor.Decompress(CompressedData);
    ProcessDecompressedData(DecompressedData);
  finally
    Decompressor.Free;
  end;
end;

Output su stream e diagnostica

procedure DecodeLZWToStream(const CompressedData: AnsiString;
  Destination: TStream);
var
  Decompressor: TPDFLZWDecompressor;
begin
  Decompressor := TPDFLZWDecompressor.Create;
  try
    Decompressor.RequireInitialClear := True;
    Decompressor.RequireEndOfInformation := True;
    Decompressor.DecompressToStream(CompressedData, Destination);
    LogDecodeStatistics(
      Decompressor.CodesRead,
      Decompressor.PeakCodeSize,
      Decompressor.PeakDictionarySize,
      Decompressor.OutputBytes);
  finally
    Decompressor.Free;
  end;
end;

Parametri dei predittori

  • Predictor=1 restituisce i byte decompressi invariati
  • Predictor=2 inverte la differenziazione orizzontale TIFF
  • Predictor=10..15 inverte il tag filtro PNG memorizzato all'inizio di ogni riga
  • Colors, BitsPerComponent e Columns definiscono la geometria esatta delle righe
  • ExpandedTo8Bit e ColorSpace restano disponibili per compatibilità del sorgente

Statistiche di decodifica

  • CodesRead, ClearCodesRead e DictionaryAdds
  • KwKwKExpansions, PeakCodeSize e PeakDictionarySize
  • OutputBytes e EndedWithEndOfInformation

Gestione degli errori

  • I codici oltre la prossima voce del dizionario vengono rifiutati
  • Le catene di prefissi interrotte e un primo codice non valido vengono rifiutate
  • L'input troncato viene rifiutato quando RequireEndOfInformation è abilitato
  • L'espansione dell'output viene verificata prima di emettere ogni frase
  • Le righe del predittore devono essere complete e usare una geometria e un tag di riga PNG validi

Vedi anche: