Registro dei Filtri di Flusso Personalizzati
HotPDF può decodificare i filtri di flusso PDF definiti dall'applicazione dentro la stessa pipeline delimitata usata dai decoder integrati Flate, LZW, ASCII85, ASCIIHex e RunLength
Registrare filtri push o pull
Implementare IHPDFCustomStreamFilter, scegliere csfmPush o csfmPull e registrare l'interfaccia tramite THotPDF.RegisterCustomStreamFilter
I nomi vengono confrontati senza distinzione tra maiuscole e minuscole e senza slash iniziale, la registrazione duplicata è esplicita, i nomi integrati non possono essere sostituiti e ogni documento accetta al massimo 64 nomi personalizzati
I lookup del registro conservano uno snapshot dell'interfaccia sotto una breve sezione critica; le callback dei filtri e la distruzione dell'interfaccia vengono eseguite fuori dal blocco del registro
Un budget per ogni fase
L'output personalizzato consuma DecodeBudgetBytes e DocumentDecodeBudgetBytes tramite il tracker aggregato esistente, quindi una catena mista personalizzata e integrata non può azzerare la contabilizzazione dell'espansione tra le fasi
THPDFCustomStreamFilterRequest.MaxOutputBytes riporta l'allocazione residua per catena, mentre zero significa che il budget per catena configurato è illimitato
La richiesta fornisce anche il nome del filtro PDF decodificato, l'indice di fase in base zero, la profondità della pipeline, la dimensione di input quando disponibile e il token di cancellazione del chiamante
Contratti di cancellazione e seek
L'overload DecodeLoadedStreamToStream sensibile alla cancellazione controlla prima e dopo l'esecuzione personalizzata e durante il trasferimento del flusso pull
Le implementazioni personalizzate dovrebbero controllare Request.CancellationToken dentro i lunghi cicli push o il lavoro esterno bloccante
csscSeekable dichiara che l'input preso in prestito, la destinazione push o il flusso pull restituito devono supportare il seek; le violazioni dei contratti producono dpsSeekContractViolation
Isolamento dei fallimenti
Ogni fase personalizzata scrive in un THPDFAdaptiveTempStream delimitato prima che i byte vengano pubblicati alla fase successiva o alla destinazione del chiamante
Un risultato falso, un'eccezione, la cancellazione, una violazione del seek o un fallimento del budget scarta quell'output temporaneo e restituisce uno stato di pipeline tipizzato senza far trapelare un'eccezione personalizzata attraverso il confine pubblico di decodifica
Un filtro pull riuscito trasferisce la proprietà del suo flusso restituito a HotPDF; restituire l'input preso in prestito o un flusso nil viene rifiutato
Telemetria
GetCustomStreamFilterStatistics riporta i nomi registrati, i tentativi push e pull, i conteggi di successo, fallimento, cancellazione e violazione del seek, i byte di input e prodotti aggregati, più il nome più recente e la diagnostica
THPDFDecodePipelineInfo.CustomFilterCount e CustomFilterFailureCount descrivono la catena corrente
Esempio
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;