THotPDF.DecodeLoadedStreamToStream-Methode
Dekodiert einen geladenen PDF-Stream durch seine vollständige Filterkette und schreibt die finale Stufe direkt in einen aufrufereigenen Stream
Deklaration
function DecodeLoadedStreamToStream(AStream: THPDFStreamObject; Output: TStream; out Info: THPDFDecodePipelineInfo): boolean;
Unit
HPDFDoc
Parameter
| Name | Zweck |
|---|---|
AStream | Geladenes THPDFStreamObject, dessen /Filter-Eintrag dekodiert wird |
Output | Zielobjekt des Aufrufers, das dekodierte Bytes an seiner aktuellen Position aufnimmt |
CancellationToken | Optionale kooperative Abbruchsteuerung, geteilt mit eigenen Filterstufen |
Info | Nimmt Eingabe- und Ausgabe-Bytezahlen, Filteranzahl, Tiefe, Status, den fehlgeschlagenen Filter und Diagnosen auf |
Rückgabewert
Gibt nur dann True zurück, wenn jede angeforderte Stufe erfolgreich ist
Verwendungshinweise
- Der finale Filter schreibt in
Output, ohne einen zweiten vollgroßen finalen Speicherstream zu erzeugen - Zwischenstufen nutzen
THPDFAdaptiveTempStreamund spillen nachLoadedStreamMemoryThresholdin eigene temporäre Dateien - Jede Stufe bleibt durch
DecodeBudgetBytesbegrenzt, und jedes dekodierte Byte verbraucht zudemDocumentDecodeBudgetBytes - ASCII85 verlangt einen exakten
~>-Endmarker, ASCIIHex verlangt>; fehlerhafte geladene Pipelines scheitern, statt abgeschnittene Daten zu akzeptieren DecodeFilterLimitweist überdimensionierte Arrays vor der Stufen-Allozierung zurückDecodePipelineDepthLimit, zyklische Erkennung indirekter Verweise und Erkennung von Rekursion im selben Stream begrenzen feindliche Objektgraphen- Die Quellstream-Position wird nach Erfolg oder Fehlschlag wiederhergestellt
- Registrierte
IHPDFCustomStreamFilter-Stufen teilen sich dieselben Gesamt-Budgets und die Pipeline-Tiefe - Eigene Push- und Pull-Ausgabe bleibt in einem adaptiven temporären Stream isoliert, bis diese eigene Stufe erfolgreich ist
- Die Abbruch-Überladung liefert
dpsCancelled, stattEHPDFOperationCancelleddurchzulassen - Ein fehlgeschlagenes Streaming-Ziel kann Bytes enthalten, die vor dem Fehlschlag bereits akzeptiert wurden; verwenden Sie ein temporäres Ziel, wenn atomare Ausgabe gefordert ist
Diagnose
THPDFDecodePipelineInfo = record
Status: THPDFDecodePipelineStatus;
InputBytes: Int64;
OutputBytes: Int64;
FilterCount: Integer;
AppliedFilterCount: Integer;
PipelineDepth: Integer;
StopBeforeLast: Boolean;
FailedFilter: AnsiString;
Diagnostic: AnsiString;
end;
Status unterscheidet ungültige Streams und Filter, Filter-Anzahl- und Tiefenlimits, zyklische Referenzen, rekursive Streams, nicht unterstützte Filter, Budget-Fehlschläge und Decoder-Fehlschläge
Beispiel
Output := TFileStream.Create('payload.bin', fmCreate);
try
if not PDF.DecodeLoadedStreamToStream(StreamObject, Output, Info) then
raise Exception.Create(String(Info.Diagnostic));
finally
Output.Free;
end;