THotPDF.DecodeLoadedStreamToStream Method
로드된 PDF 스트림을 전체 필터 체인으로 디코딩하고, 최종 단계 출력을 호출자가 소유한 스트림에 바로 기록합니다
선언
function DecodeLoadedStreamToStream(AStream: THPDFStreamObject;
Output: TStream; out Info: THPDFDecodePipelineInfo): Boolean; overload;
function DecodeLoadedStreamToStream(AStream: THPDFStreamObject;
Output: TStream; CancellationToken: THPDFCancellationToken;
out Info: THPDFDecodePipelineInfo): Boolean; overload;
유닛
HPDFDoc
매개변수
| 이름 | 목적 |
|---|---|
AStream | /Filter 항목을 디코딩할 로드된 THPDFStreamObject |
Output | 현재 위치부터 디코딩된 바이트를 받는 호출자 소유 대상 스트림 |
CancellationToken | 사용자 정의 필터 단계와 공유하는 선택적 협조적 취소 |
Info | 입출력 바이트 수, 필터 수, 깊이, status, 실패한 필터, 진단 정보를 받습니다 |
반환 값
요청한 모든 단계가 성공했을 때만 True를 반환합니다
사용 참고 사항
- 마지막 필터는 두 번째 풀 크기 최종 메모리 스트림을 만들지 않고
Output에 기록합니다 - 중간 단계는
THPDFAdaptiveTempStream을 쓰다가LoadedStreamMemoryThreshold를 넘으면 자체 임시 파일로 넘칩니다 - 모든 단계는
DecodeBudgetBytes로 제한되고, 디코딩된 바이트마다DocumentDecodeBudgetBytes도 소비합니다 - ASCII85는 정확한
~>끝 표식을, ASCIIHex는>를 요구합니다. 손상된 로드 파이프라인은 잘린 데이터를 받아들이는 대신 실패합니다 DecodeFilterLimit은 단계를 할당하기 전에 과도하게 큰 배열을 거부합니다DecodePipelineDepthLimit, 순환 간접 참조 탐지, 동일 스트림 재귀 탐지가 악성 객체 그래프를 제한합니다- 성공하든 실패하든 소스 스트림 위치는 복원됩니다
- 등록된
IHPDFCustomStreamFilter단계는 같은 집계 예산과 파이프라인 깊이를 공유합니다 - 사용자 정의 push·pull 출력은 해당 사용자 정의 단계가 성공할 때까지 적응형 임시 스트림에 격리됩니다
- 취소 오버로드는
EHPDFOperationCancelled를 흘려보내는 대신dpsCancelled를 반환합니다 - 스트리밍 대상이 실패하면 실패 전에 이미 받아들인 바이트가 남을 수 있습니다. 원자적 출력이 필요하면 임시 대상을 사용하십시오
Diagnostics
THPDFDecodePipelineInfo = record
Status: THPDFDecodePipelineStatus;
InputBytes: Int64;
OutputBytes: Int64;
FilterCount: Integer;
AppliedFilterCount: Integer;
CustomFilterCount: Integer;
CustomFilterFailureCount: Integer;
PipelineDepth: Integer;
StopBeforeLast: Boolean;
FailedFilter: AnsiString;
Diagnostic: AnsiString;
end;
Status는 잘못된 스트림과 필터, 필터 개수와 깊이 제한, 순환 참조, 재귀 스트림, 지원하지 않는 필터, 예산 초과, 디코더 실패, 사용자 정의 실패, 취소, seek 계약 위반을 구분합니다
Example
Output := TFileStream.Create('payload.bin', fmCreate);
try
if not PDF.DecodeLoadedStreamToStream(StreamObject, Output, Info) then
raise Exception.Create(String(Info.Diagnostic));
finally
Output.Free;
end;