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