LZW Compression Support

Visão geral

O HotPDF decodifica streams PDF legados que usam o filtro LZWDecode e pode reverter os predictors TIFF ou PNG comumente emparelhados com esse filtro

Key Features

  • Transições de largura de código EarlyChange=1 e EarlyChange=0 do PDF
  • Ordem de preenchimento bit mais significativo e bit menos significativo
  • Reset por clear code, end-of-information e tratamento de expansão KwKwK
  • Saída direta para um TStream sem construir uma segunda string de resultado
  • Limites de saída configuráveis e checagens opcionais estritas de initial-clear e end-of-information
  • TIFF Predictor 2 a 1, 2, 4, 8 ou 16 bits por componente
  • Filtros de linha PNG None, Sub, Up, Average e Paeth
  • Estatísticas por decodificação de larguras de código, crescimento do dicionário, resets, expansões e bytes de saída

Types

  • TPDFLZWDecompressor é a classe de decodificador reutilizável
  • TPDFLZWCompressor é a classe de codificador correspondente
  • TPDFLZWParms carrega a geometria de predictor do PDF
  • TPDFLZWFillOrder seleciona a ordem de bits foTop ou foBottom
  • EHPDFLZWError reporta entrada malformada, geometria não suportada e falhas de limite configurado

Configuration Properties

  • FillOrder seleciona a ordem de bits comprimida
  • EarlyChange seleciona a regra de transição de largura de dicionário do PDF e tem padrão True
  • InitialCodeSize aceita valores de 2 a 9 e tem padrão 9 para PDF
  • Para alfabetos reduzidos, todo byte descomprimido precisa ser menor que 1 shl (InitialCodeSize - 1); a compressão gera EHPDFLZWError antes de gravar saída se um byte estiver fora dessa faixa
  • MaxOutputBytes interrompe expansão excessiva antes que o limite configurado seja cruzado, com zero significando ilimitado
  • RequireInitialClear exige que o primeiro código reinicie o dicionário
  • RequireEndOfInformation rejeita um stream que termina sem o terminador dele

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 dispara EHPDFLZWError com entrada inválida
  • TryDecompress retorna False e expõe o motivo por meio de LastError
  • DecompressToStream e DecompressStream retornam o número de bytes decodificados gravados
  • DecompressStream lê da posição atual de entrada e restaura essa posição por padrão quando o stream é posicionável

Basic LZW Decompression

TPDFLZWCompressor.CompressToStream e CompressStream retornam o número de bytes codificados gravados, incluindo o clear code e o código de end-of-information para entrada vazia; a configuração padrão de PDF grava 3 bytes para uma entrada vazia

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;

Saída em stream e diagnósticos

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 retorna os bytes descomprimidos inalterados
  • Predictor=2 reverte a diferenciação horizontal do TIFF
  • Predictor=10..15 reverte a tag de filtro PNG armazenada no início de cada linha
  • Colors, BitsPerComponent e Columns definem a geometria exata da linha
  • ExpandedTo8Bit e ColorSpace permanecem disponíveis por compatibilidade de código-fonte

Decode Statistics

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

Error Handling

  • Códigos além da próxima entrada do dicionário são rejeitados
  • Cadeias de prefixos quebradas e um primeiro código inválido são rejeitados
  • Entrada truncada é rejeitada quando RequireEndOfInformation está habilitado
  • A expansão da saída é checada antes de cada frase ser emitida
  • Linhas de predictor devem estar completas e usar geometria válida e tag de linha PNG válida

See Also