Erweiterte ZLib-Komprimierungsunterstützung

Übersicht

HotPDF bietet eine hochgradig optimierte zlib-ng-basierte Datenkomprimierungs-Pipeline; die neue Implementierung umfasst eine standardmäßige native SIMD-Beschleunigung unter Windows x64, eine verbesserte Brücke für plattformübergreifende C-Aufrufe, speichereffizientes Streaming und eine vollständige Abwärtskompatibilität mit der klassischen ZLib-API

Hauptmerkmale

  • ZLib-kompatible API, unterstützt durch gebündeltes zlib-ng
  • PDF FlateDecode-Parameterunterstützung
  • Stream-basierte Komprimierung und Dekomprimierung
  • Erweiterte Fehlerbehandlung und Debugging-Funktionen
  • Speichereffiziente Verarbeitung für große Datenströme
  • Win64 Einmalschritt-Bildkomprimierungsbrücke für die ABI-Sicherheit der zlib-ng-Länge
  • Win64x- und diagnostische MSVC Win64-zlib-ng-Laufzeit-SIMD-Versand mit generischen Fallbacks
  • 32-Byte ausgerichtete C-Allokationsbrücke für SIMD-freundliche native Puffer
  • Plattformübergreifende C-Bibliotheksintegration
  • Mehrere Komprimierungsstufen (keine, schnellste, Standard, maximal)

Technische Implementierung

Die verbesserte ZLib-Unterstützung ist in der Einheit HPDFZLib.pas implementiert, welche Folgendes bietet:

  • Vollständige ZLib-API:Vollständige Implementierung von ZLib-Funktionen
  • Stream-Klassen:TCustomZStream und abgeleitete Klassen für die Stream-Verarbeitung
  • PDF-Integration:TPDFFlateParms für PDF-spezifische Parameter
  • Erweiterte Funktionen:InflateStr, InflateStrParms für vereinfachte Verwendung

Die 64-Bit-zlib-ng-Objektsätze enthalten zur Laufzeit ausgewählte SSE2-, SSSE3-, SSE4.1-, SSE4.2-, PCLMULQDQ- und AVX2-Pfade; Win32 verwendet den generischen zlib-ng-Objektsatz, um mit der bcc32c OMF-Toolchain kompatibel zu bleiben, während Win32-JPEG/TIFF-Objekte auf klassischem bcc32 bleiben

Regressionsabdeckung

Das zlib-ng-Flate-Backend wird von den automatisierten Regressionssuiten für Delphi und C++Builder abgedeckt; der aktuelle Validierungssatz besteht 20 Delphi DUnitX-Tests unter Win32 und 20 unter Win64, plus 17 C++Builder GoogleTest-Tests unter Win32 und 17 unter Win64x; die nativen Objektrebuilds bestehen ebenfalls aus sauberen Ausgaben: 206 Win32-Objekte, 205 Win64x-Objekte und 206 MSVC Win64-Objekte; die abgedeckten Workflows umfassen Seitenstrom-Komprimierung, eingebettete Schriftarten- und ToUnicode-CMap-Komprimierung, Flate-Bildströme, Standard-JPEG-Bildplatzierung, TIFF-Import, barcodeintensive Ausgaben, Kopieren/Zusammenführen/Bearbeiten-Szenarien und Demo-generierte PDFs

Komprimierungsstufen

  • Z_NO_COMPRESSION (0):Keine Komprimierung
  • Z_BEST_SPEED (1):Schnellste Komprimierung
  • Z_BEST_COMPRESSION (9):Maximale Komprimierung
  • Z_DEFAULT_COMPRESSION (-1):Standard-Gleichgewicht von Geschwindigkeit und Komprimierung

Anwendungsbeispiele

Einfache String-Komprimierung/Dekomprimierung


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

Stream-basierte Komprimierung


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

PDF FlateDecode mit Parametern


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

Low-level ZLib-Operationen


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

