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;

APIs relacionadas