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