PDF FlateDecode-Parameter

Struktur TPDFFlateParms

  • Predictor:Predictor-Funktion (1=keine Vorhersage, 2=TIFF, 10-15=PNG)
  • Colors:Anzahl der Farbkomponenten
  • BitsPerComponent:Bit pro Farbkomponente
  • Columns:Anzahl der Samples pro Zeile
  • ExpandedTo8Bit:Ob auf 8-Bit-Komponenten erweitert werden soll
  • ColorSpace:Farbraum-Identifikator

Gemeinsame Predictor-API

Fügen Sie die Unit HPDFPredictor hinzu, wenn die Predictor-Rückrechnung unabhängig von der Flate- oder LZW-Dekodierung benötigt wird

function HPDFDecodePredictor(const Data: AnsiString; Predictor, Colors,
  BitsPerComponent, Columns: Integer;
  MaxOutputBytes: Int64 = 0): AnsiString;

function HPDFTryDecodePredictor(const Data: AnsiString; Predictor, Colors,
  BitsPerComponent, Columns: Integer; MaxOutputBytes: Int64;
  out Output: AnsiString; out ErrorMessage: string): Boolean;
  • HPDFDecodePredictor löst EHPDFPredictorError aus, wenn eine Zeile abgeschnitten ist, ein PNG-Zeilen-Tag außerhalb von 0 bis 4 liegt, die Geometrie überläuft oder das Ausgabelimit überschritten wird
  • HPDFTryDecodePredictor liefert dasselbe Validierungsergebnis, ohne eine Ausnahme auszulösen, und stellt eine Fehlermeldung für das Logging bereit
  • Die TIFF-Dekodierung erhält ungenutzte Padding-Bits und wendet horizontale Differenzbildung pro Komponente bei gepackten und 16-Bit-Tiefen an
  • Die PNG-Dekodierung verwendet das explizite Filter-Tag am Anfang jeder Zeile für Predictor-Werte 10 bis 15
  • InflateStrParms wendet diesen gemeinsamen Dekodierer nach dem Lesen der tatsächlichen Flate-Ausgabe an und meldet Predictor-Fehler als EZDecompressionError

Erweiterte Features

  • Speicherverwaltung:Optimierte Speicherbelegung und -freigabe
  • Fehlerbehandlung:Umfassende Fehlerprüfung und Berichterstattung
  • Debug-Unterstützung:Optionale Debug-Ausgabe zur Fehlerbehebung
  • Leistungsoptimierung:Hochgradig optimierte Komprimierungsalgorithmen
  • Stream-Integration:Nahtlose Integration in Delphi-Stream-Klassen

Leistungsvorteile

  • Schnelle Komprimierungs- und Dekomprimierungsgeschwindigkeiten
  • Hervorragende Komprimierungsraten für Text und einfache Grafiken
  • Geringer Speicherbedarf während der Verarbeitung
  • Optimiert für PDF-Inhaltsströme
  • Minimaler CPU-Overhead

Standards-Konformität

  • RFC 1950 (ZLib-Formatspezifikation)
  • RFC 1951 (Deflate-Komprimierungsalgorithmus)
  • PDF FlateDecode-Filterspezifikation
  • Unterstützung für den PNG-Predictor-Algorithmus
  • Unterstützung für den TIFF-Predictor-Algorithmus

Fehlercodes und Handhabung

  • Z_OK (0):Erfolg
  • Z_STREAM_END (1):Ende des Datenstroms erreicht
  • Z_NEED_DICT (2):Wörterbuch erforderlich
  • Z_ERRNO (-1):Dateifehler
  • Z_STREAM_ERROR (-2):Stream-Statusfehler
  • Z_DATA_ERROR (-3):Datenintegritätsfehler
  • Z_MEM_ERROR (-4):Speicherbelegungsfehler
  • Z_BUF_ERROR (-5):Puffergrößenfehler

Siehe auch