Rejestr niestandardowych filtrów strumieni
HotPDF może dekodować filtry strumieni PDF zdefiniowane przez aplikację wewnątrz tego samego ograniczonego potoku używanego przez jego wbudowane dekodery Flate, LZW, ASCII85, ASCIIHex i RunLength
Rejestruj filtry push lub pull
Zaimplementuj IHPDFCustomStreamFilter, wybierz csfmPush lub csfmPull i zarejestruj interfejs przez THotPDF.RegisterCustomStreamFilter
Nazwy są dopasowywane bez uwzględniania wielkości liter, bez wiodącego ukośnika, duplikowanie rejestracji jest jawne, nazw wbudowanych nie można zastąpić, a każdy dokument przyjmuje co najwyżej 64 niestandardowe nazwy
Zapytania rejestru zachowują migawkę interfejsu pod krótką sekcją krytyczną; wywołania zwrotne filtrów i niszczenie interfejsu działają poza blokadą rejestru
Jeden budżet na każdym etapie
Niestandardowe wyjście zużywa DecodeBudgetBytes i DocumentDecodeBudgetBytes przez istniejący zagregowany tracker, więc mieszany łańcuch niestandardowy i wbudowany nie może zresetować rozliczeń ekspansji między etapami
THPDFCustomStreamFilterRequest.MaxOutputBytes raportuje pozostałe uprawnienie per łańcuch, podczas gdy zero oznacza, że skonfigurowany per łańcuch budżet jest nieograniczony
Żądanie dostarcza również zdekodowaną nazwę filtra PDF, indeks etapu oparty na zerze, głębokość potoku, rozmiar wejścia, gdy dostępny, oraz token anulowania wywołującego
Anulowanie i kontrakty seek
Przeciążenie z możliwością anulowania DecodeLoadedStreamToStream sprawdza przed i po wykonaniu niestandardowym oraz podczas transferu strumienia pull
Implementacje niestandardowe powinny sprawdzać Request.CancellationToken wewnątrz długich pętli push lub blokującej pracy zewnętrznej
csscSeekable deklaruje, że pożyczone wejście, cel push lub zwrócony strumień pull muszą obsługiwać seek; naruszenia kontraktu dają dpsSeekContractViolation
Izolacja awarii
Każdy niestandardowy etap zapisuje do ograniczonego THPDFAdaptiveTempStream, zanim jakiekolwiek bajty zostaną opublikowane na następny etap lub docelowe miejsce wywołującego
Fałszywy wynik, wyjątek, anulowanie, naruszenie seek lub niepowodzenie budżetu odrzuca to tymczasowe wyjście i zwraca typowany status potoku bez przeciekania wyjątku niestandardowego przez publiczną granicę dekodowania
Udany filtr pull przenosi własność swojego zwróconego strumienia do HotPDF; zwrócenie pożyczonego wejścia lub strumienia nil jest odrzucane
Telemetria
GetCustomStreamFilterStatistics raportuje zarejestrowane nazwy, próby push i pull, sukces, awarię, anulowanie, liczniki naruszeń seek, zagregowane bajty wejściowe i wytworzone oraz najnowszą nazwę i diagnostykę
THPDFDecodePipelineInfo.CustomFilterCount i CustomFilterFailureCount opisują bieżący łańcuch
Przykład
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;