Custom Stream Filter Registry
HotPDF peut décoder des filtres de flux PDF définis par l'application dans le même pipeline borné utilisé par ses décodeurs Flate, LZW, ASCII85, ASCIIHex et RunLength intégrés
Enregistrer des filtres push ou pull
Implémentez IHPDFCustomStreamFilter, choisissez csfmPush ou csfmPull, et enregistrez l'interface via THotPDF.RegisterCustomStreamFilter
Les noms sont comparés sans tenir compte de la casse et sans barre oblique initiale, la double inscription est explicite, les noms intégrés ne peuvent pas être remplacés, et chaque document accepte au plus 64 noms personnalisés
Les recherches du registre conservent un instantané de l'interface sous une courte section critique ; les rappels de filtre et la destruction de l'interface s'exécutent hors du verrou du registre
Un seul budget pour chaque étape
La sortie personnalisée consomme DecodeBudgetBytes et DocumentDecodeBudgetBytes via le suivi agrégé existant, de sorte qu'une chaîne mixte personnalisée et intégrée ne peut pas réinitialiser la comptabilité d'expansion entre les étapes
THPDFCustomStreamFilterRequest.MaxOutputBytes indique l'allocation restante par chaîne, tandis que zéro signifie que le budget par chaîne configuré est illimité
La requête fournit également le nom de filtre PDF décodé, l'index d'étape à base zéro, la profondeur du pipeline, la taille d'entrée lorsqu'elle est disponible, et le jeton d'annulation de l'appelant
Contrats d'annulation et de recherche
La surcharge DecodeLoadedStreamToStream consciente du contexte d'annulation vérifie avant et après l'exécution personnalisée et pendant le transfert par flux pull
Les implémentations personnalisées doivent vérifier Request.CancellationToken dans les longues boucles push ou lors d'un travail externe bloquant
csscSeekable déclare que l'entrée empruntée, la destination push ou le flux pull renvoyé doit prendre en charge la recherche ; les violations de contrat produisent dpsSeekContractViolation
Isolation des échecs
Chaque étape personnalisée écrit dans un THPDFAdaptiveTempStream borné avant que des octets soient publiés vers l'étape suivante ou la destination de l'appelant
Un résultat faux, une exception, une annulation, une violation de recherche ou un dépassement de budget écarte cette sortie temporaire et renvoie un statut de pipeline typé sans divulguer d'exception personnalisée au-delà de la frontière de décodage publique
Un filtre pull réussi transfère la propriété de son flux renvoyé à HotPDF ; renvoyer l'entrée empruntée ou un flux nul est rejeté
Télémétrie
GetCustomStreamFilterStatistics rapporte les noms enregistrés, les tentatives push et pull, les succès, les échecs, les compteurs d'annulation et de violation de recherche, les octets d'entrée et produits agrégés, plus le dernier nom et diagnostic
THPDFDecodePipelineInfo.CustomFilterCount et CustomFilterFailureCount décrivent la chaîne courante
Exemple
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;