Registrierung benutzerdefinierter Streamfilter
HotPDF kann anwendungsdefinierte PDF-Streamfilter innerhalb derselben begrenzten Pipeline dekodieren, die auch die eingebauten Flate-, LZW-, ASCII85-, ASCIIHex- und RunLength-Dekoder verwenden
Push- oder Pull-Filter registrieren
Implementieren Sie IHPDFCustomStreamFilter, wählen Sie csfmPush oder csfmPull und registrieren Sie die Schnittstelle über THotPDF.RegisterCustomStreamFilter
Namen werden ohne führenden Schrägstrich unabhängig von Groß- und Kleinschreibung abgeglichen, doppelte Registrierung ist explizit, eingebaute Namen können nicht ersetzt werden und jedes Dokument akzeptiert höchstens 64 eigene Namen
Registry-Lookups halten einen Schnittstellenschnappschuss unter einem kurzen kritischen Abschnitt; Filter-Callbacks und die Zerstörung der Schnittstelle laufen außerhalb der Registry-Sperre
Ein Budget für jede Phase
Eigene Ausgabe verbraucht DecodeBudgetBytes und DocumentDecodeBudgetBytes über den vorhandenen aggregierten Tracker, sodass eine gemischte Kette aus eigenen und eingebauten Filtern die Ausdehnungsabrechnung nicht zwischen Phasen zurücksetzen kann
THPDFCustomStreamFilterRequest.MaxOutputBytes meldet die verbleibende Zulage pro Kette, während null bedeutet, dass das konfigurierte Budget pro Kette unbegrenzt ist
Die Anfrage liefert außerdem den dekodierten PDF-Filternamen, den nullbasierten Phasenindex, die Pipelinetiefe, die Eingabegröße soweit verfügbar und das Abbruchtoken des Aufrufers
Abbruch- und Seek-Verträge
Die abbruchfähige Überladung von DecodeLoadedStreamToStream prüft vor und nach eigener Ausführung sowie während der Übertragung eines Pull-Streams
Eigene Implementierungen sollten Request.CancellationToken innerhalb langer Push-Schleifen oder blockierender externer Arbeit prüfen
csscSeekable erklärt, dass die geliehene Eingabe, das Push-Ziel oder der zurückgegebene Pull-Stream Seek unterstützen müssen; Vertragsverletzungen erzeugen dpsSeekContractViolation
Fehlerisolierung
Jede eigene Phase schreibt in einen begrenzten THPDFAdaptiveTempStream, bevor Bytes für die nächste Phase oder das Ziel des Aufrufers veröffentlicht werden
Ein false-Ergebnis, eine Ausnahme, ein Abbruch, eine Seek-Verletzung oder ein Budgetfehler verwirft diese temporäre Ausgabe und liefert einen typisierten Pipeline-Status, ohne eine eigene Ausnahme über die öffentliche Dekodiergrenze dringen zu lassen
Ein erfolgreicher Pull-Filter überträgt HotPDF das Eigentum am zurückgegebenen Stream; die Rückgabe der geliehenen Eingabe oder eines nil-Streams wird abgelehnt
Telemetrie
GetCustomStreamFilterStatistics meldet registrierte Namen, Push- und Pull-Versuche, Erfolg, Fehler, Abbruch- und Seek-Verletzungszahlen, aggregierte Eingabe- und erzeugte Bytes sowie den letzten Namen und die Diagnose
THPDFDecodePipelineInfo.CustomFilterCount und CustomFilterFailureCount beschreiben die aktuelle Kette
Beispiel
Filter := TApplicationFilter.Create;
PDF.RegisterCustomStreamFilter(Filter);
try
if not PDF.DecodeLoadedStreamToStream(StreamObject, Output,
CancellationToken, Info) then
HandleDecodeFailure(Info.Status, Info.Diagnostic);
finally
PDF.UnregisterCustomStreamFilter(Filter.FilterName);
end;