|
LZW-compressieondersteuning
Overzicht
HotPDF decodeert legacy-PDF-streams die het LZWDecode-filter gebruiken en kan de TIFF- of PNG-predictors terugrekenen die doorgaans bij dat filter horen
Belangrijkste kenmerken
- PDF-codewijdetransities met
EarlyChange=1 en EarlyChange=0
- Fill-order van most-significant-bit en least-significant-bit
- Afhandeling van clear-codereset, end-of-information en
KwKwK-expansie
- Rechte uitvoer naar een
TStream zonder een tweede resultstring op te bouwen
- Configureerbare uitvoerlimieten en optionele strenge controles op initial-clear en end-of-information
- TIFF Predictor 2 met 1, 2, 4, 8 of 16 bits per component
- PNG-rijfilters None, Sub, Up, Average en Paeth
- Statistieken per decode voor codewijden, woordenboekgroei, resets, expansies en uitvoerbytes
Types
TPDFLZWDecompressor is de herbruikbare decoderklasse
TPDFLZWCompressor is de bijbehorende encoderklasse
TPDFLZWParms bevat de PDF-predictorgeometrie
TPDFLZWFillOrder kiest de bitvolgorde foTop of foBottom
EHPDFLZWError rapporteert misvormde invoer, niet-ondersteunde geometrie en overtreden configuratielimieten
Configuration Properties
FillOrder kiest de bitvolgorde van de gecomprimeerde data
EarlyChange kiest de PDF-transitieregel voor woordenboekbreedte en staat standaard op True
InitialCodeSize accepteert waarden van 2 tot en met 9 en staat standaard op 9 voor PDF
- Voor verkleinde alfabetten moet elke ongecomprimeerde byte kleiner zijn dan
1 shl (InitialCodeSize - 1); compressie geeft EHPDFLZWError voordat er uitvoer wordt weggeschreven wanneer een byte buiten dat bereik valt
MaxOutputBytes stopt overmatige expansie voordat de ingestelde limiet wordt gepasseerd; nul betekent onbeperkt
RequireInitialClear eist dat de eerste code het woordenboek reset
RequireEndOfInformation verwerpt een stream die zonder terminator eindigt
Methods
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 geeft EHPDFLZWError bij ongeldige invoer
TryDecompress geeft False terug en maakt de reden beschikbaar via LastError
DecompressToStream en DecompressStream geven het aantal gedecodeerde, geschreven bytes terug
DecompressStream leest vanaf de huidige invoerpositie en herstelt die positie standaard wanneer de stream seekable is
Basis-LZW-decompressie
TPDFLZWCompressor.CompressToStream en CompressStream geven het aantal gecodeerde, geschreven bytes terug, inclusief de clear-code en de end-of-information-code bij lege invoer; de default PDF-configuratie schrijft 3 bytes voor lege invoer
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;
Streamuitvoer en diagnostiek
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;
Predictor Parameters
Predictor=1 geeft de gedecomprimeerde bytes ongewijzigd terug
Predictor=2 rekent TIFF horizontale differentiatie terug
Predictor=10..15 rekent de PNG-filtertag terug die aan het begin van elke rij staat
Colors, BitsPerComponent en Columns definiƫren de exacte rijgeometrie
ExpandedTo8Bit en ColorSpace blijven beschikbaar voor broncompatibiliteit
Decode Statistics
CodesRead, ClearCodesRead en DictionaryAdds
KwKwKExpansions, PeakCodeSize en PeakDictionarySize
OutputBytes en EndedWithEndOfInformation
Error Handling
- Codes voorbij de volgende woordenboekinvoer worden geweigerd
- Kapotte prefixketens en een ongeldige eerste code worden geweigerd
- Afgekapte invoer wordt geweigerd wanneer
RequireEndOfInformation aanstaat
- De uitvoerexpansie wordt gecontroleerd voordat elke phrase wordt uitgegeven
- Predictorrijen moeten compleet zijn en een geldige geometrie en PNG-rijtag gebruiken
Zie ook
|