Registro de filtros de flujo personalizados
HotPDF puede decodificar filtros de flujo PDF definidos por la aplicación dentro del mismo proceso acotado que usan sus decodificadores integrados Flate, LZW, ASCII85, ASCIIHex y RunLength
Registrar filtros de empuje o extracción
Implemente IHPDFCustomStreamFilter, elija csfmPush o csfmPull y registre la interfaz mediante THotPDF.RegisterCustomStreamFilter
Los nombres se comparan 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 en el registro conservan una instantánea de la interfaz bajo una sección crítica breve; las devoluciones de llamada del filtro y la destrucción de la interfaz se ejecutan fuera del bloqueo del registro
Un único presupuesto en cada etapa
La salida personalizada consume DecodeBudgetBytes y DocumentDecodeBudgetBytes mediante el rastreador agregado existente, de modo que una cadena mixta personalizada e integrada no puede restablecer la contabilidad de expansión entre etapas
THPDFCustomStreamFilterRequest.MaxOutputBytes informa del margen restante por cadena, mientras que cero significa que el presupuesto configurado por cadena es ilimitado
La solicitud también suministra el nombre del filtro PDF decodificado, el índice de etapa basado en cero, la profundidad del proceso, el tamaño de entrada cuando está disponible y el token de cancelación del llamador
Contratos de cancelación y búsqueda
La sobrecarga de DecodeLoadedStreamToStream sensible a la cancelación comprueba antes y después de la ejecución personalizada y durante la transferencia del flujo de extracción
Las implementaciones personalizadas deben comprobar Request.CancellationToken dentro de bucles de empuje largos o trabajo externo bloqueante
csscSeekable declara que la entrada prestada, el destino de empuje o el flujo de extracción devuelto deben admitir búsqueda; las violaciones del contrato producen dpsSeekContractViolation
Aislamiento de fallos
Cada etapa personalizada escribe en un THPDFAdaptiveTempStream acotado antes de que se publiquen bytes en la siguiente etapa o en el destino del llamador
Un resultado falso, una excepción, una cancelación, una violación de búsqueda o un fallo de presupuesto descarta esa salida temporal y devuelve un estado de proceso tipado sin filtrar una excepción personalizada a través del límite público de decodificación
Un filtro de extracción correcto transfiere la propiedad de su flujo devuelto a HotPDF; devolver la entrada prestada o un flujo nil se rechaza
Telemetría
GetCustomStreamFilterStatistics informa de los nombres registrados, los intentos de empuje y extracción, el éxito, el fallo, los recuentos de cancelación y violación de búsqueda, los bytes de entrada y producidos agregados, 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;