LZW-komprimeringsstöd

Översikt

HotPDF avkodar äldre PDF-strömmar som använder LZWDecode -filtret och kan intekra TIFF- eller PNG-prediktorerna som vanligtvis paras med det filtret

Huvudfunktioner

  • PDF EarlyChange=1 och EarlyChange=0 kodbreddsövergångar
  • IFyllnadsordning med mest eller minst signifikant bit först
  • Rensning via clear-kod, end-of-information och KwKwK -expansionshantering
  • Direkt utdata till en TStream utan att bygga en andra resultatsträng
  • Konfigurerbara utdatagränser samt valfria strikta kontroller av initial clear och end-of-information
  • TIFF Predictor 2 med 1, 2, 4, 8 eller 16 bitar per komponent
  • PNG-radfilter: None, Sub, Up, Average och Paeth
  • Statistik per avkodning för kodbredder, ordlistetillväxt, återställningar, expansioner och utdatabyte

Types

  • TPDFLZWDecompressor är den återanvändbara avkodarklassen
  • TPDFLZWCompressor är den matchande kodarklassen
  • TPDFLZWParms bär PDF:s prediktorgeometri
  • TPDFLZWFillOrder väljer foTop eller foBottom bitordning
  • EHPDFLZWError rapporterar felaktig indata, geometri som inte stöds och brott mot konfigurerade gränser

Konfigurationsegenskaper

  • FillOrder väljer den komprimerade bitordningen
  • EarlyChange väljer PDF:s regel för övergång av ordlistebredd och har standardvärdet True
  • InitialCodeSize accepterar värden från 2 till 9 och har 9 som standard för PDF
  • För reducerade alfabet måste varje okomprimerad byte vara mindre än 1 shl (InitialCodeSize - 1); komprimeringen kastar EHPDFLZWError innan utdata skrivs om en byte ligger utanför det intervallet
  • MaxOutputBytes stoppar överdriven expansion innan den konfigurerade gränsen överskrids, där noll betyder obegränsat
  • RequireInitialClear kräver att den första koden rensar ordlistan
  • RequireEndOfInformation avvisar en ström som slutar utan sin terminator

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 kastar EHPDFLZWError vid ogiltig indata
  • TryDecompress returnerar False och exponerar orsaken via LastError
  • DecompressToStream och DecompressStream returnerar antalet skrivna avkodade byte
  • DecompressStream läser från den aktuella inmatningspositionen och återställer den positionen som standard när strömmen är sökbar

Grundläggande LZW-dekomprimering

TPDFLZWCompressor.CompressToStream och CompressStream returnerar antalet skrivna kodade byte, inklusive clear-kod och end-of-information-kod för tom indata; standardkonfigurationen för PDF skriver 3 byte för tom indata

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;

Strömutdata och diagnostik

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;

Prediktorparametrar

  • Predictor=1 returnerar de avkodade bytena oförändrade
  • Predictor=2 inverterar TIFF:s horisontella differensberäkning
  • Predictor=10..15 inverterar PNG-radtaggen som lagrats i början av varje rad
  • Colors, BitsPerComponent och Columns definierar den exakta radgeometrin
  • ExpandedTo8Bit och ColorSpace förblir tillgängliga för källkompatibilitet

Avkodningsstatistik

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

Felhantering

  • Koder utöver nästa ordlistepost avvisas
  • Brutna prefixkedjor och en ogiltig första kod avvisas
  • Avhuggen indata avvisas när RequireEndOfInformation är aktiverad
  • Utdataexpansionen kontrolleras innan varje fras emitteras
  • Prediktorrader måste vara kompletta och använda giltig geometri och PNG-radtagg

Se även