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