LZW Compression Support

Genel bakış

HotPDF, LZWDecode filtresini kullanan eski PDF stream'lerini çözer ve bu filtrenin sık eşleştirdiği TIFF veya PNG öngörücülerini geri alabilir

Öne çıkan özellikler

  • PDF EarlyChange=1 ve EarlyChange=0 kod genişliği geçişleri
  • En anlamlı bit ve en anlamsız bit doldurma sırası
  • Kod temizleme sıfırlaması, bilgi sonu ve KwKwK açılımının işlenmesi
  • İkinci bir sonuç dizesi oluşturmadan doğrudan bir TStream'e çıktı
  • Yapılandırılabilir çıktı sınırları ile isteğe bağlı katı başlangıç temizleme ve bilgi sonu denetimleri
  • Bileşen başına 1, 2, 4, 8 veya 16 bitta TIFF Predictor 2
  • PNG None, Sub, Up, Average ve Paeth satır filtreleri
  • Kod genişlikleri, sözlük büyümesi, sıfırlamalar, açılımlar ve çıktı baytları için çözüm başına istatistikler

Türler

  • TPDFLZWDecompressor, yeniden kullanılabilir çözücü sınıfıdır
  • TPDFLZWCompressor, eşleşen kodlayıcı sınıfıdır
  • TPDFLZWParms, PDF öngörücü geometrisini taşır
  • TPDFLZWFillOrder, foTop veya foBottom bit sırasını seçer
  • EHPDFLZWError; bozuk girdiyi, desteklenmeyen geometriyi ve yapılandırılmış sınır hatalarını bildirir

Yapılandırma property'leri

  • FillOrder, sıkıştırılmış bit sırasını seçer
  • EarlyChange, PDF sözlük genişliği geçiş kuralını seçer ve varsayılanı True'dur
  • InitialCodeSize 2-9 arası değerleri kabul eder ve PDF için varsayılanı 9'dur
  • Küçültülmüş alfabelerde sıkıştırılmamış her bayt, 1 shl (InitialCodeSize - 1)'den küçük olmalıdır; bir bayt bu aralığın dışındaysa sıkıştırma, çıktı yazmadan önce EHPDFLZWError fırlatır
  • MaxOutputBytes, yapılandırılan sınır aşılmadan aşırı açılımı durdurur; sıfır sınırsız demektir
  • RequireInitialClear, ilk kodun sözlüğü sıfırlamasını zorunlu kılar
  • RequireEndOfInformation, sonlandırıcısıyla bitmeyen bir stream'i reddeder

Metotlar

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;
  • Geçersiz girdide Decompress EHPDFLZWError fırlatır
  • TryDecompress False döndürür ve nedeni LastError üzerinden ortaya koyar
  • DecompressToStream ve DecompressStream, yazılan çözülmüş bayt sayısını döndürür
  • DecompressStream güncel girdi konumundan okur ve stream konumlanabilirse varsayılan olarak o konumu geri yükler

Temel LZW sıkıştırmayı açma

TPDFLZWCompressor.CompressToStream ve CompressStream, yazılan kodlanmış bayt sayısını döndürür; boş girdi için temizleme kodu ve bilgi sonu kodu da buna dahildir ve varsayılan PDF yapılandırması boş girdi için 3 bayt yazar

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;

Stream çıktısı ve tanılama

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;

Öngörücü parametreleri

  • Predictor=1, çözülmüş baytları değiştirmeden döndürür
  • Predictor=2, TIFF yatay farklılaştırmayı geri alır
  • Predictor=10..15, her satırın başında saklanan PNG filtre etiketini geri alır
  • Colors, BitsPerComponent ve Columns kesin satır geometrisini tanımlar
  • ExpandedTo8Bit ve ColorSpace, kaynak uyumluluğu için kullanılabilir kalır

Çözme istatistikleri

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

Hata işleme

  • Sözlükteki bir sonraki girdiyi aşan kodlar reddedilir
  • Bozuk önek zincirleri ve geçersiz ilk kod reddedilir
  • RequireEndOfInformation etkinken kırpılmış girdi reddedilir
  • Çıktı açılımı, her ifade yazılmadan önce denetlenir
  • Öngörücü satırları eksiksiz olmalı ve geçerli bir geometri ile PNG satır etiketi kullanmalıdır

Ayrıca bakın