사용자 정의 스트림 필터 레지스트리

HotPDF는 내장 Flate, LZW, ASCII85, ASCIIHex, RunLength 디코더가 사용하는 것과 같은 제한된 파이프라인 안에서 응용 프로그램 정의 PDF 스트림 필터를 디코딩할 수 있습니다

push 또는 pull 필터 등록

IHPDFCustomStreamFilter를 구현하고 csfmPush 또는 csfmPull을 선택한 다음 THotPDF.RegisterCustomStreamFilter를 통해 인터페이스를 등록하십시오

이름은 앞에 슬래시 없이 대소문자 무시로 일치하고, 중복 등록은 명시적이며, 내장 이름은 교체할 수 없고, 각 문서는 최대 64개의 사용자 정의 이름을 허용합니다

레지스트리 조회는 짧은 임계 구역 아래에서 인터페이스 스냅샷을 보유합니다. 필터 콜백과 인터페이스 파괴는 레지스트리 잠금 외부에서 실행됩니다

모든 단계에 걸친 단일 예산

사용자 정의 출력은 기존 집계 트래커를 통해 DecodeBudgetBytes와 DocumentDecodeBudgetBytes를 소비하므로, 혼합 사용자 정의 및 내장 체인은 단계 사이 확장 회계를 재설정할 수 없습니다

THPDFCustomStreamFilterRequest.MaxOutputBytes는 체인당 남은 허용량을 보고하며, 0은 구성된 체인당 예산이 무제한임을 의미합니다

요청은 디코딩된 PDF 필터 이름, zero-based 단계 인덱스, 파이프라인 깊이, 사용 가능한 입력 크기, 호출자 취소 토큰도 제공합니다

취소 및 seek 계약

취소 인식 DecodeLoadedStreamToStream 오버로드는 사용자 정의 실행 전후와 pull 스트림 전송 중에 확인합니다

사용자 정의 구현은 긴 push 루프나 차단 외부 작업 내부에서 Request.CancellationToken을 확인해야 합니다

csscSeekable은 차용 입력, push 대상 또는 반환된 pull 스트림이 seek을 지원해야 한다고 선언하며, 계약 위반은 dpsSeekContractViolation을 생성합니다

실패 격리

모든 사용자 정의 단계는 바이트가 다음 단계나 호출자 대상에 게시되기 전에 제한된 THPDFAdaptiveTempStream에 기록합니다

거짓 결과, 예외, 취소, seek 위반 또는 예산 실패는 해당 임시 출력을 폐기하고 공개 디코드 경계를 넘어 사용자 정의 예외를 누출하지 않고 형식화된 파이프라인 상태를 반환합니다

성공적인 pull 필터는 반환된 스트림의 소유권을 HotPDF로 전송합니다. 차용 입력이나 nil 스트림을 반환하는 것은 거부됩니다

텔레메트리

GetCustomStreamFilterStatistics는 등록된 이름, push 및 pull 시도, 성공, 실패, 취소 및 seek 위반 횟수, 집계 입력 및 생성 바이트, 최신 이름과 진단을 보고합니다

THPDFDecodePipelineInfo.CustomFilterCount와 CustomFilterFailureCount는 현재 체인을 설명합니다

예제

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;

관련 API