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;

API associées