Registro de stream filters personalizados
HotPDF puede decodificar stream filters PDF definidos por la aplicación dentro del mismo pipeline acotado que usan sus decodificadores integrados Flate, LZW, ASCII85, ASCIIHex y RunLength
Registro de filtros push o pull
Implemente IHPDFCustomStreamFilter, elija csfmPush o csfmPull y registre la interfaz mediante THotPDF.RegisterCustomStreamFilter
Los nombres se emparejan sin distinguir mayúsculas y sin barra inicial, el registro duplicado es explícito, los nombres integrados no se pueden reemplazar y cada documento acepta como máximo 64 nombres personalizados
Las búsquedas del registry retienen un snapshot de la interfaz bajo una sección crítica corta; los callbacks del filtro y la destrucción de la interfaz corren fuera del lock del registry
Un presupuesto para todas las etapas
La salida personalizada consume DecodeBudgetBytes y DocumentDecodeBudgetBytes a través del tracker agregado existente, de modo que una cadena mixta de filtros personalizados e integrados no puede reiniciar la contabilidad de expansión entre etapas
THPDFCustomStreamFilterRequest.MaxOutputBytes reporta la asignación restante por cadena, mientras que cero significa que el presupuesto por cadena configurado es ilimitado
La solicitud también aporta el nombre del filtro PDF decodificado, el índice de etapa de base cero, la profundidad del pipeline, el tamaño de entrada cuando está disponible y el cancellation token del caller
Contratos de cancelación y seek
El overload de DecodeLoadedStreamToStream consciente de la cancelación comprueba antes y después de la ejecución personalizada y durante la transferencia del pull stream
Las implementaciones personalizadas deberían comprobar Request.CancellationToken dentro de loops push largos o de trabajo externo bloqueante
csscSeekable declara que la entrada prestada, el destino push o el pull stream devuelto deben soportar seek; las violaciones del contrato producen dpsSeekContractViolation
Aislamiento de fallos
Cada etapa personalizada escribe en un THPDFAdaptiveTempStream acotado antes de publicar cualquier byte a la siguiente etapa o al destino del caller
Un resultado falso, una excepción, una cancelación, una violación de seek o un fallo de presupuesto descartan esa salida temporal y devuelven un estado de pipeline tipado, sin filtrar una excepción personalizada a través de la frontera pública de decodificación
Un pull filter exitoso transfiere la propiedad de su stream devuelto a HotPDF; devolver la entrada prestada o un stream nil se rechaza
Telemetría
GetCustomStreamFilterStatistics reporta los nombres registrados, los intentos push y pull, los conteos de éxito, fallo, cancelación y violación de seek, los bytes agregados de entrada y producidos, además del último nombre y diagnóstico
THPDFDecodePipelineInfo.CustomFilterCount y CustomFilterFailureCount describen la cadena actual
Ejemplo
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;