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;

API correlate