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

IHPDFCustomStreamFilter

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;

Související API