type TPdfProgressiveDocument = class(TPdf) ... end;
| Method | Description |
|---|---|
Create | สร้างคอมโพเนนต์เอกสารพร้อม scheduler ขอ range request ที่ตนเป็นเจ้าของ |
Destroy | ยกเลิกสถานะ progressive ก่อนคืนทรัพยากรเอกสารที่สืบทอดมา |
BeginProgressiveLoad(AStream, AFileSize, AOwnsStream, AInitialAvailableByteCount) | สร้าง availability provider ดั้งเถิม โดยแยกขนาดตรรกะสุดท้ายออกจากไบต์ที่มีอยู่จริง ณ ขณะนั้น |
CheckDocumentAvailability | คืน pdaAvailable, pdaNotAvailable หรือ pdaError พร้อมคืนช่วงไบต์ที่รวมกันแล้วซึ่ง PDFium ร้องขอ |
OpenProgressiveDocument | เปิด PDF แบบ linearized ผ่าน FPDFAvail_GetDocument หรือเปิด PDF แบบไม่ linearized ที่รับมาครบแล้วผ่าน FPDF_LoadCustomDocument |
CheckFormAvailability | กั้นการเตรียมฟอร์มให้ทำได้เมื่อข้อมูลฟอร์มดั้งเถิมพร้อมใช้แล้วเท่านั้น |
LoadAvailablePage | กั้นและโหลดหน้าแบบนับจาก 1 หนึ่งหน้า หลังสถานะความพร้อมของฟอร์มไปถึงจุดสุดทาง |
CancelProgressiveLoad | ปิดหน้า ฟอร์ม เอกสาร availability handle, callback และ stream adapter ตามลำดับการพึ่งพิง |
| Member | Type | Description |
|---|---|---|
ProgressiveLoading | Boolean | เป็น True ขณะ session availability ดั้งเถิมยังมีชีวิตอยู่ |
LogicalFileSize | UInt64 | ความยาวเนื้อหาสุดท้ายที่เซิร์ฟเวอร์หรือคอนเทนเนอร์แจ้งมา |
AvailableByteCount | UInt64 | ความยาวแบบ monotonic ของ prefix ต่อเนื่องที่อ่านได้จาก stream แล้ว |
Linearization | TPdfLinearization | ผลตัดสิน linearization ดั้งเถิม เมื่อไบต์ส่วนหัวมีมากพอแล้ว |
FirstAvailablePageNumber | Integer | หน้าแรกแบบนับจาก 1 หลัง handle เอกสารถูกเปิด |
OnDataAvailable | TPdfDataAvailableEvent | แทนที่การทดสอบ prefix สำหรับที่เก็บช่วงแบบ sparse หรือเก็บสับลำดับ (out-of-order) |
RangeRequests | TPdfRangeRequestScheduler | scheduler ที่ตนเป็นเจ้าของ ซึ่งถูกป้อนจาก hint การดาวน์โหลดระดับเอกสาร ฟอร์ม และหน้า ทุกชุดที่ดั้งเถิมแจ้งมา |
TPdfProgressiveDocument เป็นเจ้าของ handle FPDF_AVAIL ดั้งเถิมและเรกคอร์ด callback ที่ PDFium อาจกลับมาใช้ซ้ำตลอดช่วงการโหลดจากระยะไกลหรือจาก stream ที่กำลังโต
เริ่มจากความยาวเนื้อหาของเซิร์ฟเวอร์และ prefix เริ่มต้นถ้ามี เรียกเมธอดตรวจความพร้อมที่เกี่ยวข้อง ดึงงานออกจาก RangeRequests เขียนคำตอบแต่ละชุดลงที่เก็บแบบ random access ที่รองอยู่ เรียก CompleteRequest แล้วทำซ้ำจนได้รับสถานะความพร้อมแบบสุดทาง
สำหรับการดาวน์โหลดต่อเนื่อง ให้เดิน AvailableByteCount ไปข้างหน้าหลังเขียนไบต์ใหม่ ส่วนแคชช่วงแบบ sparse ให้กำหนด OnDataAvailable แล้วตอบว่าออฟเซตกับขนาดที่ร้องขอแต่ละชุดอ่านได้หรือไม่
scheduler รับ hint ดั้งเถิมชุดเดียวกับที่คืนผ่านเอาต์พุต DownloadHints รุ่นเดิม ตัดช่วงที่รู้แล้วผ่าน prefix หรือ callback แบบ sparse ออก preempt การถ่ายโอนพื้นหลังที่ทับซ้อนกันเพื่อไบต์วิกฤตของหน้าโดยไม่ลากหางติดกันมาด้วย และแบ่งงานขนส่งที่ MaxRequestSize
PDF แบบ linearized เปิด metadata ของเอกสารและหน้าแรกได้ก่อนไฟล์ทั้งไฟล์จะมาถึง ส่วน PDF แบบไม่ linearized ต้องมีไฟล์ครบ และจะใช้ loader custom-stream ดั้งเถิมปกติโดยอัตโนมัติ
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 ปัจจุบันของ PDFium จำกัดขนาดไฟล์ตรรกะไว้ที่ 4 GiB และคลาสจะ raise แทนการตัดทอนขนาดที่ใหญ่กว่าAvailableByteCount ลดลงไม่ได้ เพราะสถานะ parse ดั้งเถิมสมมติว่าไบต์ที่ดาวน์โหลดแล้วยังพร้อมใช้อยู่ตลอดEnableV8Engine ก่อน BeginProgressiveLoad ถ้าอาจต้องใช้การสนับสนุน XFA และ V8CancelProgressiveLoad หรือการทำลายจะจบCompleteRequest การแจ้งว่าเสร็จจะทำให้ช่วงนั้นมองเห็นต่อ PDFium ทันทีTStream.Position ที่ใช้ร่วมกันปลอดภัย ให้ใช้ I/O แบบระบุตำแหน่งหรือ lock stream ภายนอกแทนRangeRequests.OnCancelRequest เพื่อยกเลิกการถ่ายโอนที่กำลังทำงาน เมื่อ session ถูกยกเลิก เมื่อ hint ที่ลำดับความสำคัญสูงกว่าทับซ้อนกับมัน หรือเมื่อความครอบคลุมแบบ sparse จากภายนอกทำให้มันไม่จำเป็นTPdfDataAvailability,
TPdfDownloadRange,
TPdfDownloadRanges,
TPdfRangeRequest,
TPdfRangeRequestPriority,
TPdfRangeRequestStatistics,
TPdfRangeRequestScheduler,
TPdfDataAvailableEvent,
TPdfLinearization,
TPdfFormAvailability