Registry voor aangepaste stroomfilters
HotPDF kan door toepassingen gedefinieerde PDF-stroomfilters decoderen binnen dezelfde begrensde pijplijn die wordt gebruikt door de ingebouwde Flate-, LZW-, ASCII85-, ASCIIHex- en RunLength-decoders
Push- of pull-filters registreren
Implementeer IHPDFCustomStreamFilter, kies csfmPush of csfmPull en registreer de interface via THotPDF.RegisterCustomStreamFilter
Namen worden op hoofdletterongevoelige wijze vergeleken zonder een leidende schuine streep, dubbele registratie is expliciet, ingebouwde namen kunnen niet worden vervangen en elk document accepteert maximaal 64 aangepaste namen
Registry-opzoekingen behouden een interfagnesnapshot onder een korte kritieke sectie; filtercallbacks en interfacedestructie draaien buiten het registry-vergrendeling
Eén budget over elke fase
Aangepaste uitvoer verbruikt DecodeBudgetBytes en DocumentDecodeBudgetBytes via de bestaande geaggregeerde tracker, zodat een gemengde aangepaste en ingebouwde keten de expansieboekhouding niet tussen fasen kan resetten
THPDFCustomStreamFilterRequest.MaxOutputBytes rapporteert de resterende per-keten-toeslag, terwijl nul betekent dat het geconfigureerde per-keten-budget onbeperkt is
Het verzoek biedt ook de gedecodeerde PDF-filternaam, de fase-index vanaf nul, de pijplijndiepte, de invoergrootte wanneer beschikbaar en het annuleringstoken van de aanroeper
Annulering en seek-contracten
De annulering-bewuste DecodeLoadedStreamToStream-overload controleert vóór en na aangepaste uitvoering en tijdens pull-stroomoverdracht
Aangepaste implementaties moeten Request.CancellationToken controleren binnen lange push-lussen of blokkerend extern werk
csscSeekable verklaart dat de geleende invoer, pushbestemming of geretourneerde pull-stroom seekend moet ondersteunen; contractovertredingen produceren dpsSeekContractViolation
Foutisolatie
Elke aangepaste fase schrijft naar een begrensde THPDFAdaptiveTempStream vóór eventuele bytes worden gepubliceerd naar de volgende fase of de bestemming van de aanroeper
Een onwaar resultaat, uitzondering, annulering, seek-overtreding of budgetfout verwijdert die tijdelijke uitvoer en retourneert een getypeerde pijplijnstatus zonder een aangepaste uitzondering te lekken over de publieke decodeergrens
Een succesvol pull-filter draagt het eigendom van zijn geretourneerde stroom over aan HotPDF; het retourneren van de geleende invoer of een nil-stroom wordt afgewezen
Telemetrie
GetCustomStreamFilterStatistics rapporteert geregistreerde namen, push- en pull-pogingen, succes, fouten, annulering- en seek-overtredingstellingen, geaggregeerde invoer- en geproduceerde bytes, plus de laatste naam en diagnostiek
THPDFDecodePipelineInfo.CustomFilterCount en CustomFilterFailureCount beschrijven de huidige keten
Voorbeeld
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;