Registr vlastních filtrů streamů
Registr přiřazuje názvy filtrů načtených PDF k dekodérům dodaným aplikací
Registrace
Filtry se registrují podle názvu a deklarují režim push nebo pull, smlouvu o vyhledávání vstupu a výstupu a omezení dekódování; k registraci implementujte rozhraní IHPDFCustomStreamFilter, zvolte csfmPush nebo csfmPull a rozhraní zaregistrujte přes THotPDF.RegisterCustomStreamFilter
Registr nevykonává zpětná volání pod svým zámkem a chrání čtení i změny před souběžným přístupem
Chyby
Výjimky a vyčerpání rozpočtu se převedou na definované stavy dekódování bez zveřejnění částečného výsledku. Vlastní i vestavěné stupně sdílejí limity DecodeBudgetBytes a DocumentDecodeBudgetBytes přes stávající agregovaný sledovač, takže smíšený řetěz nemůže mezi stupni vynulovat účtování expanze
Samostatný strop pro vlastní stupeň přitom nastavuje THPDFCustomStreamFilterRequest.MaxOutputBytes
Zrušení a smlouva o vyhledávání
Přeplněný DecodeLoadedStreamToStream s podporou zrušení kontroluje zrušení před i po spuštění vlastního stupně a během přenosu pull streamu
Vlastní implementace by měly kontrolovat Request.CancellationToken uvnitř dlouhých push smyček nebo blokující externí práce
csscSeekable deklaruje, že vypůjčený vstup, push cíl ani vrácený pull stream musí podporovat přesun pozice; porušení smlouvy se projeví jako dpsSeekContractViolation
Izolace chyb
Každý vlastní stupeň zapisuje do omezeného THPDFAdaptiveTempStream dřív, než se jakékoliv bajty zveřejní dalšímu stupni nebo cíli volajícího
Nepravdivý výsledek, výjimka, zrušení, porušení vyhledávání ani vyčerpání rozpočtu zahodí ten dočasný výstup a vrátí typovaný stav pipeline, aniž by se vlastní výjimka dostala přes veřejnou hranici dekódování
Úspěšný pull filtr předává vlastnictví vráceného streamu na HotPDF; vrácení vypůjčeného vstupu nebo streamu nil se odmítne
Telemetrie
GetCustomStreamFilterStatistics uvádí registrované názvy, pokusy push a pull, úspěchy, selhání, počty zrušení a porušení vyhledávání, souhrnné vstupní i vyprodukované bajty a poslední název s diagnostikou
THPDFDecodePipelineInfo.CustomFilterCount a CustomFilterFailureCount popisují aktuální řetěz
Příklad
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;