|
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
|