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;