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;

Verwandte APIs