|
Prise en charge ZLib améliorée
Vue d’ensemble
HotPDF inclut désormais une prise en charge complète de la compression compatible ZLib, basée sur zlib-ng intégré, pour les flux PDF et le contenu
L'API compatible ZLib fournit une compression et une décompression deflate efficaces, largement utilisées dans les documents PDF pour
les opérations du filtre FlateDecode et la compression générale des données
Principales fonctionnalités
- API compatible ZLib basée sur zlib-ng intégré
- Prise en charge des paramètres PDF FlateDecode
- Compression et décompression fondées sur les flux
- Gestion des erreurs et capacités de débogage améliorées
- Traitement économe en mémoire pour les gros flux de données
- Pont Win64 de compression d’image one-shot pour la sécurité ABI des longueurs zlib-ng
- Dispatch SIMD d’exécution zlib-ng Win64x et MSVC Win64 de diagnostic avec repli générique
- Pont d’allocation C aligné sur 32 octets pour des tampons natifs favorables au SIMD
- Intégration de bibliothèques C multiplateforme
- Niveaux de compression multiples (aucune, plus rapide, par défaut, maximum)
Implémentation technique
La prise en charge ZLib améliorée est implémentée via l'unité HPDFZLib.pas, qui fournit :
- API ZLib complète: implémentation complète des fonctions ZLib
- Classes de flux: TCustomZStream et classes dérivées pour le traitement des flux
- Intégration PDF: TPDFFlateParms pour les paramètres spécifiques au PDF
- Fonctions améliorées: InflateStr, InflateStrParms pour une utilisation simplifiée
Les jeux d’objets zlib-ng 64 bits incluent des chemins SSE2, SSSE3, SSE4.1, SSE4.2, PCLMULQDQ et AVX2 sélectionnés à l’exécution. Win32 utilise le jeu d’objets zlib-ng générique pour rester compatible avec la chaîne OMF bcc32c, tandis que les objets JPEG/TIFF Win32 restent sur le bcc32 classique
Couverture de régression
Le backend Flate zlib-ng est couvert par les suites de régression automatisées Delphi et C++Builder. L’ensemble de validation actuel passe 20 tests Delphi DUnitX sur Win32 et 20 sur Win64, plus 17 tests GoogleTest C++Builder sur Win32 et 17 sur Win64x. Les recompilations des objets natifs passent aussi à partir de sorties propres: 206 objets Win32, 205 objets Win64x et 206 objets MSVC Win64. Les flux de travail couverts incluent la compression de flux de page, la compression des polices embarquées et des CMap ToUnicode, les flux image Flate, le placement standard d’images JPEG, l’import TIFF, les sorties riches en codes-barres, les scénarios de copie / fusion / édition et les PDF générés par les démos
Niveaux de compression
- Z_NO_COMPRESSION (0): Aucune compression
- Z_BEST_SPEED (1): Compression la plus rapide
- Z_BEST_COMPRESSION (9): Compression maximale
- Z_DEFAULT_COMPRESSION (-1): Équilibre par défaut entre vitesse et compression
Exemples d'utilisation
Compression / décompression de chaîne de base
// Delphi example - Basic string inflation
function DecompressString(const CompressedData: AnsiString): AnsiString;
begin
// Simple decompression
Result := InflateStr(CompressedData);
// With debug output enabled
Result := InflateStr(CompressedData, True);
end;
Compression basée sur les flux
// Delphi example - Stream-based decompression
procedure DecompressStream(InStream, OutStream: TStream);
begin
// Decompress from input stream to output stream
PLZDecompressStream(InStream, OutStream);
// For raw deflate data (without ZLib headers)
PLZDecompressStreamRaw(InStream, OutStream);
end;
FlateDecode PDF avec paramètres
// Delphi example - PDF FlateDecode with parameters
function DecompressPDFStream(const CompressedData: AnsiString;
Predictor, Colors, BitsPerComponent, Columns: Integer): AnsiString;
var
Parms: TPDFFlateParms;
begin
// Configure PDF parameters
Parms.Predictor := Predictor;
Parms.Colors := Colors;
Parms.BitsPerComponent := BitsPerComponent;
Parms.Columns := Columns;
Parms.ExpandedTo8Bit := True;
Parms.ColorSpace := 'DeviceRGB';
// Decompress with PDF parameters
Result := InflateStrParms(CompressedData, Parms);
end;
Opérations ZLib de bas niveau
// Delphi example - Low-level ZLib operations
procedure CompressData;
var
strm: z_stream;
ret: Integer;
input: AnsiString;
output: AnsiString;
begin
input := 'Data to compress';
SetLength(output, Length(input) * 2);
// Initialize stream
FillChar(strm, SizeOf(strm), 0);
ret := deflateInit(strm, Z_DEFAULT_COMPRESSION);
if ret = Z_OK then
try
// Set input
strm.next_in := PByte(PAnsiChar(input));
strm.avail_in := Length(input);
// Set output
strm.next_out := PByte(PAnsiChar(output));
strm.avail_out := Length(output);
// Compress
ret := deflate(strm, Z_FINISH);
if ret = Z_STREAM_END then
begin
// Compression successful
SetLength(output, Length(output) - strm.avail_out);
end;
finally
deflateEnd(strm);
end;
end;
Paramètres FlateDecode PDF
Structure TPDFFlateParms
- Predictor: Fonction de prédiction (1 = aucune prédiction, 2 = TIFF, 10-15 = PNG)
- Colors: Nombre de composantes couleur
- BitsPerComponent: Bits par composante couleur
- Columns: Nombre d'échantillons par ligne
- ExpandedTo8Bit: Indique s'il faut étendre à des composantes 8 bits
- ColorSpace: Identifiant de l'espace colorimétrique
Fonctionnalités améliorées
- Gestion de la mémoire: Allocation et désallocation mémoire optimisées
- Gestion des erreurs: Vérification et signalement complets des erreurs
- Prise en charge du débogage: Sortie de débogage optionnelle pour le diagnostic
- Optimisation des performances: Algorithmes de compression hautement optimisés
- Intégration des flux: Intégration transparente avec les classes de flux Delphi
Bénéfices en performance
- Vitesses de compression et de décompression rapides
- Excellents taux de compression pour le texte et les graphiques simples
- Faible empreinte mémoire pendant le traitement
- Optimisé pour les flux de contenu PDF
- Charge CPU minimale
Conformité aux normes
- RFC 1950 (spécification du format ZLib)
- RFC 1951 (algorithme de compression Deflate)
- Spécification du filtre PDF FlateDecode
- Prise en charge de l'algorithme de prédiction PNG
- Prise en charge de l'algorithme de prédiction TIFF
Codes d'erreur et gestion
- Z_OK (0): Succès
- Z_STREAM_END (1): Fin du flux atteinte
- Z_NEED_DICT (2): Dictionnaire requis
- Z_ERRNO (-1): Erreur de fichier
- Z_STREAM_ERROR (-2): Erreur d'état du flux
- Z_DATA_ERROR (-3): Erreur d'intégrité des données
- Z_MEM_ERROR (-4): Erreur d'allocation mémoire
- Z_BUF_ERROR (-5): Erreur de taille de tampon
Voir aussi
|