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;

APIs relacionadas