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