type TPdfProgressiveDocument = class(TPdf) ... end;
| Method | Description |
|---|---|
Create | 문서 컴포넌트와 소유한 range-request 스케줄러를 만듭니다 |
Destroy | 상속된 문서 리소스를 해제하기 전에 progressive 상태를 취소합니다 |
BeginProgressiveLoad(AStream, AFileSize, AOwnsStream, AInitialAvailableByteCount) | 논리적 최종 크기와 현재 저장된 바이트를 분리해 둔 채 네이티브 가용성 공급자를 만듭니다 |
CheckDocumentAvailability | pdaAvailable, pdaNotAvailable, pdaError를 반환하고 PDFium이 요청한 병합된 바이트 범위를 돌려줍니다 |
OpenProgressiveDocument | linearized PDF는 FPDFAvail_GetDocument로, 완전히 수신된 non-linearized PDF는 FPDF_LoadCustomDocument로 엽니다 |
CheckFormAvailability | 네이티브 폼 데이터를 사용할 수 있게 될 때까지 폼 채우기 초기화를 막습니다 |
LoadAvailablePage | 폼 가용성이 최종 상태에 도달한 뒤 1 기반 페이지 하나를 게이트하고 로드합니다 |
CancelProgressiveLoad | 페이지, 폼, 문서, 가용성 핸들, 콜백, 스트림 어댑터를 의존 순서대로 닫습니다 |
| Member | Type | Description |
|---|---|---|
ProgressiveLoading | Boolean | 네이티브 가용성 세션이 살아 있는 동안 True |
LogicalFileSize | UInt64 | 서버나 컨테이너가 제공하는 최종 콘텐츠 길이 |
AvailableByteCount | UInt64 | 스트림에서 이미 읽을 수 있는 연속 접두부의 단조 증가 길이 |
Linearization | TPdfLinearization | 헤더 바이트가 충분해지면 나오는 네이티브 linearization 판정 |
FirstAvailablePageNumber | Integer | 문서 핸들이 열린 뒤의 첫 1 기반 페이지 |
OnDataAvailable | TPdfDataAvailableEvent | 스파스 또는 순서가 뒤섞인 범위 저장소를 위한 접두부 검사 재정의 |
RangeRequests | TPdfRangeRequestScheduler | 모든 네이티브 문서, 폼, 페이지 다운로드 힌트로 채워지는 소유 스케줄러 |
TPdfProgressiveDocument는 원격 또는 성장하는 스트림 로드 내내 PDFium이 다시 방문할 수 있는 네이티브 FPDF_AVAIL 핸들과 콜백 레코드를 소유합니다
서버 콘텐츠 길이와 초기 접두부로 시작하고, 해당 가용성 메서드를 호출하고, RangeRequests에서 작업을 꺼내고, 각 응답을 기반 랜덤 액세스 저장소에 쓰고, CompleteRequest를 호출하는 과정을 최종 가용성 상태가 반환될 때까지 반복합니다
연속 다운로드에서는 새 바이트를 쓴 뒤 AvailableByteCount를 앞당기고, 스파스 범위 캐시에서는 OnDataAvailable을 할당해 요청된 각 오프셋과 크기가 읽을 수 있는지 답합니다
스케줄러는 레거시 DownloadHints 출력으로 돌아오는 동일한 네이티브 힌트를 받아들이고, 접두부나 스파스 콜백으로 이미 알려진 범위를 제거하고, 인접한 꼬리를 승격시키지 않으면서 페이지에 중요한 바이트를 위해 겹치는 백그라운드 전송을 선점하고, 전송 작업을 MaxRequestSize에서 나눕니다
linearized PDF는 파일 전체가 도착하기 전에 문서 메타데이터와 첫 페이지를 열 수 있고, non-linearized PDF는 완전한 파일을 요구하며 자동으로 평소의 네이티브 커스텀 스트림 로더를 사용합니다
var
Hints: TPdfDownloadRanges;
Request: TPdfRangeRequest;
State: TPdfDataAvailability;
begin
Progressive.BeginProgressiveLoad(CacheStream, ContentLength,
False, InitialPrefixLength);
repeat
State := Progressive.CheckDocumentAvailability(Hints);
while Progressive.RangeRequests.TryDequeue(Request) do
begin
FetchRangeIntoCache(Request.Offset, Request.Size);
Progressive.RangeRequests.CompleteRequest(Request);
end;
until State <> pdaNotAvailable;
if State = pdaAvailable then
Progressive.OpenProgressiveDocument;
end;
FPDF_FILEACCESS ABI는 논리적 파일 크기를 4 GiB로 제한하며, 클래스는 더 큰 크기를 잘라내는 대신 예외를 발생시킵니다AvailableByteCount는 줄어들 수 없습니다BeginProgressiveLoad 전에 EnableV8Engine을 설정하세요CancelProgressiveLoad나 소멸이 끝날 때까지 스트림과 모든 스파스 범위를 읽을 수 있게 유지하세요CompleteRequest를 호출하기 전에 응답 바이트를 기반 저장소에 쓰세요. 완료 시 해당 범위가 PDFium에 즉시 보입니다TStream.Position을 안전하게 만들지는 않습니다. 위치 지정 I/O나 외부 스트림 락을 사용하세요RangeRequests.OnCancelRequest를 할당하세요TPdfDataAvailability,
TPdfDownloadRange,
TPdfDownloadRanges,
TPdfRangeRequest,
TPdfRangeRequestPriority,
TPdfRangeRequestStatistics,
TPdfRangeRequestScheduler,
TPdfDataAvailableEvent,
TPdfLinearization,
TPdfFormAvailability