Registro de filtros de stream personalizados

O HotPDF pode decodificar filtros de stream PDF definidos pelo aplicativo dentro do mesmo pipeline limitado usado por seus decodificadores internos Flate, LZW, ASCII85, ASCIIHex e RunLength

Registrar filtros push ou pull

Implemente IHPDFCustomStreamFilter, escolha csfmPush ou csfmPull e registre a interface por meio de THotPDF.RegisterCustomStreamFilter

Nomes são correspondidos sem diferenciação de maiúsculas e minúsculas sem uma barra inicial, o registro duplicado é explícito, nomes internos não podem ser substituídos e cada documento aceita no máximo 64 nomes personalizados

Consultas de registro retêm um instantâneo de interface sob uma seção crítica curta; callbacks de filtro e destruição de interface são executados fora do bloqueio do registro

Um orçamento em cada estágio

A saída personalizada consome DecodeBudgetBytes e DocumentDecodeBudgetBytes por meio do rastreador agregado existente, de modo que uma cadeia mista personalizada e interna não pode redefinir a contabilidade de expansão entre estágios

THPDFCustomStreamFilterRequest.MaxOutputBytes relata a permissão restante por cadeia, enquanto zero significa que o orçamento configurado por cadeia é ilimitado

A solicitação também fornece o nome de filtro PDF decodificado, o índice de estágio baseado em zero, a profundidade do pipeline, o tamanho de entrada quando disponível e o token de cancelamento do chamador

Contratos de cancelamento e busca

A sobrecarga de DecodeLoadedStreamToStream com reconhecimento de cancelamento verifica antes e depois da execução personalizada e durante a transferência do stream pull

Implementações personalizadas devem verificar Request.CancellationToken dentro de laços push longos ou trabalho externo bloqueante

csscSeekable declara que a entrada emprestada, o destino push ou o stream pull retornado devem suportar busca; violações de contrato produzem dpsSeekContractViolation

Isolamento de falha

Cada estágio personalizado grava em um THPDFAdaptiveTempStream limitado antes que qualquer byte seja publicado para o próximo estágio ou destino do chamador

Um resultado falso, exceção, cancelamento, violação de busca ou falha de orçamento descarta essa saída temporária e retorna um status de pipeline tipado sem vazar uma exceção personalizada pelo limite público de decodificação

Um filtro pull bem-sucedido transfere a propriedade de seu stream retornado para o HotPDF; retornar a entrada emprestada ou um stream nil é rejeitado

Telemetria

GetCustomStreamFilterStatistics relata nomes registrados, tentativas push e pull, sucesso, falha, cancelamento e contagens de violação de busca, bytes agregados de entrada e produzidos, além do nome e diagnóstico mais recentes

THPDFDecodePipelineInfo.CustomFilterCount e CustomFilterFailureCount descrevem a cadeia atual

Exemplo

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;

APIs relacionadas