Prise en charge de la compression LZW

Vue d’ensemble

HotPDF décode les flux PDF historiques utilisant le filtre LZWDecode et sait inverser les prédicteurs TIFF ou PNG couramment associés à ce filtre

Fonctionnalités clés

  • Transitions de largeur de code EarlyChange=1 et EarlyChange=0 du PDF
  • Prise en charge complète de la décompression LZW pour les flux PDF
  • Réinitialisation par code de clarté, fin d’information et gestion de l’expansion KwKwK
  • Sortie directe vers un TStream sans construire une seconde chaîne résultat
  • Plusieurs options d’ordre de remplissage (de haut en bas, de bas en haut)
  • Prise en charge du changement de code anticipé pour la compatibilité
  • Traitement des flux économe en mémoire
  • Intégration des paramètres PDF (Predictor, Colors, BitsPerComponent, Columns)

Implémentation technique

  • TPDFLZWDecompressor est la classe de décodage réutilisable
  • TPDFLZWCompressor est la classe d'encodage correspondante
  • TPDFLZWParms porte la géométrie du prédicteur PDF
  • TPDFLZWFillOrder choisit l’ordre des bits foTop ou foBottom
  • EHPDFLZWError signale les entrées malformées, les géométries non prises en charge et les dépassements des limites configurées

Méthodes :

  • FillOrder sélectionne l’ordre des bits compressés
  • EarlyChange sélectionne la règle de transition de largeur de dictionnaire PDF et vaut True par défaut
  • InitialCodeSize accepte des valeurs de 2 à 9 et vaut 9 par défaut pour le PDF
  • Pour les alphabets réduits, chaque octet non compressé doit être inférieur à 1 shl (InitialCodeSize - 1) ; la compression lève EHPDFLZWError avant toute écriture de sortie si un octet est hors de cette plage
  • MaxOutputBytes arrête une expansion excessive avant que la limite configurée ne soit franchie, zéro signifiant illimité
  • RequireInitialClear exige que le premier code réinitialise le dictionnaire
  • RequireEndOfInformation rejette un flux qui se termine sans son terminateur

Décompression LZW de base


// Delphi example - Basic LZW decompression
procedure DecompressLZWData;
var
  Decompressor: TPDFLZWDecompressor;
  CompressedData: AnsiString;
  out Output: AnsiString): Boolean; overload;
function DecompressToStream(const Input: AnsiString;
  OutputStream: TStream): Int64;
function DecompressStream(InputStream, OutputStream: TStream;
  RestoreInputPosition: Boolean = True): Int64;
  • Decompress lève EHPDFLZWError sur une entrée invalide
  • TryDecompress renvoie False et expose le motif via LastError
  • DecompressToStream et DecompressStream renvoient le nombre d’octets décodés écrits
  • DecompressStream lit depuis la position d’entrée courante et restaure cette position par défaut lorsque le flux est positionnable

Décompression LZW de base

TPDFLZWCompressor.CompressToStream et CompressStream renvoient le nombre d'octets encodés écrits, y compris le code de clarté et le code de fin d'information pour une entrée vide ; la configuration PDF par défaut écrit 3 octets pour une entrée vide

uses
  DecompressedData: AnsiString;
begin
  Decompressor := TPDFLZWDecompressor.Create;
  try
    // Configure decompressor
    Decompressor.FillOrder := foTop;
    Decompressor.EarlyChange := True;
    Decompressor.InitialCodeSize := 9;

    // Decompress data
    DecompressedData := Decompressor.Decompress(CompressedData);

    // Use decompressed data
    ProcessDecompressedData(DecompressedData);
  finally
    Decompressor.Free;
  end;
end;
        

Décompression LZW avancée avec paramètres PDF


// Delphi example - Advanced LZW decompression with PDF parameters
procedure DecompressLZWWithParms;
var
  Decompressor: TPDFLZWDecompressor;
  CompressedData: AnsiString;
  DecompressedData: AnsiString;
  Parms: TPDFLZWParms;
begin
  Decompressor := TPDFLZWDecompressor.Create;
  try
    // Configure PDF parameters
    Parms.Predictor := 2;           // Horizontal differencing predictor
    Parms.Colors := 3;              // RGB color space
    Parms.BitsPerComponent := 8;    // 8 bits per component
    Parms.Columns := 100;           // Image width in pixels
    Parms.ExpandedTo8Bit := True;   // Expand to 8-bit components
    Parms.ColorSpace := 'DeviceRGB';

    // Decompress with parameters
    DecompressedData := Decompressor.Decompress(CompressedData, Parms);

    // Process the decompressed image data
    ProcessImageData(DecompressedData, Parms);
  finally
    Decompressor.Free;
  end;
end;
        

Prise en charge des paramètres PDF

  • Predictor=1 renvoie les octets décompressés inchangés
  • Predictor=2 inverse la différenciation horizontale TIFF
  • Predictor=10..15 inverse le tag de filtre PNG stocké en tête de chaque ligne
  • Colors, BitsPerComponent et Columns définissent la géométrie exacte des lignes
  • ExpandedTo8Bit et ColorSpace restent disponibles pour la compatibilité source

Détails de l'algorithme

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

Caractéristiques de performance

  • Efficace en mémoire: Optimisé pour les flux de données volumineux
  • Décompression rapide: Algorithmes de décompression hautement optimisés
  • Une entrée tronquée est rejetée lorsque RequireEndOfInformation est activé
  • Performances prévisibles: Performances constantes sur différents types de données
  • Faible empreinte mémoire: Faible surcharge mémoire pendant le traitement

Cas d'utilisation courants

  • Décompression des flux de contenu PDF
  • Décompression des données d'image dans les fichiers PDF
  • Décompression des flux de texte
  • Décompression des données de formulaire
  • Décompression des flux PostScript