Verbeterde ZLib-compressieondersteuning

Overzicht

HotPDF bevat nu uitgebreide ZLib-compatibele compressieondersteuning op basis van meegeleverde zlib-ng voor PDF-streams en -content. De zlib-compatibele API levert efficiënte deflate/inflate-compressie die in PDF-documenten veel wordt gebruikt voor FlateDecode-filteroperaties en algemene datacompressie.

Belangrijkste kenmerken

  • ZLib-compatibele API op basis van meegeleverde zlib-ng
  • Ondersteuning voor PDF FlateDecode-parameters
  • Streamgebaseerde compressie en decompressie
  • Verbeterde foutafhandeling en debugmogelijkheden
  • Geheugenefficiënte verwerking van grote datastreams
  • Win64 one-shot-brug voor afbeeldingscompressie voor ABI-veilige zlib-ng-lengtes
  • Runtime-SIMD-dispatch met generic fallbacks voor zlib-ng op Win64x en diagnostische MSVC Win64
  • Brug met 32-byte uitgelijnde C-allocaties voor SIMD-vriendelijke native buffers
  • Cross-platform integratie van de C-bibliotheek
  • Meerdere compressieniveaus (none, fastest, default, maximum)

Technische implementatie

De verbeterde ZLib-ondersteuning is geïmplementeerd via de HPDFZLib.pas-unit, die het volgende biedt:

  • Complete ZLib-API: Volledige implementatie van de ZLib-functies
  • Streamklassen: TCustomZStream en afgeleide klassen voor streamverwerking
  • PDF-integratie: TPDFFlateParms voor PDF-specifieke parameters
  • Uitgebreide functies: InflateStr en InflateStrParms voor eenvoudiger gebruik

De 64-bit zlib-ng-objectsets bevatten runtimegekozen SSE2-, SSSE3-, SSE4.1-, SSE4.2-, PCLMULQDQ- en AVX2-paden. Win32 gebruikt de generieke zlib-ng-objectset om compatibel te blijven met de bcc32c OMF-toolchain, terwijl Win32 JPEG/TIFF-objecten op klassieke bcc32 blijven.

Regression Coverage

De zlib-ng Flate-backend wordt gedekt door de geautomatiseerde Delphi- en C++Builder-regressiesuites. De huidige validatieset slaagt met 20 Delphi DUnitX-tests op Win32 en 20 op Win64, plus 17 C++Builder GoogleTest-tests op Win32 en 17 op Win64x. De native object-rebuilds slagen ook vanaf schone outputs: 206 Win32-objecten, 205 Win64x-objecten en 206 MSVC Win64-objecten. De gedekte workflows omvatten paginastreamcompressie, compressie van ingebedde fonts en ToUnicode CMaps, Flate-afbeeldingsstreams, standaard JPEG-plaatsing, TIFF-import, barcodezware uitvoer, copy/merge/edit-scenario's en door demo's gegenereerde PDF's.

Compression Levels

  • Z_NO_COMPRESSION (0): Geen compressie
  • Z_BEST_SPEED (1): Snelste compressie
  • Z_BEST_COMPRESSION (9): Maximale compressie
  • Z_DEFAULT_COMPRESSION (-1): Standaardbalans tussen snelheid en compressie

Gebruiksvoorbeelden

Basisreekscompressie/-decompressie

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

Streamgebaseerde compressie

 // 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 met parameters

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

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

TPDFFlateParms Structure

  • Predictor: Predictorfunctie (1=geen predictie, 2=TIFF, 10-15=PNG)
  • Colors: Aantal kleurcomponenten
  • BitsPerComponent: 1, 2, 4, 8 of 16 bits per kleurcomponent
  • Columns: Aantal samples per rij
  • ExpandedTo8Bit: Compatibiliteitsveld dat bestaande aanroepers kunnen blijven gebruiken
  • ColorSpace: Compatibiliteitsveld voor de identificator van de bronkleurruimte

Gedeelde predictor-API

Voeg de unit HPDFPredictor toe wanneer predictorreversie nodig is onafhankelijk van Flate- of LZW-decodering

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 geeft EHPDFPredictorError wanneer een rij is afgekapt, een PNG-rijtag buiten 0 tot en met 4 valt, de geometrie overloopt of de uitvoerlimiet wordt overschreden
  • HPDFTryDecodePredictor geeft hetzelfde validatieresultaat terug zonder een exception en levert een foutmelding voor logging
  • TIFF-decodering bewaart ongebruikte paddingbits en past horizontale differentiatie per component toe bij gepakte en 16-bit dieptes
  • PNG-decodering gebruikt de expliciete filtertag aan het begin van elke rij bij Predictor-waarden 10 tot en met 15
  • InflateStrParms past deze gedeelde decoder toe na het lezen van de werkelijke Flate-uitvoer en meldt predictorfouten als EZDecompressionError

Enhanced Features

  • Geheugenbeheer: Geoptimaliseerde allocatie en deallocatie van geheugen
  • Foutafhandeling: Uitgebreide foutcontrole en -rapportage
  • Debugondersteuning: Optionele debuguitvoer voor probleemopsporing
  • Prestatieoptimalisatie: Zeer sterk geoptimaliseerde compressiealgoritmen
  • Streamintegratie: Naadloze integratie met Delphi-streamklassen

Prestatievoordelen

  • Snelle compressie en decompressie
  • Uitstekende compressieverhoudingen voor tekst en eenvoudige graphics
  • Kleine geheugenvoetafdruk tijdens verwerking
  • Geoptimaliseerd voor PDF-contentstreams
  • Minimale CPU-overhead

Standaardconformiteit

  • RFC 1950 (ZLib-formaatspecificatie)
  • RFC 1951 (Deflate-compressiealgoritme)
  • Specificatie van het PDF FlateDecode-filter
  • Ondersteuning voor het PNG-predictoralgoritme
  • Ondersteuning voor het TIFF-predictoralgoritme

Foutcodes en afhandeling

  • Z_OK (0): Succes
  • Z_STREAM_END (1): Einde van de stream bereikt
  • Z_NEED_DICT (2): Woordenboek vereist
  • Z_ERRNO (-1): Bestandsfout
  • Z_STREAM_ERROR (-2): Fout in de streamstatus
  • Z_DATA_ERROR (-3): Fout in de data-integriteit
  • Z_MEM_ERROR (-4): Geheugenallocatiefout
  • Z_BUF_ERROR (-5): Buffergroottefout

Zie ook